Nginx 反向代理工做原理簡介與配置詳解
測試環境
CentOS 6.8-x86_64
nginx-1.10.0
下載地址:http://nginx.org/en/download.html
安裝 nginx
[root@localhost mnt]# tar -xzvf nginx-1.10.0.tar.gz
[root@localhost mnt]# cd nginx-1.10.0
[root@localhost nginx-1.10.0]# ./configure --prefix=/usr/local/ngnix --withpcre=/mnt/pcre-8.36
Configuration summary
+ using PCRE library: /mnt/pcre-8.36
+ OpenSSL library is not used
+ using builtin md5 code
+ sha1 library is not found
+ using system zlib library
nginx path prefix: "/usr/local/ngnix"
nginx binary file: "/usr/local/ngnix/sbin/nginx"
nginx modules path: "/usr/local/ngnix/modules"
nginx configuration prefix: "/usr/local/ngnix/conf"
nginx configuration file: "/usr/local/ngnix/conf/nginx.conf"
nginx pid file: "/usr/local/ngnix/logs/nginx.pid"
nginx error log file: "/usr/local/ngnix/logs/error.log"
nginx http access log file: "/usr/local/ngnix/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
注:
一、編譯時,指定了 pcre 安裝目錄,可是安裝出錯,解決方法如上,指定源碼所在目錄
二、若是不指定--with-pcre 選項,會報相似以下的錯誤
三、須要預先安裝 gcc-c++
[root@localhost nginx-1.10.0]# make && make install
略
啓動 ngnix
[root@localhostnginx-1.10.0]#
/usr/local/ngnix/sbin/nginx –c /usr/local/ngnix/conf/nginx.conf
反向代理工做原理
客戶端向反向代理髮送請求,接着反向代理轉發請求至目標服務器,並把得到的內容返回給
客戶端
反向代理配置
測試連接:
http://192.168.1.104/zentaopms/www/index.php?
http://192.168.1.104/zentaopms/www/index.php?m=project&f=create
如上,想經過 192.168.1.103 代理服務器訪問上述測試連接,具體咋操做呢?以下
編輯所使用的配置文件
[root@localhost nginx-1.10.0]# vim /usr/local/ngnix/conf/nginx.conf
找到「Server」結點,增長入下帶背景色內容
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
php
#error_page 404 | /404.html; |
# redirect server error pages to the static page /50x.html | |
# |
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location /zentaopms/www/ {
proxy_pass http://192.168.1.104;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
從新加載配置文件
[root@localhost nginx-1.10.0]# /usr/local/ngnix/sbin/nginx -s reload
訪問測試 url
以下,OK
說明:
傳遞請求給被代理服務器
爲了把請求傳遞給被代理服務器,須要在 location 中指定 proxy_pass 機制。以下
location /some/path/ {
proxy_pass http://www.example.com/link/;
}
proxy_pass 既能夠是 ip 地址,也能夠是域名,同時還能夠指定端口
location ~ \.php {
proxy_pass http://127.0.0.1:8000;
}
注意:若是 proxy_pass 指定的地址攜帶了 URI,如上例中 /link/,那麼這裏的 URI 將替換
請求 URI 中匹配 location 參數的部分,好比 請求 /some/path/page.html,將被替換爲
http://www.example.com/link/page.html。
另外,若是請求不是發往 http 類型的被代理服務器,則選擇以下之一:
fastcgi_pass 傳遞請求給 FastCGI 服務器
uwsgi_pass 傳遞請求給 uwsgi 服務器
scgi_pass 傳遞請求給 SCGI 服務器
memcached_pass 傳遞請求給 memcached 服務器
請求也能夠發往一命名的組服務器,這種請求下,將根據指定方法,在這些服務器之中進行
請求的分發。
傳遞請求頭
默認的,nginx 在被代理請求中定義兩個頭域:Host 和 Connection,而且清除包含空值的
頭域。 Host 被設置爲$proxy_host 變量,而 Connection 則被設置爲 close。
使用 proxy_set_header 機制可修改默認配置及其它頭域的值。能夠在 location 中,server
上下文,http 塊或者其它更高層級中指定這種機制。
例子:
location /some/path/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://localhost:8000;
}
若是想阻止某個頭域被傳遞給被代理服務器,能夠以下設置頭域的值爲空
location /some/path/ {
proxy_set_header Accept-Encoding "";
proxy_pass http://localhost:8000;
}
配置緩衝(Buffer)
默認的,Ngnix buffering 來自被代理服務器的響應。Ngnix 在內部 buffering 中存儲響應,
直到收到整個響應後才發送給客戶端。對於慢客戶端來講,buffering 可優化性能,這樣,
若是響應從 Nginx 同步傳遞給客戶端,這將會浪費被代理服務器的時間。可是,若是開啓
buffering,Nginx 容許被代理服務器快速處理請求,由於 Nginx 會盡量久的存儲來自被
代理服務器的響應,直到客戶端下載它們。
使用 proxy_buffering 機制開啓或關閉緩衝。默認的,開啓緩衝。
proxy_buffers 控制 buffer 大小和分配給請求的 buffer 數量。來自被代理服務器響應中的
第一部分被存儲在單一的 buffer 中,該 buffer 的大小由 proxy_buffer_size 設定。該部分
一般包含一個相對較小的響應頭,其大小能夠設置成比用於存儲剩餘響應部分 buffer 小。
例子:
location /some/path/ {
proxy_buffers 16 4k;
proxy_buffer_size 2k;
proxy_pass http://localhost:8000;
}
若是關閉 buffering,當從被代理服務器接收到響應時,將被同步把響應發往客戶端。這對
於想盡快收到請求的快速交互客戶端來講。這是其想要的。
例子:關閉 buffering
location /some/path/ {
proxy_buffering off;
proxy_pass http://localhost:8000;
}
這種狀況下,nginx 只用 proxy_buffer_size 來存儲響應的當前部分。
選擇一個出口 IP 地址
若是代理服務器有多個網絡接口,有時候須要選擇特定的源 ip 地址來鏈接到代理服務器。
當被代理服務器被設置爲只接受來自特定 IP 地址或者 IP 範圍的鏈接請求時,這特別有用。
例子
location /app1/ {
proxy_bind 127.0.0.1;
proxy_pass http://example.com/app1/;
}
location /app2/ {
proxy_bind 127.0.0.2;
proxy_pass http://example.com/app2/;
}
ip 地址也能夠是一個變量
例子
location /app3/ {
proxy_bind $server_addr;
proxy_pass http://example.com/app3/;
html