1.19 nginx的location配置php
安裝第三方模塊echo-nginx-modulehtml
git clone https://github.com/openresty/echo-nginx-module.git ./configure --prefix=/usr/local/nginx --add-module=/path/to/echo-nginx-module
安裝echo模塊操做:前端
cd /usr/local/src/nginx-1.8.0/ ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/echo-nginx-module make && make install /etc/init.d/nginx restart # nginx -V nginx version: nginx/1.8.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) configure arguments: --prefix=/usr/local/nginx --add-module=/usr/local/src/echo-nginx-module
配置寫法:linux
server { listen 80; server_name 2.com; root /data/t-nginx/2.com; location /abc/ { echo 123; } }
效果 訪問/abc/要輸出echo的信息nginx
curl -x127.0.0.1:80 2.com/abc/1111 123
location語法git
location [=|^~|~|~*] /uri/ { …. }
https://coding.net/u/aminglinux/p/nginx/git/blob/master/location/ruler.md github
location優先級及案例web
= 高於 ^~ 高於 ~* 等於 ~ 高於 /vim
http://coding.net/u/aminglinux/p/nginx/git/blob/master/location/priority.md 後端
場景比較:/與~*
server { listen 80; server_name 2.com; root /data/t-nginx/2.com; location /abc/ { echo "/"; } location ~* abc { echo "~*"; } }
效果:
當匹配到 location /abc/的時候,輸出/
當匹配到 location ~* abc的時候,輸出~*
測試訪問:
curl -x127.0.0.1:80 2.com/abc/1111 ~*
實驗證實,一樣的場景~*比/的優先級要高。
場景比較:~與~*
當這2個同時存在,會匹配最早出現的location語法。
場景比較:= 與 ^~
vim 2.com.conf server { listen 80; server_name 2.com; root /data/t-nginx/2.com; location ^~ abc { echo "^~"; } location = "/abc/1.php" { echo "="; } } # curl -x127.0.0.1:80 2.com/abc/1.php =
實驗證實,一樣的場景,=比^~的優先級要高。
規則示例
location = "/12.jpg" { ... }
如:
www.aminglinux.com/12.jpg 匹配 www.aminglinux.com/abc/12.jpg 不匹配
不匹配緣由:由於「=」是精準匹配
location ^~ "/abc/" { ... }
如:
www.aminglinux.com/abc/123.html 匹配 www.aminglinux.com/a/abc/123.jpg 不匹配
不匹配緣由:由於是以"/abc/"開頭並匹配
location ~ "png" { ... }
如:
www.aminglinux.com/aaa/bbb/ccc/123.png 匹配 www.aminglinux.com/aaa/png/123.html 匹配
都匹配:~匹配"png"便可
location ~* "png" { ... }
如:
www.aminglinux.com/aaa/bbb/ccc/123.PNG 匹配 www.aminglinux.com/aaa/png/123.html 匹配
都匹配:由於不區分大小寫匹配,因此有"png"都會匹配
location /admin/ { ... }
如:
www.aminglinux.com/admin/aaa/1.php 匹配 www.aminglinux.com/123/admin/1.php 不匹配
不匹配緣由:由於是匹配uri後/admin/的開頭,so第二個不配。
1.20 nginx正向代理
示意圖
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/pic.md
Nginx正向代理
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/z_proxy.md
正向代理:
用戶和代理服務器在同一個內網環境裏,代理服務器幫用戶去訪問用戶訪問不到的web server
Nginx正向代理配置文件
server { listen 80 default_server; resolver 119.29.29.29; location / { proxy_pass http://$host$request_uri; } }
解釋:
正向代理配置文件必定要設default_server;
resolver 119.29.29.29; 解釋dns,這個dns能解析全部公網web,除了被大陸防火牆屏蔽掉的(Facebook,Instagram...)
訪問測試:
curl 外網
curl -x127.0.0.1:80 外網
1.21 Nginx反向代理
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/f_proxy.md
配置反向代理:
條件:
1 須要代理的server_name
2 server_name的IP或者ip:port
80代理90的域名配置以下:
server { listen 80; server_name www.test.com; location / { proxy_pass http://127.0.0.1:90/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
90被代理的虛擬主機配置:
server { listen 90 default_server; server_name www.test.com; root /data/t-nginx/test.com/; index index.html ; } mkdir -p /data/t-nginx/test.com echo "test.com_90" > /data/t-nginx/test.com/index.html
訪問測試:
# curl -x127.0.0.1:90 www.test.com test.com_90 # curl 127.0.0.1:90 test.com_90
訪問ip:port和從90端口訪問都是同樣。
場景:訪問test.com下,一個是default_server,另外一個不是,區別輸出結果
[root@AliKvn vhost]# cat test.com.conf server { listen 90 ; server_name www.test.com; root /data/t-nginx/test.com/; index index.html ; } [root@AliKvn vhost]#test.com-90-default.conf server { listen 90 default_server; #server_name www.test.com; root /data/t-nginx/test.com/; index index.html ; location / { echo "90 default"; } }
訪問測試:
#curl 127.0.0.1:90 90 default # curl -x127.0.0.1:90 www.test.com test.com_90 # curl -x127.0.0.1:80 www.test.com test.com_90
當利用80端口去訪問 www.test.com的時候,跟利用90端口去訪問www.test.com是同樣的,證實反向代理已經配置成功了。
當proxy_pass 後面接的是域名的話,域名須要在本機hosts解析。
proxy_set_header 的Host $host 是對應的,區分爲前端和後端地址。
1.23 nginx反向代理——proxy_pass
無論什麼狀況下,proxy_pass的地址,最後最好都加上/
proxy_set_header用來設定被代理服務器接收到的header信息。
語法:proxy_set_header field value;
field爲要更改的項目,也能夠理解爲變量的名字,好比host
value爲變量的值
若是不設置proxy_set_header,則默認host的值爲proxy_pass後面跟的那個域名或者IP(通常寫IP),
好比示例4,請求到後端的服務器上時,完整請求uri爲:http://192.168.1.10/linux/a.html
若是設置proxy_set_header,如 proxy_set_header host $host;
好比示例4,請求到後端的服務器完整uri爲:http://www.aminglinux.com/linux/a.html
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
用來設置被代理端接收到的遠程客戶端IP,若是不設置,則header信息中並不會透傳遠程真實客戶端的IP地址。
$remote_addr 遠程客戶端的IP地址
$proxy_add_x_forwarded_for 記錄代理的IP地址,遠程真實客戶端的IP地址,
例如A-->B-->C-->他們的角色分別是,客戶端、反向代理服務器、真實web服務器。那麼A的地址就是$proxy_add_x_forwarded_for 所記錄的。
能夠用以下示例來測試:
示例6(被代理端)
server{ listen 8080; server_name www.aminglinux.com; root /tmp/123.com_8080; index index.html; location /linux/ { echo "$host"; echo $remote_addr; echo $proxy_add_x_forwarded_for; } }
示例7(代理服務器上)
server { listen 80; server_name www.aminglinux.com; location /aming/ { proxy_pass http://192.168.1.10:8080/linux/; proxy_set_header host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
1.24 Nginx反向代理 proxy_redirect
該指令用來修改被代理服務器返回的響應頭中的Location頭域和「refresh」頭域。
語法結構爲:
proxy_redirect redirect replacement; proxy_redirect default; proxy_redirect off;
示例8:
server { listen 80; server_name www.aminglinux.com; index index.html; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
當請求的連接爲 http://www.aminglinux.com/aming
結果會返回301,定向到了 http://www.aminglinux.com:8080/aming/
注意:返回301有幾個先決條件
1. location後面必須是/;
2. proxy_pass後面的URL不能加uri,只能是IP或者IP:port結尾,並不能以/結尾;
3. 訪問的uri必須是一個真實存在的目錄,如,這裏的aming必須是存在的
4. 訪問的時候,不能以/結尾,只能是 www.aminglinux.com/aming
雖然,這4個條件挺苛刻,但確實會遇到相似的請求。解決方法是,加一行proxy_redirect http://$host:8080/ /;
示例9:
server { listen 80; server_name www.aminglinux.com; index index.html; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header host $host; proxy_redirect http://$host:8080/ /; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
nginx反向代理——proxy_pass
管什麼狀況下,最好都加上/
緩衝和緩存 https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/bu_ca.md
Nginx負載均衡
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/lb.md