摘要:傳給微信的參數(shù)進(jìn)行轉(zhuǎn)義其中參數(shù)是可以被微信原樣返回,這樣就可以按你自己的需求完成反向代理了。可以去掉搭建測(cè)試環(huán)境另一條運(yùn)維的原則是不要在生產(chǎn)環(huán)境上直接改,在測(cè)試環(huán)境修改并經(jīng)過(guò)測(cè)試,測(cè)試通過(guò)后,再上傳到生產(chǎn)環(huán)境。
前言
在與第三方系統(tǒng)進(jìn)行接口開(kāi)發(fā)時(shí),需要不斷的改進(jìn)和測(cè)試,以常見(jiàn)的微信登錄支付和 Alipay 支付和登錄為例. 相對(duì)來(lái)講 Alipay 做起來(lái)容易一些, 一是接口 SDK 封裝的簡(jiǎn)單一些,對(duì)老接口也相對(duì)友好, 文檔的岐義少. 微信就不那么容易了. 出于安全的考慮,微信的商戶 ID 授權(quán)回調(diào)和支付回調(diào)只允許后臺(tái)配置的一個(gè)地址, 看上去可以加, 但在我有限的經(jīng)驗(yàn)里,加了也不管用. 有時(shí)間吐槽,不如花時(shí)間想其他辦法搞定. 借助于萬(wàn)能的 nginx 反向代理功能, 我們就把測(cè)試的和正式環(huán)境的配置通一個(gè)域名地址,但不同參數(shù)的方式搞定了.
使用場(chǎng)景 - 微信的測(cè)試假設(shè)你和一個(gè)正式服務(wù)器,如 bixuebihui.com, 還有一個(gè)測(cè)試用的,dev.bixuebihui.com, 正式的微信回調(diào)路徑是 https://bixuebihui.com/pay, 測(cè)試的路徑是 https://dev.bixuebihui.com/other/pay 微信后臺(tái)綁定的是前一個(gè)路徑,但你想對(duì)自己的代碼按后一個(gè)路徑做測(cè)試,該怎么做 nginx 的配置呢?
閑話少說(shuō),上代碼,啊不,配置:
servername bixuebihui.com; location /pay { proxy_connect_timeout 3; proxy_read_timeout 30; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect / /; add_header X-Upstream $upstream_addr; proxy_set_header Host $arg_domain; if ($arg_domain ~ "dev.bixuebihui.com" ){ proxy_pass https://your.private.dev.ip; rewrite /pay/(.*) /other/pay/$1 break; break; } proxy_pass http://your_super_cluster; }
說(shuō)明:
proxy_pass https://your.private.dev.ip; 這里要用 ip 比較好,因?yàn)?Host 是用 domain 控制的,如果也用 domain 會(huì)有安全問(wèn)題。
"https://xxxx.weixin.qq.com/xxxapi?redirect_uri=https%3A%2F%2Fbixuebihui.com%2Fpay%3Fdomain%3Dhttps%253A%252F%252Fdev.bixuebihui.com%252Fother%252Fpay&other_params=xxxxxx " 傳給微信的參數(shù)進(jìn)行 url 轉(zhuǎn)義, 其中 domain 參數(shù)是可以被微信原樣返回,這樣就可以按你自己的需求完成反向代理了。
路徑改寫與域名的處理上面的例子中,實(shí)際向服務(wù)器發(fā)起的請(qǐng)求,根據(jù)參數(shù)不同,可能被改寫,也可能不會(huì)
如訪問(wèn) bixuebihui.com/pay/abc.do 最終實(shí)際請(qǐng)求發(fā)送給http://your_super_cluster/pay/abc.do, 且 Host 參數(shù)為bixuebihui.com, 如果 your_super_cluster上 有多個(gè)虛擬主機(jī), 將會(huì)訪問(wèn)到主機(jī)頭為 bixuebihui.com 的一個(gè)或默認(rèn)的.
如訪問(wèn)的是 bixuebihui.com/pay/abc.do?domain=dev.bixuebihui.com
則最終請(qǐng)求會(huì)發(fā)給https://your.private.dev.ip/other/pay/abc.do?domain=dev.bixuebihui.com,且 Host 參數(shù)為 $arg_domain 的值,即 dev.bixuebihui.com.
nginx 支持對(duì) https 的代理, 如果你的應(yīng)用服務(wù)器與 nginx 在一個(gè)子網(wǎng)內(nèi),建議直接在 nginx 上配置 https, 后端采用 http 協(xié)議, 這樣應(yīng)用服務(wù)器的壓力會(huì)小很多.
配置 https 協(xié)議現(xiàn)在有很多免費(fèi)證書(shū)可用. 最方便的要數(shù) certbot, 在這個(gè)網(wǎng)站上連注冊(cè)都不需要, 就可以為你的域名獲得證書(shū), 自動(dòng)支持對(duì) nginx 和 apache 等常見(jiàn) web 服務(wù)器進(jìn)行自動(dòng)配置, 完全傻瓜化使用. 一分鐘搞定真不是吹的. 2018 年 4 月左右將推出對(duì)通配二級(jí)域名的支持.到時(shí)候會(huì)更加方便. 真是良心網(wǎng)站.
參數(shù)與 redirect如果你的網(wǎng)站有 302 這類的跳轉(zhuǎn),這時(shí)反向代理要設(shè)置成
proxy_redirect / /;
否則后端服務(wù)器有可能返回內(nèi)網(wǎng)跳轉(zhuǎn)路徑給瀏覽器, 造成無(wú)法訪問(wèn).
nginx配置正確性測(cè)試 對(duì)生產(chǎn)環(huán)境的修改前先要備份最好對(duì)現(xiàn)有的可能運(yùn)行的配置文件做備份,有兩種辦法,一是用版本管理系統(tǒng),如git ,參考這里,另一種方式是自己寫腳本來(lái)管理備份。
下面是我的備份腳本,供參考, 路徑要改成你自己的,這個(gè)腳本是以日期為擴(kuò)展名,如果你同一天需要多個(gè)備份請(qǐng)修改腳本,別掉坑里。
nginx_config_backup.sh
################################################################### #######nginx_config_backup################################################### #!/bin/sh # ----------------------------- # the directory for story your backup file. backup_dir="/home/yourname/backup" # date format for backup file (dd-mm-yyyy) time="$(date +"%Y%m%d")" MKDIR="$(which mkdir)" RM="$(which rm)" MV="$(which mv)" TAR="$(which tar)" GZIP="$(which gzip)" #針對(duì)不同系統(tǒng),如果環(huán)境變量都有。可以去掉 # check the directory for store backup is writable test ! -w $backup_dir && echo "Error: $backup_dir is un-writeable." && exit 0 # the directory for story the newest backup test ! -d "$backup_dir" && $MKDIR "$backup_dir" $TAR -zcPf $backup_dir/$HOSTNAME.nginx.$time.tar.gz /etc/nginx #delete the oldest backup 30 days ago find $backup_dir -name "*.gz" -mtime +30 |xargs rm -rf exit 0;搭建測(cè)試環(huán)境
另一條運(yùn)維的原則是:不要在生產(chǎn)環(huán)境上直接改,在測(cè)試環(huán)境修改并經(jīng)過(guò)測(cè)試,測(cè)試通過(guò)后,再上傳到生產(chǎn)環(huán)境。
安裝擴(kuò)展包
$ sudo apt-get install nginx-extras
這樣你就可以使用 Lua, echo 這些方便調(diào)試的工具了。
echo使用很簡(jiǎn)單
在location 配置塊內(nèi):
echo hello world; echo_flush;
詳細(xì)說(shuō)明看這里echo.
如果你是一個(gè)網(wǎng)管,代碼是別人寫的,且寫得很爛,怎么辦?為了能睡個(gè)安穩(wěn)覺(jué),你可安裝 nginx-naxsi 版本, "Nginx Anti Xss & Sql Injection". 損失一點(diǎn)效率,帶來(lái)的是更安全。不過(guò)這個(gè)版本在新的(15.04以后的)ubuntu里已經(jīng)不再提供更新了。需要話可能需要自已多帶帶設(shè)置安裝源。
修改了 nginx 的配置文件, 一定要先測(cè)試再重啟nginx -t && service nginx reload
或
sudo service nginx configtest && sudo service nginx reload
debug 可以輸出更多信息
server { #other config error_log /var/logs/nginx/example.com.error.log; location /admin/ { error_log /var/logs/nginx/admin-error.log debug; } #other config }
如果你的站長(zhǎng)訪問(wèn)量很大,這么做你的磁盤很快會(huì)被耗光, 也可以設(shè)置成只針對(duì)特定 IP 寫 debug 信息
events { debug_connection 1.2.3.4; }
這里 1.2.3.4 是你要調(diào)試的 ip 地址,
想要獲得自己的外網(wǎng) ip,有一個(gè)網(wǎng)站很好用
curl http://httpbin.org/ip
這個(gè)網(wǎng)站上還有很多其他用來(lái)調(diào)試http協(xié)議應(yīng)用的api接口. 簡(jiǎn)單易用.
總結(jié)nginx很強(qiáng)大, 詳細(xì)掌握nginx的用法能幫你少寫很多代碼, 維護(hù)一個(gè)更健康的網(wǎng)站.
如果有人感興趣, 下次可以討論一下nginx安全方面的應(yīng)用, 防抓取, 防攻擊等等.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/39798.html
摘要:此外,其也能夠提供強(qiáng)大的反向代理功能。是由為俄羅斯訪問(wèn)量第二的站點(diǎn)開(kāi)發(fā)的,第一個(gè)公開(kāi)版本發(fā)布于年月日。 keepalived+nginx 實(shí)現(xiàn)高可用雙機(jī)熱備 + 負(fù)載均衡架構(gòu) 1 準(zhǔn)備4個(gè)ubuntu16.04虛擬機(jī)(啟用網(wǎng)卡二并使用橋接模式):A服務(wù)器:192.168.0.103 主B服務(wù)器:192.168.0.104 主(備) 前端工程師學(xué)習(xí) Nginx ...
摘要:在現(xiàn)如今的游戲市場(chǎng)寒冬中,擁有微信龐大的用戶量以及更好兼容性的小程序游戲,優(yōu)勢(shì)就顯得格外明顯。掃描二維碼即可報(bào)名您在現(xiàn)場(chǎng)將有這些體驗(yàn)來(lái)自騰訊云云開(kāi)發(fā)團(tuán)隊(duì)與微信團(tuán)隊(duì)聯(lián)合打造干貨分享,內(nèi)容包括微信小游戲首發(fā)經(jīng)驗(yàn)分享。 有人說(shuō)微信小程序游戲的百花齊放 活像十幾年前的4399小游戲稱霸互聯(lián)網(wǎng)的景象 歪,斗地主嗎,三缺二, 不用下app,小程序就能玩,我保證不搶地主讓你搶! ...... ‘...
摘要:微信年月日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由個(gè)調(diào)整為個(gè)。大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開(kāi)發(fā)時(shí),授權(quán)回調(diào)的域名只能設(shè)置一個(gè),正常的開(kāi)發(fā)一般一套環(huán)境就對(duì)應(yīng)一個(gè)域名。 微信2018年11月16日發(fā)公告稱,個(gè)人主體注冊(cè)公眾號(hào)數(shù)量上限由2個(gè)調(diào)整為1個(gè)。企業(yè)類主體注冊(cè)公眾號(hào)數(shù)量上限由5個(gè)調(diào)整為2個(gè)。這個(gè)對(duì)馬上要注冊(cè)公眾號(hào)的企業(yè)來(lái)說(shuō)頓時(shí)心情不好了。 大家都知道每個(gè)微信公眾號(hào)在進(jìn)行開(kāi)發(fā)時(shí),授權(quán)回調(diào)...
摘要:一下載鏡像我這里用的是輕量級(jí)的鏡像下載完成后,通過(guò)命令檢查一下鏡像是否下載成功二先以簡(jiǎn)單的方式運(yùn)行鏡像以后臺(tái)方式運(yùn)行鏡像指定容器的名稱為命令執(zhí)行完成后,通過(guò)命令確認(rèn)一下容器是否啟動(dòng)成功。 歡迎關(guān)注個(gè)人微信公眾號(hào): 小哈學(xué)Java, 文末分享阿里 P8 高級(jí)架構(gòu)師吐血總結(jié)的 《Java 核心知識(shí)整理&面試.pdf》資源鏈接!!個(gè)人網(wǎng)站: https://www.exception.sit...
閱讀 2032·2023-04-26 02:15
閱讀 2307·2021-11-19 09:40
閱讀 1046·2021-10-27 14:13
閱讀 3317·2021-08-23 09:44
閱讀 3619·2019-12-27 12:24
閱讀 659·2019-08-30 15:53
閱讀 1171·2019-08-30 10:53
閱讀 2166·2019-08-26 12:14