標籤:
Nginx強大的Regex支援,可以使server_name的配置變得很靈活,如果你要做多使用者部落格,那麼每個使用者擁有自己的次層網域也就很容易實現了。
server_name的匹配順序
Nginx中的server_name指令主要用於配置基於名稱虛擬機器主機,server_name指令在接到請求後的匹配順序分別為:
1、準確的server_name匹配,例如:
1 server { 2 listen 80; 3 server_name www.ooxx.com; 4 ... 5 }
2、以*萬用字元開始的字串:
1 server { 2 listen 80; 3 server_name *.ooxx.com; 4 ... 5 }
3、以*萬用字元結束的字串:
1 server { 2 listen 80; 3 server_name www.*; 4 ... 5 }
4、匹配Regex:
1 server { 2 listen 80; 3 server_name ~^(?.+)\.down\.org$; 4 ... 5 }
Nginx將按照1,2,3,4的順序對server name進行匹配,只有有一項匹配以後就會停止搜尋,所以我們在使用這個指令的時候一定要分清楚它的匹配順序(類似於location指令)。
server_name指令一項很實用的功能便是可以在使用Regex的捕獲功能,這樣可以盡量精簡設定檔,畢竟太長的設定檔日常維護也很不方便。下面是2個具體的應用:
在一個server塊中配置多個網站:
1 server 2 { 3 listen 80; 4 server_name ~^(www\.)?(.+)$; 5 index index.php index.html; 6 root /data/wwwsite/$2; 7 }
網站的主目錄應該類似於這樣的結構:
1 /data/wwwsite/ssdr.info 2 /data/wwwsite/linuxtone.org 3 /data/wwwsite/baidu.com 4 /data/wwwsite/google.com
這樣就可以只使用一個server塊來完成多個網站的配置。
在一個server塊中為一個網站配置多個次層網域 。
實際網站目錄結構中我們通常會為網站的次層網域獨立建立一個目錄,同樣我們可以使用正則的捕獲來實現在一個server塊中配置多個次層網域:
1 server 2 { 3 listen 80; 4 server_name ~^(.+)?\.howtocn\.org$; 5 index index.html; 6 if ($host = ssdr.info){ 7 rewrite ^ http://www.ssdr.info permanent; 8 } 9 root /data/wwwsite/ssdr.info/$1/; 10 }
網站的目錄結構應該如下:
1 /data/wwwsite/ssdr.info/www/ 2 /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的網域名稱權重。
多個Regex
如果你在server_name中用了正則,而下面的location欄位又使用了正則匹配,這樣將無法使用$1,$2這樣的引用,解決方案是通過set指令將其賦值給一個命名的變數:
1 server 2 { 3 listen 80; 4 server_name ~^(.+)?\.howtocn\.org$; 5 set $www_root $1; 6 root /data/wwwsite/ssdr.info/$www_root/; 7 location ~ .*\.php?$ { 8 fastcgi_pass 127.0.0.1:9000; 9 fastcgi_index index.php; 10 fastcgi_param SCRIPT_FILENAME /data/wwwsite/ssdr.info/$fastcgi_script_name; 11 include fastcgi_params; 12 } 13 }
Nginx不同網域名稱反向 Proxy到另一台伺服器 proxy_pass和$host
想讓一個VPS專門做另一個VPS的前端,後端VPS每添加一個網域名稱,前端VPS就要同時添加一個網域名稱來反向 Proxy,作為前端的VPS如果一個一個的添加後端VPS的網域名稱,那麼這個事情特別麻煩,能不能讓其自動反向 Proxy後端VPS呢,用到proxy_pass和$host就可以輕鬆實現。
以下例子為了省事,以lnmp為安裝環境進行設定
修改前端VPS的nginx.conf檔案,修改成以下內容:
1 server { 2 listen 80; 3 server_name $host; 4 location / { 5 proxy_pass http://www.31.gd/; 6 proxy_set_header Host $host; 7 proxy_redirect off; 8 proxy_set_header X-Real-IP $remote_addr; 9 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 10 proxy_connect_timeout 60; 11 proxy_read_timeout 600; 12 proxy_send_timeout 600; 13 }
下面的一併修改吧。
1 location /.(php|php5)?$ 2 { 3 fastcgi_pass unix:/tmp/php-cgi.sock; 4 fastcgi_index index.php; 5 include fcgi.conf; 6 } 7 location /status { 8 stub_status on; 9 access_log off; 10 } 11 location /.(gif|jpg|jpeg|png|bmp|swf)$ 12 { 13 expires 30d; 14 } 15 location /.(js|css)?$ 16 { 17 expires 12h; 18 }
這樣就可以實現了前端VPS可以反向 Proxy任意網域名稱到後端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,通過配置多個虛擬機器主機來實現該部署。
進入/etc/nginx/conf.d目錄,所有虛擬機器主機的設定檔都在該目錄下存放,配置。
配置支援泛網域名稱
1 # 2 # A virtual host using mix of IP-, name-, and port-based configuration 3 # 4 server { 5 listen 81; 6 server_name *.efg.com; 7 location / { 8 proxy_pass http://localhost:8080; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 } 13 } 14 # 15 # A virtual host using mix of IP-, name-, and port-based configuration 16 # 17 server { 18 listen 81; 19 server_name *.hij.com; 20 location / { 21 proxy_pass http://localhost:8081; 22 proxy_set_header Host $host; 23 proxy_set_header X-Real-IP $remote_addr; 24 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 25 } 26 }
泛網域名稱解析關鍵為紅色部分,如果沒有紅色部分,後端8080及8081口對應的tomcat虛擬機器主機將無法獲得網域名稱資訊,導致後端tomcat無法擷取到對應的網域名稱資訊。
後端TOMCAT支援泛網域名稱解析時,需要設定 host name 為 localhost 以支援泛網域名稱指向。
Nginx 多網域名稱配置
nginx綁定多個網域名稱可又把多個網域名稱規則寫一個設定檔裡,也可又分別建立多個網域名稱設定檔,我一般為了管理方便,每個網域名稱建一個檔案,有些同類網域名稱也可又寫在一個總的設定檔裡。
一、每個網域名稱一個檔案的寫法
首先開啟 nginx網域名稱設定檔存放目錄:/usr/local/nginx/conf/servers ,如要綁定網域名稱www.web126.com 則在此目錄建一個檔案:www.web126.com.conf 然後在此檔案中寫規則,如:
1 server 2 { 3 listen 80; 4 server_name www.web126.com; #綁定網域名稱 5 index index.htm index.html index.php; #預設檔案 6 root /home/www/web126.com; #網站根目錄 7 include location.conf; #調用其他規則,也可去除 8 }
然後重起nginx伺服器,網域名稱就綁定成功了。
Nginx伺服器重起命令:/etc/init.d/nginx restart。
二、一個檔案多個網域名稱的寫法
一個檔案添加多個網域名稱的規則也是一樣,只要把上面單個網域名稱重複寫下來就ok了,如:
1 server 2 { 3 listen 80; 4 server_name www.web126.com; #綁定網域名稱 5 index index.htm index.html index.php; #預設檔案 6 root /home/www/web126.com; #網站根目錄 7 include location.conf; #調用其他規則,也可去除 8 } 9 server 10 { 11 listen 80; 12 server_name msn.web126.com; #綁定網域名稱 13 index index.htm index.html index.php; #預設檔案 14 root /home/www/msn.web126.com; #網站根目錄 15 include location.conf; #調用其他規則,也可去除 16 }
三、不帶www的網域名稱加301跳轉
如果不帶www的網域名稱要加301跳轉,那也是和綁定網域名稱一樣,先綁定不帶www的網域名稱,只是不用寫網站目錄,而是進行301跳轉,如:
1 server 2 { 3 listen 80; 4 server_name web126.com; 5 rewrite ^/(.*) http://www.web126.com/$1 permanent; 6 }
四、添加404網頁
添加404網頁,都可又直接在裡面添加,如:
1 server 2 { 3 listen 80; 4 server_name www.web126.com; #綁定網域名稱 5 index index.htm index.html index.php; #預設檔案 6 root /home/www/web126.com; #網站根目錄 7 include location.conf; #調用其他規則,也可去除 8 error_page 404 /404.html; 9 }
最後還有一個方法需要注意,可能有需要禁止IP直接存取80連接埠或者禁止非本站的網域名稱綁定我們的IP,這樣的話應該
如下處理,放到最前一個server上面即可:
1 server{ 2 listen 80 default; 3 server_name _; 4 return 403; 5 }
五、Nginx多Server反向 Proxy配置