CentOS 7 配置 Nginx 正向代理 http、https 最詳解



手頭項目中有使用到 nginx,因為使用的三方雲服務器,想上外網需要購買外網IP的,可是有些需要用到外網卻不常用的主機也掛個外網IP有點浪費了,便想使用nginx的反向代理來實現多台內網服務器使用一台代理服務器進行外網訪問。

查了很多資料,分享這個功能的人很多(都是好人啊),參考着實現還是費了大半天功夫才搞定,總結了一下,讓后來的人少走一些彎路。

我有兩台雲服務器:
172.25.114.72 是有外網的服務器,在這台上面安裝 nginx
172.25.114.71 是沒有外網的服務器,這台服務器通過 72 的 nginx 代理來上網

# more /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)

nginx 的安裝和其他相關插件的使用,以及我們使用的代理端口是否被占用,不再啰嗦贅述,直接進入正題。

准備:查詢當前服務器的 DNS (經測試,這步沒有什么作用)

# more /etc/resolv.conf
nameserver 100.100.2.138
nameserver 100.100.2.136

首先先打通 http 正向代理,http 正向代理非常容易,打通這步功能后,對整個 nginx 的正向代理會有一個更直接的感官。

1)在 nginx 安裝目錄下找到 nginx.conf 文件,使用 vi 命令打開,找個空白的位置鍵入如下內容:

server {
    resolver 100.100.2.138; #指定DNS服務器IP地址,然而並沒有什么用,可以使用 8.8.8.8
    listen 8080; #指定代理的端口
    location / {
        proxy_pass http://$http_host$request_uri; #設定代理服務器的協議和地址
    }
}

說明:經測試,這種寫法是最好的,其他如下寫法會有一個問題,當端口不是 80 的時候,代理還是會跳轉到 80,顯然不是我們想要的

proxy_pass $scheme://$host$request_uri; #設定代理服務器的協議和地址
proxy_set_header Host $http_host;

2)保存修改,重啟 nginx 后可以驗證代理是否正確

# ./sbin/nginx -s reload
# curl --proxy 172.25.114.72:8080 http://www.baidu.com

如果沒有看到返回的 html 代碼內容或者返回錯誤頁如400這樣的錯誤頁面代碼,可以使用

3)在 172.25.114.71 服務器配置代理

# vi /etc/profile
http_proxy=http://172.24.103.72:8080/
export http_proxy

4)保存並刷新后,檢查代理是否配置成功

# source /etc/profile
# curl http://www.baidu.com

說明:如果此時返回 curl: (7) Failed connect to 172.25.114.72:8080; Connection refused,可能是 profile 配置有誤,可以執行如下命令檢查代理是否正常:

# curl --proxy 172.25.114.72:8080 http://www.baidu.com

到此,nginx 的 http 正向代理配置成功。


接下來是 https 的正向代理,坑也是在這里。主流說 nginx 默認是不支持 https 的正向代理的,也有人信誓旦旦的說支持,歸根到底,使用nginx的一個插件包肯定是能實現的。
1)下載 ngx_http_proxy_connect_module 組件並傳到服務器上
說明:nginx-1.9.2 版本包里面自帶,其他版本的各自按習慣來,github 地址:https://github.com/chobits/ngx_http_proxy_connect_module

2)查詢當前 nginx 安裝的配置信息,默認安裝如下

# ./sbin/nginx -V
configure arguments: --prefix=/usr/local/nginx

3)nginx 添加 ngx_http_proxy_connect_module,注意第二條命令,在上一步查出的結果后面追加模塊,別把之前安裝的模塊搞沒了

# patch -p1 < /opt/tool/ngx_http_proxy_connect_module-master/patch/proxy_connect.patch 
# ./configure --prefix=/usr/local/nginx --add-module=/opt/tool/ngx_http_proxy_connect_module-master
# make
# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
# cp ./objs/nginx /usr/local/nginx/sbin/

4)在 nginx 配置文件添加 https 的正向代理配置(最小集如下,注意修改端口號),配置完后重啟 nginx

server {
    resolver 8.8.8.8; #指定DNS服務器IP地址,就用 8.8.8.8 算了
    listen 8080;
    location / {
        proxy_pass http://$http_host$request_uri; #設定代理服務器的協議和地址
    }
}

server {
    resolver 8.8.8.8; #指定DNS服務器IP地址,就用 8.8.8.8 算了
    listen 8084;
    proxy_connect;
    proxy_connect_allow all;
    location / {
        proxy_pass https://$host$request_uri; #設定代理服務器的協議和地址
        proxy_set_header Host $host;
    }
}

5)在 172.25.114.71 服務器配置代理,注意,我這里將本地訪問的路徑配置了代理過濾 no_proxy,否則,訪問 http://localhost:8080 也會被代理出去,那就尷尬了。

# vi /etc/profile
http_proxy=http://172.25.114.72:8080/
https_proxy=https://172.25.114.72:8084/
no_proxy="localhost, 172.25.114.72, 127.0.0.1, ::1" export http_proxy https_prox no_proxy

6)保存並刷新后,檢查代理是否配置成功

# source /etc/profile
# curl -k https://www.baidu.com

 

至此 nginx 的 http、https 代理完成。
這套配置就是為什么我大言不慚地說“最詳解”?
1.解決 http 正向代理非 80 端口無法代理問題(大部分沒有說明這個問題);
2.解決 https 正向代理任意端口都可以代理問題(大部分沒有說明這個問題);
3.對被代理的服務器進行了代理過濾,防止服務無法訪問的問題;
4. 2 台服務器完全打通的最小集(最干凈,容易理解)成功案例。
當然,對於大牛來說,有點班門弄虎的嫌疑,其中有很多小細節,讓初次接觸的人可以少走很多彎路。

如果這條博客有幫到了你,麻煩點一下“推薦”讓更多的人看到,能給大家帶來幫助也不枉我辛辛苦苦打這么多字。
感謝你的閱讀,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM