細介 Niginx配置與反向代理

            細介Nigix配置與反向代理

Nginx(發音同 engine x)是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler(俄文:Рамблер)使用。  其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁伺服器中表現較好.目前中國大陸使用nginx網站用戶有:新浪、網易、 騰訊,另外知名的微網誌Plurk也使用nginx。

官方文檔:http://wiki.nginx.org/Main

 

#運行用戶
user data;    
#啓動進程,通常設置成和cpu的數量相等
worker_processes  1;

#全局錯誤日誌及PID文件
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

#工作模式及連接數上限
events {
    use   epoll;             #epoll是多路複用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上內核,可以大大提高nginx的性能
    worker_connections  1024;#單個後臺worker process進程的最大併發鏈接數
    # multi_accept on; 
}

#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
     #設定mime類型,類型由mime.type文件定義
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #設定日誌格式
    access_log    /var/log/nginx/access.log;

   #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,
    #必須設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,降低系統的uptime.
    sendfile        on;
    #tcp_nopush     on;

   #單個進程最大連接數(最大連接數=連接數*進程數)

    worker_connections 65535;

}

#連接超時時間

 #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;
    
    #開啓gzip壓縮
    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    #設定請求緩衝
    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    #設定負載均衡的服務器列表
     upstream mysvr {
    #weigth參數表示權值,權值越高被分配到的機率越大
    #本機上的Squid開啓3128端口
    server 192.168.8.1:3128 weight=5;
    server 192.168.8.2:80  weight=1;
    server 192.168.8.3:80  weight=6;
    }

   server {
    #偵聽80端口
        listen       80;
        #定義使用www.xx.com訪問
        server_name  www.xx.com;

        #設定本虛擬主機的訪問日誌
        access_log  logs/www.xx.com.access.log  main;

#默認請求

    location / {
          root   /root;      #定義服務器的默認網站根目錄位置
          index index.php index.html index.htm;   #定義首頁索引文件的名稱

          fastcgi_pass  www.xx.com;
         fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name; 
          include /etc/nginx/fastcgi_params;
        }

    # 定義錯誤提示頁面
    error_page   500 502 503 504 /50x.html;  
        location = /50x.html {
        root   /root;
    }

#靜態文件,nginx自己處理
    location ~ ^/(p_w_picpaths|javascript|js|css|flash|media|static)/ {
        root /var/www/virtual/htdocs;
        #過期30天,靜態文件不怎麼更新,過期可以設大一點,如果頻繁更新,則可以設置得小一點。
        expires 30d;
    }

    #PHP 腳本請求全部轉發到 FastCGI處理使用FastCGI默認配置.
    location ~ \.php$ {
        root /root;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
        include fastcgi_params;
   }
   #設定查看Nginx狀態的地址
    location /NginxStatus {
        stub_status            on;
        access_log              on;
        auth_basic              "NginxStatus";
        auth_basic_user_file  conf/htpasswd;
    }
    #禁止訪問 .htxxx 文件
    location ~ /\.ht {
        deny all;
    }
     
     }
}

以上是一些基本的配置,使用Nginx最大的好處就是負載均衡

如果要使用負載均衡的話,可以修改配置http節點如下:

#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
     #設定mime類型,類型由mime.type文件定義
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #設定日誌格式
    access_log    /var/log/nginx/access.log;

    #省略上文有的一些配置節點

  #設定負載均衡的服務器列表
     upstream mysvr {
    #weigth參數表示權值,權值越高被分配到的機率越大
    server 192.168.8.1x:3128 weight=5;#本機上的Squid開啓3128端口
    server 192.168.8.2x:80  weight=1;
    server 192.168.8.3x:80  weight=6;
    }

   upstream mysvr2 {
    #weigth參數表示權值,權值越高被分配到的機率越大

    server 192.168.8.x:80  weight=1;
    server 192.168.8.x:80  weight=6;
    }

   #第一個虛擬服務器

     server {
    #偵聽192.168.8.x80端口
          listen       80;
          server_name  192.168.8.x;

      #aspx後綴的進行負載均衡請求
          location ~ .*\.aspx$ {

         root   /root;      #定義服務器的默認網站根目錄位置
          index index.php index.html index.htm;   #定義首頁索引文件的名稱

          proxy_pass  http://mysvr ;#請求轉向mysvr 定義的服務器列表

          #以下是一些反向代理的配置可刪除.

          proxy_redirect off;

          #後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          client_max_body_size 10m;    #允許客戶端請求的最大單文件字節數
          client_body_buffer_size 128k;  #緩衝區代理緩衝用戶端請求的最大字節數,
          proxy_connect_timeout 90;  #nginx跟後端服務器連接超時時間(代理連接超時)
          proxy_send_timeout 90;        #後端服務器數據回傳時間(代理髮送超時)
          proxy_read_timeout 90;         #連接成功後,後端服務器響應時間(代理接收超時)
          proxy_buffer_size 4k;             #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
          proxy_buffers 4 32k;               #proxy_buffers緩衝區,網頁平均在32k以下的話,這樣設置

          proxy_busy_buffers_size 64k;    #高負荷下緩衝大小(proxy_buffers*2
          proxy_temp_file_write_size 64k;  #設定緩存文件夾大小,大於這個值,將從upstream服務器傳

       }

     }
}

#設定http服務器

http

