主頁 > 軟體設計 > Nginx做HTTP代理和郵件服務器代理

Nginx做HTTP代理和郵件服務器代理

2021-10-10 07:53:57 軟體設計

一、背景

最近公司在做網路安全整改,對大資料環境的網路安全要求更高,要求所有的大資料環境的機器不能訪問外網,但是可以訪問公司的非大資料環境的其他服務器,我們組有四臺單獨的機器在大資料環境中,相關的python腳本都部署在這4臺機器上,這些python腳本都是做大資料相關分析的,同時很多都有訪問外網的需求,比如訪問天氣api查詢歷史天氣、訪問百度距離api查詢、根據統計資料定時發郵件等,這些都是訪問外網的,

image-20211009151815732

大資料環境的機器不能訪問外網,但是可以訪問公司非大資料環境的機器,非大資料環境的機器可以訪問外網,在考慮整改帶來的代碼入侵性和公司網路現狀的情況下,準備申請一臺在公司非大資料環境的機器做外網出口的正向代理,將所有的外網訪問地址統一轉到這臺機器上,然后由這一臺機器統一訪問外網;這樣及可以滿足安全需求,也可以較少的修改代碼,只需要替換現有外網地址對應的ip和埠即可,

二、整改程序

2.1.現狀分析

統計現在四臺機器的外網訪問情況,發現主要有外網訪問:一是呼叫外部的天氣API和百度距離API,另一種是定時發郵件到相關同事的郵箱中;所以需要做兩類代理:http代理、郵件服務器代理,

2.2.申請機器,搭建Nginx

需要申請一臺不在大資料環境但是在公司網路環境的機器,并且大資料機器可以訪問這臺機器,同時這臺機器可以訪問外網,(目前申請一臺機器,未考慮高可用),

申請的機器地址:101.147.192.179, 作用:安裝nginx,做為代理,后續不管是訪問http外部介面還是發郵件,都使用這個ip,

公司真實的郵件服務器地址:mail.xxxxxx.cn

搭建nginx:

[ops@dis-algo data]$ 
[ops@dis-algo data]$ mkdir nginx
[ops@dis-algo data]$ 
[ops@dis-algo data]$ cd nginx/
[ops@dis-algo nginx]$ 
# 下載nginx
[ops@dis-algo nginx]$ wget http://nginx.org/download/nginx-1.20.1.tar.gz
[ops@dis-algo nginx]$ ls
nginx-1.20.1.tar.gz
[ops@dis-algo nginx]$ 
# 解壓
[ops@dis-algo nginx]$ tar -zxvf nginx-1.20.1.tar.gz 
[ops@dis-algo nginx]$ ll
total 1040
drwxr-xr-x 8 ops ops     158 May 25 20:35 nginx-1.20.1
-rw-rw-r-- 1 ops ops 1061461 May 25 23:34 nginx-1.20.1.tar.gz
[ops@dis-algo nginx]$ 
[ops@dis-algo nginx]$ cd nginx-1.20.1/
[ops@dis-algo nginx-1.20.1]$ ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
# 配置,由于是使用stream方式代理郵件服務器,所以需要--with-stream模塊,不要--with-mail模塊
# 同時需要http代理相關的模塊
# 安裝的路徑在當前目錄的上一級 --prefix=..   直接在當前目錄安裝由于檔案沖突會報錯
[ops@dis-algo nginx-1.20.1]$ ./configure --prefix=.. --with-http_stub_status_module --with-http_ssl_module   --with-stream 
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
# 編譯、安裝
[ops@dis-algo nginx-1.20.1]$ make
[ops@dis-algo nginx-1.20.1]$ make install 
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
[ops@dis-algo nginx-1.20.1]$ 
# 回到上一級的安裝目錄
[ops@dis-algo nginx-1.20.1]$ cd ..
[ops@dis-algo nginx]$ ls
conf  html  logs  nginx-1.20.1  nginx-1.20.1.tar.gz  sbin
[ops@dis-algo nginx]$ 
[ops@dis-algo nginx]$ 

2.3.配置http代理和郵件代理

(base) [ops@dis-algo85 nginx]$ 
(base) [ops@dis-algo85 nginx]$ cd conf/
# 找到組態檔 nginx.conf 
(base) [ops@dis-algo85 conf]$ ls
fastcgi.conf          fastcgi_params          koi-utf  mime.types          nginx.conf          scgi_params          uwsgi_params          win-utf
fastcgi.conf.default  fastcgi_params.default  koi-win  mime.types.default  nginx.conf.default  scgi_params.default  uwsgi_params.default
(base) [ops@dis-algo85 conf]$  
(base) [ops@dis-algo85 conf]$ 
# 根據具體情況修改組態檔 完成http代理和郵件代理的配置
(base) [ops@dis-algo85 conf]$ vim nginx.conf
(base) [ops@dis-algo85 conf]$ 
(base) [ops@dis-algo85 conf]$ cat nginx.conf
worker_processes  8;
error_log  /data/nginx/logs/error.log;
pid        /data/nginx/logs/nginx.pid;

events {
    worker_connections  1024;
}

# http代理
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;


    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /data/nginx/logs/access.log  main;

    # DNS服務器
    resolver 8.8.8.8;

    server {
        # 后續外部http請求都使用101.147.192.179:18080訪問
        server_name  101.147.192.179;
        listen       18080; 
        keepalive_requests 120;

        # 對每個http介面做代理
        location ^~ /caiyunapp/ {
           proxy_pass  https://api.caiyunapp.com/;
        }

		# get傳參使用$request_uri
        location = /routematrix/v2/riding {
           proxy_pass  http://api.map.baidu.com$request_uri;
        }

        location ^~ /tianqihoubao {
           proxy_pass  http://www.tianqihoubao.com/;
        }

        location ^~ /weather {
           proxy_pass  http://www.weather.com.cn/;
        }
    }
}

