Nginx除了可以用作web服務器外,他還可以用來做高性能的反向代理服務器,它能提供穩定高效的負載均衡解決方案。nginx可以用輪詢、IP哈希、URL哈希等方式調度后端服務器,同時也能提供健康檢查功能。目前有眾多公司均已經部署使用nginx實現基於七層的負載均衡功能。
1)Nginx負載均衡
為了實現Nginx的反向代理以及負載均衡功能,應用中需要用到兩個模塊,HttpProxyModule和HttpUpstreamModule模塊;其中HttpProxyModule模塊的作用是將用戶的數據請求轉發到其他服務器上,HttpUpstreamModule模塊是提供負載均衡技術。
Nginx目前提供的負載均衡算法:
a)ngx_http_upstream_round_robin:加權輪詢,可均分請求,是默認算法,集成在框架中。
b)ngx_http_upstream_ip_hash_module:IP哈希,可保持會話。
c)ngx_http_upstream_least_conn_module:最少連接數,可均分連接。
d)ngx_http_upstream_hash_module:一致性哈希,可減少緩存數據的失效。
nginx的upstream負載均衡目前支持的幾種方式:
a)輪詢(默認)
默認選項,當weight不指定時,各服務器weight相同, 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。
upstream bakend { server 192.168.1.10; server 192.168.1.11; }
b)weight
指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。如果后端服務器down掉,能自動剔除。 比如下面配置,則1.11服務器的訪問量為1.10服務器的兩倍(后端節點中配置高的服務器可以適當將weight設置大點)。
upstream bakend { server 192.168.1.10 weight=1; server 192.168.1.11 weight=2; }
c)ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session不能跨服務器的問題,實現session共享。如果后端服務器down掉,要手工處理。
upstream resinserver{ ip_hash; server 192.168.1.10:8080; server 192.168.1.11:8080; } ============================================================================================================ 之前遇到的一個問題:Nginx反向代理兩台tomcat應用服務器,發現在nginx的upstream負載配置里: 1)如果不配置ip_hash負載到后端的兩台節點上,則訪問后台頁面,輸入用戶名和密碼,點擊"登錄"則無反應或無法訪問后台! 2)如果不配置ip_hash負載到后端的任意一台單節點上(另一台節點的負載配置注釋掉),則訪問后台頁面,輸入用戶名和密碼,點擊"登錄"則會成功登錄進去! 3)配置ip_hash負載到后端的兩台節點上,則訪問后台頁面,輸入用戶名和密碼,點擊"登錄"則會成功登錄進去! 如下配置,在后面兩台機器192.168.10.20和192.168.10.21的tomcat端口(8080)都活着的情況下,前面nginx代理層的upstream配置里, 如果注釋掉了ip_hash,則會造成訪問http://bpm.kevin.com頁面,輸入用戶名和密碼后,點擊登陸失敗! 如果加上ip_hash,則登陸就ok。 [root@kevin-lb vhosts]# cat bpm.kevin.com.conf upstream os-8080 { ip_hash; server 192.168.10.20:8080 max_fails=3 fail_timeout=15s; server 192.168.10.21:8080 max_fails=3 fail_timeout=15s; } server { listen 80; server_name bpm.kevin.com; access_log /data/nginx/logs/bpm.kevin.com-access.log main; error_log /data/nginx/logs/bpm.kevin.com-error.log; location / { proxy_pass http://os-8080; proxy_redirect http://os-8080/ http://bpm.kevin.com/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } =================原因分析============================================ 當后端節點是動態應用服務器的話,前面的nginx負載層要用ip_hash做session共享,否則nginx負載默認是輪詢策略(每個請求按時間順序逐一分配到不同的后端服務器), 就是說當你打開登錄界面,輸入用戶名和密碼,這時候請求是到后端的A機器上;當你點擊"登錄",按照輪詢策略,此時請求就到了后端的B機器上。 所以會出現登錄無反應的現象。 ==================================================================== 再看下面一例 [root@kevin-lb vhosts]# cat portal.kevin.com.conf server { listen 80; server_name portal.kevin.com; access_log /data/nginx/logs/portal.kevin.com-access.log main; error_log /data/nginx/logs/portal.kevin.com-error.log; root /data/web/webroot; index index.html; location / { if ($arg_response_for) { add_header X-Response-For $arg_response_for; } try_files $uri $uri/ /index.html; } location ~ /prod { rewrite /prod/(.*)$ /$1 break; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://10.0.54.20:9040; } location /portal-pc/captcha/login { proxy_pass http://10.0.54.20:9040; } location /portal-pc/captcha/mobile { proxy_pass http://10.0.54.20:9040; } location /portal-pc/login { rewrite .* /?response_for=unlogined break; } location /portal-pc/user/center { rewrite .* /?response_for=logined break; } location /msdp-file { proxy_pass http://10.0.54.20:9020/msdp-file; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /upload { proxy_pass http://10.0.54.20:9020/upload; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } [root@kevin-lb vhosts]# ll -d /data/web/webroot drwxr-xr-x 4 www www 12288 7月 12 21:06 /data/web/webroot [root@kevin-lb vhosts]# ll /data/web/webroot/index.html -rw-r--r-- 1 www www 1348 7月 12 21:06 /data/web/webroot/index.html 如nginx反向代理后端兩台apache應用,涉及到網站后台登錄。如果不使用ip_hash實現session共享,則會出現: 1)使用域名登錄后台,輸入用戶名和密碼,第一次點擊"登錄"沒有反應,閃一下,第二次點擊"登錄"才會登錄到后台。 2)使用后端apache自己的ip登錄后台,輸入用戶名和密碼,點擊"登錄"可以成功登錄到后台。 3)這就是因為nginx代理時,沒有配置ip_hash造成的,即沒有達到session共享效果。 輸入用戶名和密碼的session信息保存到appche01機器上,點擊"登錄"操作后卻是去apache02機器上拿session。 此時apache02上沒有這個session,所以第一次會出現閃一下沒有登錄到后台的現象。 第二次點擊"登錄"后就輪到去apache01機器上拿session,此時正好apache01機器上有這個session,故第二次就能登錄到后台了。 因此,在nginx的代理配置中啟用ip_hash,就可以實現session共享,則就不會出現上面這種現象了。
nginx代理配置中幾個參數說明
proxy_redirect off; # 代理是否支持重定向 proxy_set_header X-Real-IP $remote_addr; # 遠端真實ip地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 反向代理之后轉發之前的ip地址 proxy_set_header Host $http_host; # http請求的主機域名 proxy_set_header X-NginX-Proxy true; # nginx代理
d)fair(第三方插件)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream resinserver{ server 192.168.1.10:8080; server 192.168.1.11:8080; fair; }
e)url_hash(第三方插件)
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存服務器時比較有效。 在upstream中加入hash語句,hash_method是使用的hash算法。
upstream resinserver{ server 192.168.1.10:8080; server 192.168.1.11:8080; hash $request_uri; hash_method crc32; }
設備的狀態:
down 表示單前的server暫時不參與負載
weight 權重,默認為1。 weight越大,負載的權重就越大。
max_fails 允許請求失敗的次數默認為1。當超過最大次數時,返回proxy_next_upstream 模塊定義的錯誤
fail_timeout max_fails次失敗后,暫停的時間。
backup 備用服務器, 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這台機器壓力會最輕。
下面是負載均衡實現原理拓撲圖(多層負載)
Nginx反向代理模塊配置方法示例說明:
location ~* \.(mp3|mp4)$ { //匹配URL以MP3或者MP4結尾的請求 proxy_pass http://localhost:8080 //轉發到本機8080端口 } location / { //匹配任意URL proxy_pass http://localhost:8081 //轉發到本機8081端口 proxy_set_header X-Forwarded-For $remote_addr //保留用戶真實IP } location指令可以直接匹配字符串,也可以進行正則表達式匹配 ~表示區分大小寫,~*表示不區分大小寫匹配,=表示精確匹配 proxy_pass指令可以根據location匹配的情況建立前后端的代理映射關系 X-Forwarded-For用於實現定義數據包頭,記錄用戶真實IP
Nginx負載均衡模塊配置方法示例說明:
upstream backend { ip_hash; server web1.test.com weight 1; server web2.test.com weight 2; server web3.test.com ; } server { listen 80; server_name web.test.com; location / { proxy_pass http://backend; } } upstream定義后端服務器集合,backend是服務器組名 proxy-pass和fastcgi_pass將請求轉發給一組服務器 ip_hash可以根據用戶ip地址的hash值分配固定的后端服務器
2)Nginx負載均衡案例解析
服務器名稱 網路配置
nginx.test.com eth0:111.122.155.133
eth1:192.168.1.2
web1.test.com eht0:192.168.1.3
web2.test.com eth0:192.168.1.4
web3.test.com eth0:192.168.1.5
3台web機器配置:
在web1 web2 web3上安裝httpd並配置網卡。操作步驟如下:(下面是web1的操作,web2和web3的操作步驟類似。注意修改紅色部分的參數)
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
IPADDR=192.168.1.3
NETMASK=255.255.255.0
GATEWAY=192.168.1.2
ONBOOT=yes
TYPE=Ethernet
接着執行下面命令:
# service network restart
# yum install -y httpd
# iptables -F
# iptables -X
# service iptables save
# setenforce 0
# sed -i s/enforcing/disabled/g /etc/sysconfig/selinux
# echo "web1 192.168.1.3" > /var/www/html/index.html
# service httpd restart
# chkconfig httpd on
nginx代理服務器配置
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 BOOTPROTO=static IPADDR=111.122.155.133 NETMASK=255.255.255.0 GATEWAY=111.122.155.0 ONBOOT=yes TYPE=Ethernet
# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1 BOOTPROTO=static IPADDR=192.168.1.2 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 ONBOOT=yes TYPE=Ethernet
接着執行下面命令:
# service network restart # iptables -F # iptables -X # service iptables save # setenforce 0 # sed -i s/enforcing/disabled/g /etc/sysconfig/selinux # wget http://nginx.org/download/nginx-1.6.3.tar.gz # tar zxf nginx-1.6.3.tar.gz -C /usr/src/ # yum install gcc pcre pcre-devel openssl openssl-devel gd gd-devel perl perl-ExtUtils-Embed # cd /usr/src/nginx-1.6.3/ # ./configure --prefix=/usr/local/nginx --with-ipv6 --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_dav_module --with-http_gzip_static_module --with-http_perl_module --with-mail_ssl_module # make && make install
接着修改nginx配置文件
# vim /usr/local/nginx/conf/nginx.conf
user nobody; worker_processes 1; error_log logs/error.log notice; pid logs/nginx.pid; events { worker_connections 5024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" '; sendfile on; tcp_nopush on; server_tokens off; keepalive_timeout 65; keepalive_requests 100; gzip on; //開啟壓縮 gzip_min_length 1000; //小於1000B內容不壓縮 gzip_buffers 16 32k; //壓縮緩存的個數和容量 gzip_types text/plain application/xml; //指定壓縮文件類型 gzip_comp_level 2; //壓縮級別為2,數字越大壓縮效果越好 client_body_buffer_size 128k; //允許客戶端請求緩存大小 client_max_body_size 100m; //允許請求的最大文件容量 large-client_header_buffers 4 8k; // proxy_buffering on; //開啟代理緩沖功能 proxy_buffer_size 8k; //第一部分響應數據的緩存大小 proxy_buffers 8 128k; //響應數據的緩存個數和容量 proxy_cache_path /usr/local/nginx/cache levels=1:2 keys_zone=one:100m inactive=1d max_size=2G; //設置緩存目錄,levels設置緩存個數,keys_zone定義緩存名字和容量,inactive定義緩存存活時間,max_size定義硬盤的緩存容量 proxy_connect_timeout 60s; //與后端服務器建立TCP連接握手超時時間 upstream servers { //ip_hash;ip_hash確保相同客戶端ip使用相同的后端服務器,不適用就默認輪詢 server 192.168.1.3:80 max_fails=3 fail_timeout=30s weight=2; server 192.168.1.4:80 max_fails=3 fail_timeout=30s weight=2; server 192.168.1.5:80 max_fails=3 fail_timeout=30s weight=2; } server { listen 80; server_name web.test.com; access_log logs/host.access.log main; location / { proxy_pass http://servers; proxy_cache one; proxy_set_header X-Forwarded-For $remote_addr; } }}
配置完成執行:
# echo "/usr/local/nginx/sbin/nginx" >> /etc/rc.local
最后瀏覽器訪問http://192.168.1.2 或者http://111.122.155.133 刷新將分別得到不同的web頁面信息
3)Nginx rewrite規則
nginx的rewrite語法格式和apache非常相似,rewrite regex replacement [flag],其中flag可以被設置為last結束當前指令並重新搜索location匹配、break結束當前rewrite指令、redirect臨時重定向302、permanent永久重定向301。
rewrite地址重寫及return應用的語法解析:
根據瀏覽器標識,訪問資源重定向到指定文件目錄,下面用IE瀏覽器示例:
if ($http_user_agent ~ MSIE ) { rewrite ^(.*)$ /msie/$1 break; }
將移動客戶端的請求重定向到其他服務器:
if ($http_user_agent ~* '(iphone|ipod)' ) { rewrite ^.+ http://mobile.site.com$uri; }
用戶使用POST方式請求數據時候,返回405:
if ($request_method = POST ) { return 405; }
訪問admin時候重定向到admin目錄:
location /php_admin { rewrite ^/php_admin/.*$ /admin permanent; }
-------------------------------------------下面詳細說下nginx的rewrite重寫指令用法-------------------------------------------
nginx通過ngx_http_rewrite_module模塊支持url重寫、支持if條件判斷,但不支持else。
該模塊需要PCRE支持,因此應在編譯nginx時指定PCRE源碼目錄, nginx安裝方法。
1)Nginx Rewrite 基本標記 (flags)
last 基本上都用這個Flag。相當於Apache里的[L]標記,表示完成rewrite,不再匹配后面的規則 break 中止 Rewirte,不再繼續匹配 redirect 返回臨時重定向的HTTP狀態302 permanent 返回永久重定向的HTTP狀態301。原有的url支持正則,重寫的url不支持正則
2)正則表達式匹配,其中:
* ~ 為區分大小寫匹配 * ~* 為不區分大小寫匹配 * !~和!~* 分別為區分大小寫不匹配及不區分大小寫不匹配
3)文件及目錄匹配,其中:
* -f 和!-f 用來判斷是否存在文件 * -d 和!-d 用來判斷是否存在目錄 * -e 和!-e 用來判斷是否存在文件或目錄 * -x 和!-x 用來判斷文件是否可執行
4)Nginx的一些可用的全局變量,可用做條件判斷:
$args $content_length $content_type $document_root $document_uri $host $http_user_agent $http_cookie $limit_rate $request_body_file $request_method $remote_addr $remote_port $remote_user $request_filename $request_uri $query_string $scheme $server_protocol $server_addr $server_name $server_port $uri
nginx的rewrite指令執行順序:
1)執行server塊的rewrite指令(這里的塊指的是server關鍵字后{}包圍的區域,其它xx塊類似) 2)執行location匹配 3)執行選定的location中的rewrite指令 如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件 如果循環超過10次,則返回500 Internal Server Error錯誤
break指令
語法:break;
默認值:無
作用域:server,location,if
停止執行當前虛擬主機的后續rewrite指令集。
break指令實例:
if ($slow) { limit_rate 10k; break; }
if指令
語法:if(condition){...}
默認值:無
作用域:server,location
對給定的條件condition進行判斷。如果為真,大括號內的rewrite指令將被執行。
if條件(conditon)可以是如下任何內容:
1)一個變量名;false如果這個變量是空字符串或者以0開始的字符串; 2)使用= ,!= 比較的一個變量和字符串 3)是用~, ~*與正則表達式匹配的變量,如果這個正則表達式中包含},;則整個表達式需要用" 或' 包圍 4)使用-f ,!-f 檢查一個文件是否存在 5)使用-d, !-d 檢查一個目錄是否存在 6)使用-e ,!-e 檢查一個文件、目錄、符號鏈接是否存在 7)使用-x , !-x 檢查一個文件是否可執行
if指令實例:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; } if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } if ($request_method = POST) { return 405; } if ($slow) { limit_rate 10k; } if ($invalid_referer) { return 403; }
return指令
語法: return code; return code URL; return URL; 默認值:無 作用域:server,location,if 停止處理並返回指定狀態碼(code)給客戶端。 非標准狀態碼444,表示關閉連接且不給客戶端發響應頭。 從0.8.42版本起,return 支持響應URL重定向(對於301,302,303,307),或者文本響應(對於其他狀態碼). 對於文本或者URL重定向可以包含變量
rewrite指令
語法:rewrite regex replacement [flag]; 默認值:無 作用域:server,location,if 如果一個URI匹配指定的正則表達式regex,URI就按照replacement重寫。 rewrite按配置文件中出現的順序執行。flags標志可以停止繼續處理。 如果replacement以"http://"或"https://"開始,將不再繼續處理,這個重定向將返回給客戶端。 flag可以是如下參數: last 停止處理后續rewrite指令集,然后對當前重寫的新URI在rewrite指令集上重新查找。 break 停止處理后續rewrite指令集,並不在重新查找,但是當前location內剩余非rewrite語句和location外的非rewrite語句可以執行。 redirect 如果replacement不是以http:// 或https://開始,返回302臨時重定向 permant 返回301永久重定向 最終完整的重定向URL包括請求scheme(http://,https://等),請求的server_name_in_redirect和port_in_redirec三部分 ,說白了也就是http協議、域名、端口三部分組成。
rewrite實例說明:
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
如果這些rewrite放到 “/download/” location如下所示, 那么應使用break而不是last , 使用last將循環10次匹配,然后返回500錯誤:
location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; }
對於重寫后的URL(replacement)包含原請求的請求參數,原URL的?后的內容。如果不想帶原請求的參數 ,
可以在replacement后加一個問號。如下,我們加了一個自定義的參數user=$1,然后在結尾處放了一個問號?,
把原請的參數去掉。
rewrite ^/users/(.*)$ /show?user=$1? last;
如果正則表達regex式中包含 “}” 或 “;”, 那么整個表達式需要用雙引號或單引號包圍.
rewrite_log指令
語法:rewrite_log on|off; 默認值:rewrite_log off; 作用域:http,server,location,if 開啟或關閉以notice級別打印rewrite處理日志到error log文件。
nginx打開rewrite log的配置:
rewrite_log on; error_log logs/xxx.error.log notice; 1)打開rewrite on 2)把error log的級別調整到notice
set指令
語法:set variable value; 默認值:none 作用域:server,location,if 定義一個變量並賦值,值可以是文本,變量或者文本變量混合體。
uninitialized_variable_warn指令
語法:uninitialized_variable_warn on | off; 默認值:uninitialized_variable_warn on 作用域:http,server,location,if 控制是否輸出為初始化的變量到日志
根據文件類型expires
# Add expires header for static content location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ { if (-f $request_filename) { root /data/www/wwwroot/bbs; expires 1d; break; } } # serve static files location ~ ^/(images|JavaScript|js|css|flash|media|static)/ { root /data/www/wwwroot/down; expires 30d; }
----------------------------------------Nginx多Server反向代理配置----------------------------------------
Nginx強大的正則表達式支持可以使server_name的配置變得很靈活。比如說想要做多用戶博客,那么每個用戶都會擁有自己的二級域名,這樣的話,可以靈活利用server_name配置也是很容易就實現的。
server_name的匹配順序
Nginx中的server_name指令主要用於配置基於名稱虛擬主機,server_name指令在接到請求后的匹配順序分別為:
1)准確的server_name匹配,例如: server { listen 80; server_name ssdr.info www.ssdr.info; ... } 2)以*通配符開始的字符串: server { listen 80; server_name *.ssdr.info; ... } 3)以*通配符結束的字符串: server { listen 80; server_name www.*; ... } 4)匹配正則表達式: server { listen 80; server_name ~^(?.+)\.howtocn\.org$; ... }
Nginx將按照上面1),2),3),4)的順序對server name進行匹配,只要有一項匹配以后就會停止搜索,所以在使用這個指令的時候一定要分清楚它的匹配順序(類似於location指令)。
server_name指令一項很實用的功能便是可以在使用正則表達式的捕獲功能,這樣可以盡量精簡配置文件,畢竟太長的配置文件日常維護也很不方便。
下面是2個具體的應用:
1)在一個server塊中配置多個站點:
server { listen 80; server_name ~^(www\.)?(.+)$; index index.php index.html; root /data/wwwsite/$2; } 站點的主目錄應該類似於這樣的結構: /data/wwwsite/ssdr.info /data/wwwsite/linuxtone.org /data/wwwsite/baidu.com /data/wwwsite/google.com 這樣就可以只使用一個server塊來完成多個站點的配置。
2)在一個server塊中為一個站點配置多個二級域名 。
實際網站目錄結構中通常會為站點的二級域名獨立創建一個目錄,同樣可以使用正則的捕獲來實現在一個server塊中配置多個二級域名:
server { listen 80; server_name ~^(.+)?\.howtocn\.org$; index index.html; if ($host = ssdr.info){ rewrite ^ http://www.ssdr.info permanent; } root /data/wwwsite/ssdr.info/$1/; } 站點的目錄結構應該如下: /data/wwwsite/ssdr.info/www/ /data/wwwsite/ssdr.info/nginx/ 這樣訪問www.ssdr.info時root目錄為/data/wwwsite/ssdr.info/www/,nginx.ssdr.info時為/data/wwwsite/ssdr.info/nginx/,以此類推。 后面if語句的作用是將ssdr.info的方位重定向到www.ssdr.info,這樣既解決了網站的主目錄訪問,又可以增加seo中對www.ssdr.info的域名權重。
多個正則表達式
如果你在server_name中用了正則,而下面的location字段又使用了正則匹配,這樣將無法使用$1,$2這樣的引用,解決方法是通過set指令將其賦值給一個命名的變量:
server { listen 80; server_name ~^(.+)?\.howtocn\.org$; set $www_root $1; root /data/wwwsite/ssdr.info/$www_root/; location ~ .*\.php?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwsite/ssdr.info/$fastcgi_script_name; include fastcgi_params; } }
Nginx不同域名反向代理到另一台服務器 proxy_pass和$host
想讓一個VPS專門做另一個VPS的前端,后端VPS每添加一個域名,前端VPS就要同時添加一個域名來反向代理,作為前端的VPS如果一個一個的添加后端VPS的域名,那么這個事情特別麻煩,能不能讓其自動反向代理后端VPS呢,用到proxy_pass和$host就可以輕松實現。
以下例子為了省事,以lnmp為安裝環境進行設置,修改前端VPS的nginx.conf文件,修改成以下內容:
server { listen 80; server_name $host; location / { proxy_pass http://www.31.gd/; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600; }
接着修改其他部分
location /.(php|php5)?$ { fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_index index.php; include fcgi.conf; } location /status { stub_status on; access_log off; } location /.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location /.(js|css)?$ { expires 12h; }
這樣就可以實現了前端VPS可以反向代理任意域名到后端VPS,只要將域名解析到前端VPS,后端VPS進行域名綁定,那么就可以直接訪問到了。
一台nginx帶多個域名多個tomcat情況的配置
多個域名,其中2個域名需支持泛域名解析:
1)www.abc.com
2)www.bcd.com
3)*.efg.com
4)*.hij.com
其中1),2),3)為一台tomcat,4)為獨立tomcat。前端一台nginx,通過配置多個虛擬主機來實現該部署。
進入/usr/local/nginx/conf/vhost目錄,所有虛擬主機的配置文件都在該目錄下存放。
配置支持泛域名
# # A virtual host using mix of IP-, name-, and port-based configuration # server { listen 81; server_name *.efg.com; location / { proxy_pass http://localhost: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; } } # # A virtual host using mix of IP-, name-, and port-based configuration # server { listen 81; server_name *.hij.com; location / { proxy_pass http://localhost:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Nginx 多域名配置
nginx綁定多個域名可又把多個域名規則寫一個配置文件里,也可又分別建立多個域名配置文件,我一般為了管理方便,每個域名建一個文件,有些同類域名也可又寫在一個總的配置文件里。
1)每個域名一個文件的寫法 首先打開nginx域名配置文件存放目錄:/usr/local/nginx/conf/vhost ,如要綁定域名www.wangshibo.com 則在此目錄建一個文件:www.wangshibo.com.conf 然后在此文件中寫規則,如: server { listen 80; server_name www.wangshibo.com; #綁定域名 index index.htm index.html index.php; #默認文件 root /home/www/wangshibo.com; #網站根目錄 include location.conf; #調用其他規則,也可去除 } 2)一個文件多個域名的寫法 一個文件添加多個域名的規則也是一樣,只要把上面單個域名重復寫下來就ok了,如: server { listen 80; server_name www.wangshibo.com; #綁定域名 index index.htm index.html index.php; #默認文件 root /home/www/wangshibo.com; #網站根目錄 include location.conf; #調用其他規則,也可去除 } server { listen 80; server_name msn.wangshibo.com; #綁定域名 index index.htm index.html index.php; #默認文件 root /home/www/msn.wangshibo.com; #網站根目錄 include location.conf; #調用其他規則,也可去除 } 3)不帶www的域名加301跳轉 如果不帶www的域名要加301跳轉,那也是和綁定域名一樣,先綁定不帶www的域名,只是不用寫網站目錄,而是進行301跳轉,如: server { listen 80; server_name wangshibo.com; rewrite ^/(.*) http://www.wangshibo.com/$1 permanent; } 4)添加404網頁 添加404網頁,都可又直接在里面添加,如: server { listen 80; server_name www.wangshibo.com; #綁定域名 index index.htm index.html index.php; #默認文件 root /home/www/wangshibo.com; #網站根目錄 include location.conf; #調用其他規則,也可去除 error_page 404 /404.html; } 最后還有一個方法需要注意,可能有需要禁止IP直接訪問80端口或者禁止非本站的域名綁定我們的IP,這樣的話應該 如下處理,放到最前一個server上面即可: server{ listen 80 default; server_name _; return 403; }