原文鏈接:https://blog.zhuliang.ltd/2019/05/nginx/nginx-nat.html
轉(zhuǎn)載請注明出處肿轨。
當開始進行小程序開發(fā)的時候寿冕,https是繞不過的一道環(huán)節(jié),除了微信提供的ssl 服務(wù)器架設(shè)方案椒袍,還有花生殼內(nèi)網(wǎng)穿透服務(wù)驼唱,自行在內(nèi)網(wǎng)架設(shè)DNS服務(wù)器等方案。而本文所要講解的驹暑,是通過外網(wǎng)nginx服務(wù)器反向代理來實現(xiàn)內(nèi)網(wǎng)穿透玫恳。
前置條件:
1.路由器需支持端口轉(zhuǎn)發(fā)。
2.需有公網(wǎng)IP优俘,固定不固定無所謂京办。
3.在公有云上架設(shè)nginx(本文使用阿里云ECS通過linux搭建nginx),通過反向代理實現(xiàn)內(nèi)網(wǎng)穿透帆焕。
在路由器上設(shè)置端口轉(zhuǎn)發(fā)
這里以TP-LINK:TL-R473G為例臂港。
TP-LINK的端口轉(zhuǎn)發(fā)在【高級功能】--【虛擬服務(wù)器】選項卡下,具體如下:
注意事項
- 在使用端口轉(zhuǎn)發(fā)的時候视搏,盡量不要用XXX0(如8000审孽,8080端口)端口,有不小概率會有沖突(如路由器內(nèi)部保留端口可能會跟實際設(shè)定的端口有沖突)浑娜。改為使用8001佑力,8081這樣子。
- TL-R473G默認占用了8080端口作為認證服務(wù)端口(且自行修改后依然無效筋遭,目前猜測是固件問題導致打颤,時間問題,就自我先規(guī)避該端口了)
- 確保防火墻(路由器漓滔,服務(wù)器)已經(jīng)允許設(shè)定的端口编饺,可以通過手機(4G網(wǎng)絡(luò)下),直接根據(jù)“IP:端口”的形式來測試是否對外暴露成功响驴。
- 不要在同一局域網(wǎng)內(nèi)進行測試透且,不少路由器和光貓回源有問題,尤其是電信的光貓,讓師傅上門過幾次秽誊,都表示無解鲸沮,無法設(shè)定,硬件上做限制了锅论。
配置:
在linux服務(wù)器上新建一個內(nèi)網(wǎng)穿透配置文件讼溺,專門用于設(shè)定公司內(nèi)部網(wǎng)絡(luò)的穿透配置。
以下配置文件為簡易配置最易,對于有其他具體需求的怒坯,請自行增加nginx相關(guān)設(shè)定參數(shù)。
http 80端口映射
配置文件:
upstream pre_xxx_api {
server 111.222.333.444:8081; #設(shè)定具體的公司公網(wǎng)ip跟對應(yīng)端口轉(zhuǎn)發(fā)的端口號
}
server {
listen 80;
server_name pre-xxx-api.XXYY.com;
location / {
index index.html index.htm;
proxy_pass http://pre_xxx_api/;
}
}
- wq保存退出-->nginx -t -->nginx -s reload-->查看結(jié)果
https 443端口映射
關(guān)于SSL證書藻懒,我這邊是直接在阿里云購買的域名剔猿,可以直接在控制臺申請免費的SSL證書以及自動關(guān)聯(lián)設(shè)定SSL解析。(但阿里提供的免費證書束析,在chrome上不會顯示綠色安全標---賽門鐵克的鍋艳馒,介意的可以直接到騰訊云上申請免費證書),這里非本文重點员寇,僅略說明弄慰。
準備工作:
將申請的SSL證書文件,如pem/crt以及key上傳到linux服務(wù)器上(注意相關(guān)目錄和文件給好權(quán)限蝶锋,測試用直接給777即可)
域名解析陆爽,將相關(guān)域名解析到 nginx所在服務(wù)器的ip上。
配置文件:
upstream pre_ssl_api {
server 111.222.333.444:8081;
}
server {
listen 443 ssl; # 這里很重要扳缕,網(wǎng)上資料復(fù)制粘貼太嚴重了慌闭,在設(shè)定https的時候,listen端口的時候躯舔,務(wù)必在443后面加上"ssl"驴剔,否則chrome會報"ERR_SSL_PROTOCOL_ERROR"的錯誤
server_name pre-ssl-api.XXYY.com;
ssl_certificate /usr/local/etc/nginx/ssl-key/XXX.pem;
ssl_certificate_key /usr/local/etc/nginx/ssl-key/YYY.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
index index.html index.htm;
proxy_pass http://pre_ssl_api/;
}
}
- wq保存退出-->nginx -t -->nginx -s reload-->查看結(jié)果