{

include mime.types; #文件擴展名與文件類型映射表

default_type application/octet-stream; #默認文件類型

#charset utf-8; #默認編碼

server_names_hash_bucket_size 128; #服務器名字的hash表大小

client_header_buffer_size 32k; #上傳文件大小限制

large_client_header_buffers 4 64k; #設定請求緩

client_max_body_size 8m; #設定請求緩

sendfile on; #開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,如果用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off

autoindex on; #開啓目錄列表訪問,合適下載服務器,默認關閉。

tcp_nopush on; #防止網絡阻塞

tcp_nodelay on; #防止網絡阻塞

keepalive_timeout 120; #長連接超時時間,單位是秒

 

#FastCGI相關參數是爲了改善網站的性能:減少資源佔用,提高訪問速度。下面參數看字面意思都能理解。

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

 

#gzip模塊設置

gzip on; #開啓gzip壓縮輸出

gzip_min_length 1k; #最小壓縮文件大小

gzip_buffers 4 16k; #壓縮緩衝區

gzip_http_version 1.0; #壓縮版本(默認1.1,前端如果是squid2.5請使用1.0

gzip_comp_level 2; #壓縮等級

gzip_types text/plain application/x-javascript text/css application/xml;

#壓縮類型,默認就已經包含textml,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn

gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m; #開啓限制IP連接數的時候需要使用

 

upstream blog.ha97.com {

#upstream的負載均衡,weight是權重,可以根據機器配置定義權重。weigth參數表示權值,權值越高被分配到的機率越大。

server 192.168.80.121:80 weight=3;

server 192.168.80.122:80 weight=2;

server 192.168.80.123:80 weight=3;

}

 

#虛擬主機的配置

server

{

#監聽端口

listen 80;

#域名可以有多個,用空格隔開

server_name www.ha97.com ha97.com;

index index.html index.htm index.php;

root /data/www/ha97;

location ~ .*.(php|php5)?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

#圖片緩存時間設置

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 10d;

}

#JSCSS緩存時間設置

location ~ .*.(js|css)?$

{

expires 1h;

}

#日誌格式設定

log_format access '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $http_x_forwarded_for';

#定義本虛擬主機的訪問日誌

access_log ar/loginx/ha97access.log access;

 

#對 "/" 啓用反向代理

location / {

proxy_pass http://127.0.0.1:88;

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

#後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#以下是一些反向代理的配置,可選。

proxy_set_header Host $host;

client_max_body_size 10m; #允許客戶端請求的最大單文件字節數

client_body_buffer_size 128k; #緩衝區代理緩衝用戶端請求的最大字節數,

proxy_connect_timeout 90; #nginx跟後端服務器連接超時時間(代理連接超時)

proxy_send_timeout 90; #後端服務器數據回傳時間(代理髮送超時)

proxy_read_timeout 90; #連接成功後,後端服務器響應時間(代理接收超時)

proxy_buffer_size 4k; #設置代理服務器(nginx)保存用戶頭信息的緩衝區大小

proxy_buffers 4 32k; #proxy_buffers緩衝區,網頁平均在32k以下的設置

proxy_busy_buffers_size 64k; #高負荷下緩衝大小(proxy_buffers*2

proxy_temp_file_write_size 64k;

#設定緩存文件夾大小,大於這個值,將從upstream服務器傳

}

 

#設定查看Nginx狀態的地址

location /NginxStatus {

stub_status on;

access_log on;

auth_basic "NginxStatus";

auth_basic_user_file confpasswd;

#htpasswd文件的內容可以用apache提供的htpasswd工具來產生。

}

 

#本地動靜分離反向代理配置

#所有jsp的頁面均交由tomcatresin處理

location ~ .(jsp|jspx|do)?$ {

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://127.0.0.1:8080;

}

#所有靜態文件由nginx直接讀取不經過tomcatresin

location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

{ expires 15d; }

location ~ .*.(js|css)?$

{ expires 1h; }

}

}

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、匹配正則表達式:

1. server { 

2. listen 80; 

3. server_name ~^(?.+)\.howtocn\.org$; 

4. ... 

5. 

Nginx將按照1,2,3,4的順序對server name進行匹配,只有有一項匹配以後就會停止搜索,所以我們在使用這個指令的時候一定要分清楚它的匹配順序(類似於location指令)。

server_name指令一項很實用的功能便是可以在使用正則表達式的捕獲功能,這樣可以儘量精簡配置文件,畢竟太長的配置文件日常維護也很不方便。下面是2個具體的應用:

在一個server塊中配置多個站點:

1. server 

2. 

3. listen 80; 

4. server_name ~^(www\.)?(.+)$; 

5. index index.php index.html; 

6. root /data/wwwsite/$2; 

7. 

站點的主目錄應該類似於這樣的結構:

/data/wwwsite/ssdr.info 

/data/wwwsite/linuxtone.org 

/data/wwwsite/baidu.com 

/data/wwwsite/google.com 

這樣就可以只使用一個server塊來完成多個站點的配置。

在一個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,通過配置多個虛擬主機來實現該部署。

進入/etc/nginx/conf.d目錄,所有虛擬主機的配置文件都在該目錄下存放,配置。

配置支持泛域名 

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; 

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; 

      

        

泛域名解析關鍵爲紅色部分,如果沒有紅色部分,後端8080及8081口對應的tomcat虛擬主機將無法獲得域名信息,導致後端tomcat無法獲取到對應的域名信息。

後端TOMCAT支持泛域名解析時,需要設置 host name 爲 localhost 以支持泛域名指向。

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服務器,域名就綁定成功了。

謝謝!

 

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章