nginx反向代理php
反向代理最常常用的就是負載均衡。linux
Nginx反向代理在生產環境中使用不少的。nginx
場景1:算法
域名沒有備案,能夠把域名解析到香港一臺雲主機上,在香港雲主機作個代理,而網站數據是在大陸的服務器上。後端
示例1:bash
server { listen 80; server_name aminglinux.com; location / { proxy_pass http://123.23.13.11/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
參數解釋:服務器
server_name 反向域名負載均衡
proxy_pass 域名的ip地址curl
proxy_set_header header指版本信息,狀態碼等等,curl xxx.com -I 能夠查出相關域名的header信息ide
Nginx的負載均衡配置
Nginx經過upstream和proxy_pass實現了負載均衡。本質上也是Nginx的反向代理功能,只不事後端的server爲多個。
案例一(簡單的輪詢)
upstream www { server 172.37.150.109:80; server 172.37.150.101:80; server 172.37.150.110:80; } server { listen 80; server_name www.aminglinux.com; location / { proxy_pass http://www/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
說明:當被代理的機器有多臺時,須要使用upstream來定義一個服務器組,
其中www名字能夠自定義,在後面的proxy_pass那裏引用。
這樣nginx會將請求均衡地輪詢發送給www組內的三臺服務器。
案例二(帶權重輪詢+ip_hash算法)
upstream www { server 172.37.150.109:80 weight=50; server 172.37.150.101:80 weight=100; server 172.37.150.110:80 weight=50; ip_hash; } server { listen 80; server_name www.aminglinux.com; location / { proxy_pass http://www/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
說明:能夠給www組內的三臺機器配置權重,權重越高,則分配到的請求越多。
ip_hash爲nginx負載均衡算法,原理很簡單,它根據請求所屬的客戶端IP計算獲得一個數值,而後把請求發往該數值對應的後端。
因此同一個客戶端的請求,都會發往同一臺後端,除非該後端不可用了。ip_hash可以達到保持會話的效果。
案例三(upstream其餘配置)
upstream www { server 172.37.150.109:80 weight=50 max_fails=3 fail_timeout=30s; server 172.37.150.101:80 weight=100; server 172.37.150.110:80 down; server 172.37.150.110:80 backup; } server { listen 80; server_name www.aminglinux.com; location / { proxy_next_upstream off; proxy_pass http://www/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
說明:down,表示當前的server不參與負載均衡;
backup,爲預留的機器,當其餘的server(非backup)出現故障或者忙的時候,纔會請求backup機器;
max_fails,容許請求失敗的次數,默認爲1。當失敗次數達到該值,就認爲該機器down掉了。 失敗的指標是由proxy_next_upstream模塊定義,其中404狀態碼不認爲是失敗。
fail_timeount,定義失敗的超時時間,也就是說在該時間段內達到max_fails,纔算真正的失敗。默認是10秒。
proxy_next_upstream,經過後端服務器返回的響應狀態碼,表示服務器死活,能夠靈活控制後端機器是否加入分發列表。
語法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 |http_404 | off ...;
默認值: proxy_next_upstream error timeout
error # 和後端服務器創建鏈接時,或者向後端服務器發送請求時,或者從後端服務器接收響應頭時,出現錯誤
timeout # 和後端服務器創建鏈接時,或者向後端服務器發送請求時,或者從後端服務器接收響應頭時,出現超時
invalid_header # 後端服務器返回空響應或者非法響應頭
http_500 # 後端服務器返回的響應狀態碼爲500
http_502 # 後端服務器返回的響應狀態碼爲502
http_503 # 後端服務器返回的響應狀態碼爲503
http_504 # 後端服務器返回的響應狀態碼爲504
http_404 # 後端服務器返回的響應狀態碼爲404
off # 中止將請求發送給下一臺後端服務器
案例四(根據不一樣的uri)
upstream aa.com { server 192.168.0.121; server 192.168.0.122; } upstream bb.com { server 192.168.0.123; server 192.168.0.124; } server { listen 80; server_name www.aminglinux.com; location ~ aa.php { proxy_pass http://aa.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~ bb.php { proxy_pass http://bb.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { proxy_pass http://bb.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
說明:請求aa.php的,會到aa.com組,請求bb.php的會到bb.com,其餘請求所有到bb.com。
案例五(根據不一樣的目錄)
upstream aaa.com { server 192.168.111.6; } upstream bbb.com { server 192.168.111.20; } server { listen 80; server_name www.aminglinux.com; location /aaa/ { proxy_pass http://aaa.com/aaa/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /bbb/ { proxy_pass http://bbb.com/bbb/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { proxy_pass http://bbb.com/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
其中,最經常使用的就是案例一,輪詢。