# 郵件服務器代理 需要使用--with-stream模塊
stream {
    server {
       listen       25; # 這里必須使用25 其他的埠號我沒有測通;使用25埠要求啟動使用root權限
       proxy_pass mail.xxxxxx.cn:25;   # 原來的公司郵件服務器 
    }
}

(base) [ops@dis-algo85 conf]$ 
# 測驗組態檔是否正確
(base) [ops@dis-algo85 conf]$ ../sbin/nginx -t 
nginx: the configuration file ../conf/nginx.conf syntax is ok
nginx: configuration file ../conf/nginx.conf test is successful
(base) [ops@dis-algo85 conf]$ 
# 啟動 報錯 
# 需要執行nginx -c nginx.conf命令指定組態檔 
(base) [ops@dis-algo85 conf]$ ../sbin/nginx  -s reload
nginx: [error] invalid PID number "" in "/data/nginx/logs/nginx.pid"
(base) [ops@dis-algo85 conf]$
# 指定組態檔, 要求使用sudo,因為郵件代理使用的是25埠,這個埠要求root
(base) [ops@dis-algo85 conf]$ sudo ../sbin/nginx  -c /data/nginx/conf/nginx.conf
(base) [ops@dis-algo85 conf]$ 
# 切換root用戶前,先關閉nginx
(base) [ops@dis-algo85 conf]$ 
(base) [ops@dis-algo85 conf]$ ../sbin/nginx  -s stop
(base) [ops@dis-algo85 conf]$ 
# 以root用戶重啟 要求先以root用戶身份指定組態檔(sudo nginx -c )
(base) [ops@dis-algo85 conf]$ sudo ../sbin/nginx -s reload
(base) [ops@dis-algo85 conf]$ 
# 查看是否重啟成功                
(base) [ops@dis-algo85 conf]$ netstat -nltp | grep 25                            
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      -         
(base) [ops@dis-algo85 conf]$ 

2.4.測驗

在大資料環境的四臺機器上測驗,

2.4.1.Http代理測驗

1.測驗api.caiyunapp.com
原來的地址:
curl https://api.caiyunapp.com/v2.5/YRVvqVfC3j0K794p/119.292776,26.075473/realtime.json
代理的地址:
curl http://101.147.192.179:18080/caiyunapp/v2.5/YRVvqVfC3j0K794p/119.292776,26.075473/realtime.json

2.測驗api.map.baidu.com
原來的地址:
curl http://api.map.baidu.com/routematrix/v2/riding?output=json\&riding_type=1\&origins=30.903624,104.259426\&destinations=30.892165,104.254266\&ak=5xYpGVj7A9WqnHERyB9U4QtM6uRTO75T
代理的地址:
curl http://101.147.192.179:18080/routematrix/v2/riding?output=json\&riding_type=1\&origins=30.903624,104.259426\&destinations=30.892165,104.254266\&ak=5xYpGVj7A9WqnHERyB9U4QtM6uRTO75T

3.測驗www.tianqihoubao.com
原來的地址:
curl  http://www.tianqihoubao.com/lishi/wuxi/month/201101.html
代理的地址:
curl  http://101.147.192.179:18080/tianqihoubao/lishi/wuxi/month/201101.html

4.測驗www.weather.com.cn
原來的地址:
curl http://www.weather.com.cn/weather15d/101230101.shtml
代理的地址:
curl http://101.147.192.179:18080/weather/weather15d/101230101.shtml

2.4.2.郵件代理測驗

1.引入jar包
        <!--發郵件-->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.5.6</version>
        </dependency>
        
2.java測驗
package com.wuxiaolong;

import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

public class TestEmail {

    private final static String TIMEOUT_MS = "20000";

    public static void main(String[] args)  throws Exception{
        // 這是公司原來的郵件服務器 代理之前使用這個
        // String host = "mail.xxxxxx.cn";

        // 這是代理服務器(nginx) 代理之后使用這個
        String host = "101.147.192.179";

        String port = "25";// SMTP郵件服務器默認埠

        // 公司的郵箱發郵件
        String user = "wuxl3@abc.cn";
        String password = "XXXXXX";

        // 163郵箱收郵件
        String recipients = "wuxiaolongah@163.com";

        String subject = "郵件發送測驗";
        String content = "郵件正文:<br>你好 proxy!";


        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.timeout", TIMEOUT_MS);


        Authenticator auth = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(user, password);
            }
        };
        Session session = Session.getInstance(props, auth);
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(user));
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));

        msg.setSubject(subject);
        // 向multipart物件中添加郵件的各個部分內容,包括文本內容和附件
        Multipart multipart = new MimeMultipart();
        // 添加郵件正文
        BodyPart contentPart = new MimeBodyPart();
        contentPart.setContent(content, "text/html;charset=UTF-8");
        multipart.addBodyPart(contentPart);

        // 將multipart物件放到message中
        msg.setContent(multipart);
        // 保存郵件
        msg.saveChanges();
        Transport.send(msg, msg.getAllRecipients());
    }

}

測驗結果:

image-20211009194913128

2.5.修改代碼

相關的python代碼按照上面2.4的測驗的代理地址進行修改,

2.6.后續注意事項

  • 后續這四臺機器上有新的外網地址訪問,需要提前加入到這臺代理機器上,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/307197.html

標籤:其他

上一篇:MySQL ERROR 1064 (42000)——不管怎樣grant總是報錯,怎么回事?

下一篇:666-集群聊天服務器專案總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more