Nginx安裝配置詳解

jopen 9年前發布 | 21K 次閱讀 Nginx Web服務器

1.   Nginx安裝

1)下載Nginx: wget http://nginx.org/download/nginx-1.3.11.tar.gz /opt/ 

2)安裝Nginx: 

./configure 
--user=www --group=www  
--prefix=/usr/local/nginx  
--with-http_stub_status_module  
--with-http_ssl_module  
--with-http_sub_module  
--with-md5=/usr/lib - 
-with-sha1=/usr/lib  
--with-http_gzip_static_module

       認安裝的路徑是/usr/local/nginx

  1. --with-http_stub_status_module #nginx狀態
  2. --with-http_ssl_module #支持HTTPS
  3. --with-http_sub_module #支持URL重定向
  4. --with-pcre=/usr/include/pcre/ (啟用正規表達式)  
  5. --with-md5=/usr/lib #md5是一種加密算法
  6. --with-http_memcached_module (啟用memcache緩存) 
  7. --with-http_rewrite_module (啟用支持url重寫) 
  8. --with-sha1=/usr/lib #安全哈希算法(Secure Hash Algorithm)主要適用于數字簽名標準(Digital Signature Standard DSS)里面定義的數字簽名算法(Digital Signature Algorithm DSA)對于長度小于2^64位的消息,SHA1會產生一個160位的消息摘要。當接收到消息的時候,這個消息摘要可以用來驗證數據的完整性。在傳輸的過程中,數據很可能會發生變化,那么這時候就會產生不同的消息摘要
  9. --with-http_gzip_static_module #這個模塊在一個預壓縮文件傳送到開啟Gzip壓縮的客戶端之前檢查是否已經存在以“.gz”結尾的壓縮文件,這樣可以防止文件被重復壓縮
然后make; make install

3)啟動及重啟  
啟動:/usr/local/nginx/sbin/nginx  
重啟:kill -HUP `cat /usr/local/nginx/logs/nginx.pid` 

停止nginx:pkill -9 nginx

測試配置文件:nginx -t 

2.  安裝php的php-fpmn

裝php5.3.5

./configure  --prefix=/usr/local/php   -enable-fpm

make;make install;

這里最重要的是 --enable-fpm。因為默認情況下Nginx和PHP他倆之間是一點感覺沒有的。在之前,很多朋友都搭建過 Apache+PHP,Apache+PHP編譯后生成的是模塊文件,而Nginx+PHP需要PHP生成可執行文件才可以,所以要利用fastcgi技術來實現N ginx與PHP的整合,這個只要我們安裝是啟用FastCGI即可。此次我們安裝PHP不僅使用了FastCGI,而且還使用了PHP-FPM這么一個東東,PHP-FPM說白了是一個管理FastCGI的一個管理器,它作為PHP的插件純在,在安裝PHP要想使用PHP-FPM時在老php的老版本就需要把PHP-FPM以補丁的形式安裝到PHP中,而且PHP要與PHP-FPM版本一致,這是必須的)

PHP-FPM是一個PHP FastCGI管理器(php-FastCGI Process Manager),是只用于PHP的。 
PHP-FPM其實是PHP源代碼的一個補丁,旨在將FastCGI進程管理整合進PHP包中。必須將它patch到你的PHP源代碼中,在編譯安裝PHP后才可以使用。 
相對Spawn-FCGI,PHP-FPM在CPU和內存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。 
PHP5.3.3已經集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置,比spawn-fcgi具有更多優點,所以被PHP官方收錄了。在./configure的時候帶 –enable-fpm參數即可開啟PHP-FPM。


       fastcgi已經在php5.3.5的core中了,不必再configure時--enable-fastcgi了。老版本的需要加,比如5.2。

php-fpm進行啟動:/usr/local/php/sbin/php-fpm 

需要配置php/etc/php-fpm.conf:

listen_address  127.0.0.1:9000 #這個表示php的fastcgi進程監聽的ip地址以及端口
user=nobody 表示php的fastcgi進程以什么用戶以來運行,默認該行是注釋掉的,需要打開
group=nobody  表示php的fastcgi進程以什么用戶組來運行,默認該行是注釋掉的,需要打開
display_errors  0  是否顯示php錯誤信息
max_children 5  最大的子進程數目

啟動錯誤:m.min_spare_servers(0) must be a positive value 。 
編輯php-fpm.conf找到pm.min_spare_server ;pm.min_spare_servers = 5 去除";"號 
也可使用sed -i 's/;pm.min_spare_servers/pm.min_spare_servers/g' /usr/local/php/etc/php-fpm.conf 進行替換


提示錯誤:Nov 20 17:57:14.210553 [ALERT] [pool www] pm.max_spare_servers(0) must be a positive value 
編輯php-fpm.conf找到pm.max_spare_servers = 35 和pm.min_spare_servers = 5 去除";"號

 

提示錯誤:Nov 20 17:58:55.248268 [WARNING] [pool www] pm.start_servers is not set. It's been set to 20 
編輯php-fpm.conf找到 pm.start_servers = 20去除";"號 
啟動成功。 

啟用 php-fpm 的 slow log 日志:

啟用 php-fpm 的 slow log 日志,查看執行時間過長的php文件,并將執行時間過長的進程直接終止掉!看看效果如何!

具體操作方法也簡單,就修改一個文件,執行命令:# vi /usr/local/php/etc/php-fpm.conf   如果在這個php-fpm.conf 文件找不到 可以再/etc/php-fpm.d/www.conf 文件里面找 

PHP 5.3.3 之前版本設置如下:

The timeout (in seconds) for serving a single request after which the worker process will be terminated       Should be used when 'max_execution_time' ini option does not stop script execution for some reason       '0s' means 'off'      
  request_terminate_timeout"> 10s     
  The timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file       '0s' means 'off'      
  request_slowlog_timeout"> 1s   
    The log file for slow requests      
 logs/slow.log

PHP 5.3.3 之后版本設置如下:

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'. 
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) 
; Default Value: 0 request_slowlog_timeout = 1s 
; The log file for slow requests 
; Default Value: /usr/local/php/log/php-fpm.log.slow slowlog = /usr/local/php/log/php-fpm.log.slow ; The timeout for serving a single request after which the worker process will 
; be killed. This option should be used when the 'max_execution_time' ini option 
; does not stop script execution for some reason. A value of '0' means 'off'. 
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays) ; Default Value: 0 request_terminate_timeout = 10s

注: request_terminate_timeout 將執行時間太長的進程直接終止

request_slowlog_timeout 將執行過慢的文件寫入日志

以后即可根據慢執行日志 /usr/local/php/logs/slow.log 來優化程序文件了!

 

3.  配置Nginx運行php

5)#配置Nginx可以運行php

編譯nginx.conf加入如下語句: 
       location ~ \.php$ { 
        root html;    
        fastcgi_pass 127.0.0.1:9000; 指定了fastcgi進程偵聽的端口,nginx就是通過這里與php交互的 
        fastcgi_index index.php; 
        include fastcgi_params; 
        fastcgi_param SCRIPT_FILENAME   /usr/local/nginx/html$fastcgi_script_name; 
}
6)Nginx PHP 返回200,但是空白頁

ngxin;php-fpm安裝后,html靜態頁面沒問題,但是phpinfo頁面雖然返回200,但總是空白頁

也沒有任何報錯,考慮應該是nginx已經將php頁面轉移給php處理了,所以問題應該在php的配置上,經過查找,發現需要在nginx中加入一句話 
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

安裝完nginx后默認的fastcgi_params配置文件中沒有上面這句話。

在nginx.conf中的 
        location ~ .php$ { 
            root           html; 
            fastcgi_pass   127.0.0.1:9000; 
            fastcgi_index  index.php; 
            #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name; 
            fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; 
            include        fastcgi_params; 
        } 
或者在fastcgi_params配置文件中加入 
# PHP only, required if PHP was built with --enable-force-cgi-redirect 
fastcgi_param  REDIRECT_STATUS    200; 
fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;

然后重啟nginx就可以顯示出頁面了。

4.  Nginx詳細配置

  nginx.conf配置文件的結構:

user www-data www-data;  使用的用戶和組(可以只設置用戶而已)
worker_processes 8;      #啟動進程
error_log  logs/error.log;  #指定錯誤日志存放的路徑
worker_rlimit_nofile 51200; #指定文件描述符數量

#工作模式及連接數上限
events {
     use epoll; #提高linux的io操作選項,Linux系統推薦采用epoll模型,FreeBSD系統推薦采用kequeue,linux下建議開啟
     worker_connections      51200; #允許最大連接數,即單個后臺worker process進程的最大并發鏈接數
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
    #設定負載均衡的服務器列表
    upstream php_server_pool{
    }

    upstream message_server_pool{

    }
    #第一個虛擬主機,反向代理php_server_pool這組服務器
    server {   
         #處理默認請求
        location /{
            root  /root;      #定義服務器的默認網站根目錄位置    
            proxy_pass http://php_server_pool;
        }

    }

   #第二個虛擬主機,反向代理php_server_pool這組服務器
    server {
        listen 80;
        server_name www1.yourdomain.com;

        #訪問http://www1.yourdomain.com/message/***地址,反向代理message_server_pool這組服務器
        location / {
            proxy_pass http://message_server_pool;
            proxy_set_header Host $host;
        }

        #訪問除了/message/之外的http://www1.yourdomain.com/***,反向代理php_server_pool這組服務器
        location /message/
        {
            #DNS解析服務器的IP地址,可以在IE 工具-Internet選項-連接-局域網設置-代理服務器 中設置代理服務器IP地址和端口
            resolver 8.8.8.8;
            #該指令用于設置被代理服務器端口或套接字,以及URI
            proxy_pass http://php_server_pool;
            #該指令可以設置哪些從后端服務器傳送過來的文件被Nginx存儲。on保持文件與alias或root指令設置的目錄一致,參數off不存儲文件
            #proxy_store /data/www$original_uri;
            proxy_store on;
            #該指令用于指定創建文件和目錄的權限
            proxy_store_access user:rw group:rw all:r;
            #指定一個本地目錄來緩沖較大的代理請求
            proxy_temp_path /data/temp;
            #該指令用于在URL和文件系統路徑之間實現映射。
            alias /data/www;
            #該指令允許重新定義或添加Header行道轉發給被代理服務器的請求信息中,它的值可以是文本,也可以是變量,或者是文本和變量的組合。
            #使用$host變量,它的值相當于服務器的主機名(如果使用域名訪問,則該值為域名;如果使用IP訪問,則該值為IP)。此外可以將主機名和被代理服務器的端口一起傳遞  $host:$proxy_port
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;

        }
    }

} 




        
在此記錄下Nginx服務器nginx.conf的配置文件說明, 部分注釋收集與網絡.

#使用的用戶和組(可以只設置用戶而已) 
user www-data www-data; 
#啟動進程,通常設置成和cpu的數量相等(一般等于CPU的總核數或者總核數的兩倍),每個進程耗費10MB-12MB內存 
worker_processes 8; 
#指定錯誤日志存放的路徑,錯誤日志記錄級別可選項為:[debug | info | noticd | warn | error | crit] 
error_log  logs/error.log; 
#指定錯誤日志級別 
#error_log  logs/error.log  notice; 
#error_log  logs/error.log  info; 
#指定pid存放的路徑,文件內記錄當前nginx主進程的ID,kill -HUP 'logs/nginx.pid' 

#pid        logs/nginx.pid;

#指定文件描述符數量 
worker_rlimit_nofile 51200;  

#工作模式及連接數上限 
events { 
     use epoll; #提高linux的io操作選項,Linux系統推薦采用epoll模型,FreeBSD系統推薦采用kequeue,linux下建議開啟 
     worker_connections      51200; #允許最大連接數,即單個后臺worker process進程的最大并發鏈接數 

#設定http服務器,利用它的反向代理功能提供負載均衡支持 
http { 
    #mimie.types 瀏覽器請求的文件媒體類型,類型由mime.type文件定義 
    include       mime.types; 
    #用來告訴瀏覽器請求的文件媒體類型 
    default_type  application/octet-stream; 
    #設置使用的字符集,如果一個網站有多種字符集,請不要隨便設置,應該讓程序員在HTML代碼中通過Meta標簽設置 
    #charset gb2312; 
     
    #日志記錄格式 
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" ' 
    #                  '"$http_user_agent" "$http_x_forwarded_for"'; 
     
    #日志名稱,和日志記錄格式采用main 
    #access_log  logs/access.log  main; 

   

     #設定請求緩沖

    #保存服務器名字的hash表是由指令server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。參數hash bucket size總是等于hash表的大小,并且是一路處理器緩存大小的倍數。在減少了在內存中的存取次數后,使在處理器中加速查找hash表鍵值成為可能。如果 hash bucket size等于一路處理器緩存的大小,那么在查找鍵的時候,最壞的情況下在內存中查找的次數為2。第一次是確定存儲單元的地址,第二次是在存儲單元中查找鍵 值。因此,如果Nginx給出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一個參數的大小.

    server_names_hash_bucket_size 128;

    #用于設置客戶端請求的Header頭緩沖區大小,大部分情況1KB大小足夠。不能超過large_client_header_buffers緩沖區大小的設置 
    client_header_buffer_size 32k; 
    #該指令用于設置客戶端請求的Header頭緩沖區大小,默認值為4KB。 
    large_client_header_buffers 4 32k; 
    #設置客戶端能夠上傳的文件大小,默認為1m 
    client_max_body_size 8m; 

    

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

    sendfile on; 
    #該指令允許或禁止使用FreeBSD上的TCP_NOPUSH,或者Linux上的TCP_CORK套接字選項。 
    #tcp_nopush on; 

    

    #連接超時時間

    #keepalive_timeout  0該指令可以使客戶端到服務器端的連接持續有效 
    keepalive_timeout 60;     #客戶端到服務器端的連接持續有效時間為60 
    #該指令允許或禁止使用套接字選項TCP_NODELAY,僅適用于keep-alive連接 
    tcp_nodelay on; 
     
    fastcgi_connect_timeout 300; 
    fastcgi_send_timeout 300; 
    #該指令用于設置upstream模塊等待FastCGI進程發送數據的超時時間,默認值為60s; 

    fastcgi_read_timeout 200;

     #設置FastCGI服務器相應頭部的緩沖區

    #該指令設置FastCGI服務器相應頭部的緩沖區大小。通常情況,該緩沖區大小設置等于fastcgi_buffers指令設置的一個緩沖區的大小。 
    fastcgi_buffer_size 64k; 
    #該指令設置了讀取FastCGI進程返回信息的緩沖區數量和大小。 
    fastcgi_buffers 4 64k; 
     
    fastcgi_busy_buffers_size 128k; 
    fastcgi_temp_file_writer_size 128k; 
     #開啟gzip壓縮 
    #開啟gzip壓縮,對網頁文件、css、js、xml等啟動gzip壓縮,減少數據傳輸量,提高訪問速度。 
    gzip on; 
    #該指令允許壓縮的頁面最小字節數,頁面字節數從header頭中的Content-Length中進行獲取。 
    gzip_min_length 1k; 
    #設置系統獲取幾個單位的緩存用于存儲gzip的壓縮結果數據流。下面的設置代表16k為單位,按照原始數據大小以16k為單位的4倍申請內存。 
    gzip_buffers 4 16k; 
    #識別http的協議版本。 
    gzip_http_version 1.1; 
    #gzip壓縮比,1 壓縮比最小處理速度最快,9 壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu) 
    gzip_comp_level 2; 
    #匹配mime類型進行壓縮,無論是否指定,“text/html”類型總是會被壓縮的。
    gzip_types text/plain application/x-javascript text/css application/xml; 
    gzip_vary on; 
    #該指令定義了一個數據區,其中記錄會話狀態信息。  定義一個叫“crawler”的記錄去,總容量為10MB,以變量$binary_remote_addr作為會話的判斷基準(即一個地址一個會話) 
    #limit_zone crawler $binary_remote_addr 10m; 
     
    #允許客戶端請求的最大單個文件字節數 
    client_max_body_size 300m; 
     

    #緩沖區代理緩沖用戶端請求的最大字節數,可以理解為先保存到本地再傳給用戶

   如果把它設置為比較大的數值,例如256k,那么,無論使用firefox還是IE瀏覽器,來提交任意小于256k的圖片,都很正常。如果注釋該指令,使用默認的client_body_buffer_size設置,也就是操作系統頁面大小的兩倍,8k或者16k,問題就出現了。 
無論使用firefox4.0還是IE8.0,提交一個比較大,200k左右的圖片,都返回500 Internal Server Error錯誤 

    client_body_buffer_size 128k; 
     
    #跟后端服務器連接的超時時間_發起握手等候響應超時時間 
    proxy_connect_timeout 600; 
     
    #連接成功后_等候后端服務器響應時間_其實已經進入后端的排隊之中等候處理 
    proxy_read_timeout 600; 
     
    #后端服務器數據回傳時間_就是在規定時間內后端服務器必須傳完所有的數據 
    proxy_send_timeout 600; 
     
    #代理請求緩存區_這個緩存區會保存用戶的頭信息以供Nginx進行規則處理_一般只要能保存下頭信息即可 
    proxy_buffers 16k; 
     
    #同上 告訴Nginx保存單個用的幾個Buffer最大用多大空間 
    proxy_buffers 4 32k; 
     
    #如果系統很忙的時候可以申請更大的proxy_buffers 官方推薦*2 
    proxy_busy_buffers_size 64k; 
     
    #proxy緩存臨時文件的大小 
    proxy_temp_file_write_size 64k; 
   

#nginx的緩存配置主要使用 proxy_cache模塊實現,工作原理就是就用戶請求緩存到本地的某個目錄下,當再次請求時候,直接讀取緩存,從而減輕服務器鴨梨

 

    #緩存    proxy_temp_path和proxy_cache_path必須在同一個分區 
    proxy_temp_path /data2/proxy_temp_path; 
    #該指令用于設置緩存文件的存放路徑,設置緩存區名稱為cache_one ,內存緩存空間大小為200M,自動清除超過1天沒有被訪問的緩存數據,硬盤緩存空間大小為30GB 
    proxy_cache_path /data2/proxy_cache_path levels=1:2 keys_zone=cache_one:2000m inactive=1d max_size=30g; 
     
     
    #include指令,使用此指令,可以包含任何你想要包含的配置文件,支持文件名匹配。 
    #include vhosts/*.conf; 
     #設定負載均衡的服務器列表 
    upstream php_server_pool{ 
        #weight=NUMBER ——設置服務器的權重,權重數高被分配訪問數越高,默認權重1. 
        #max_fails=NUMBER——在參數fail_timeout指定的時間內對后端服務器請求失敗的次數,如果檢測到后端服務器無法連接及發生服務器錯誤(404錯誤除外),則標記為失敗。默認值為1.設置為0這關閉這項檢查 
        #fail_timeout=TIME——在經歷參數max_fails設置的失敗次數后,暫停的時間 
        #down——標記服務器為永久離線狀態,用于ip_hash指令 
        #backup——僅僅在非backup服務器全部繁忙的時候才啟動 
         
        #upstream模塊擁有以下變量: 
        #    $upstream_addr:處理請求的upstream服務器地址 
        #    $upstream_status:upstream服務器的應答狀態 
        #    $upstream_response_time:Upstream服務器響應時間(毫秒),多個響應以逗號和冒號分隔。 
        #    $upstream_http_$HEADER:任意的HTTP協議頭信息,例如:$upstream_http_host 
         
        server 192.168.1.10:80 weight=1 max_fails=2 fail_timeout=30s; 
        server 192.168.1.11:80 weight=1 max_fails=2 fail_timeout=30s; 
        server 192.168.1.12:80 weight=1 max_fails=2 fail_timeout=30s; 
    } 
     
    upstream message_server_pool{ 
        #ip_hash指令能夠將某個客戶端IP的請求通過哈希算法定位到同一臺后端服務器。但無法保證后端服務器的負載均衡,所以建議后端服務器能做到session共享來代替nginx的ip_hash方式。 
        #且如果后端服務器有時要從Nginx負載均衡中摘除一段時間,你必須將其標記為“down” 
        #ip_hash; 
        server 192.168.1.13:3245; 
        server 192.168.1.14:3245 down; 
    } 
     
    upstream bbs_server_pool{ 
        server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s; 
        server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s; 
        server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s; 
    } 
     
    #第一個虛擬主機,反向代理php_server_pool這組服務器 
    server 
    { 
        #該指令用于設置虛擬主機監聽的服務器地址和端口號。 
        #listen127.0.0.1:8080; 
        #listen 8000; 
        #listen *:8000; 
        #listen localhost:8000; 

        listen 80;

#定義使用訪問域名 

        server_name www.yourdomain.com; 
         
        #SSL加密瀏覽 
        ssl on 
        ssl_certificate www.yourdomain.com.crt; 
        ssl_certificate_key www.yourdomain.com.key; 

         

        #默認請求

        location / 

        {

root   /root;      #定義服務器的默認網站根目錄位置    

            #限制下載速度256KB/秒 
            limit_rate 256k; 
            #如果后端的服務器返回502、504、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另一臺服務器,實現故障轉移 
            proxy_next_upstream http_502  http_504 error timeout invalid_header; 
            proxy_pass http://php_server_pool; 
            proxy_set_header Host www.yourdomain.com; 
            proxy_set_header X-Forwarded-For $remote_addr; 
        } 
        #設定本虛擬主機的訪問日志 

         access_log /data1/logs/www.yourdomain.com_access.log;        

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

    } 
     
    #第二個虛擬主機,反向代理php_server_pool這組服務器 
    server 
    { 
        listen 80; 
        server_name www1.yourdomain.com; 
         
        #訪問http://www1.yourdomain.com/message/***地址,反向代理message_server_pool這組服務器 
        location / 
        { 
            proxy_pass http://message_server_pool; 
            proxy_set_header Host $host; 
        } 
         
        #訪問除了/message/之外的http://www1.yourdomain.com/***,反向代理php_server_pool這組服務器 
        location /message/ 
        { 
            #DNS解析服務器的IP地址,可以在IE 工具-Internet選項-連接-局域網設置-代理服務器 中設置代理服務器IP地址和端口 
            resolver 8.8.8.8; 
            #該指令用于設置被代理服務器端口或套接字,以及URI 
            proxy_pass http://php_server_pool; 
            #該指令可以設置哪些從后端服務器傳送過來的文件被Nginx存儲。on保持文件與alias或root指令設置的目錄一致,參數off不存儲文件 
            #proxy_store /data/www$original_uri; 
            proxy_store on; 
            #該指令用于指定創建文件和目錄的權限 
            proxy_store_access user:rw group:rw all:r; 
            #指定一個本地目錄來緩沖較大的代理請求 
            proxy_temp_path /data/temp; 
            #該指令用于在URL和文件系統路徑之間實現映射。 
            alias /data/www; 
            #該指令允許重新定義或添加Header行道轉發給被代理服務器的請求信息中,它的值可以是文本,也可以是變量,或者是文本和變量的組合。 
            #使用$host變量,它的值相當于服務器的主機名(如果使用域名訪問,則該值為域名;如果使用IP訪問,則該值為IP)。此外可以將主機名和被代理服務器的端口一起傳遞  $host:$proxy_port 
            proxy_set_header Host $host; 
            proxy_set_header X-Forwarded-For $remote_addr; 
             
        } 
         
        access_log /data1/logs/www.yourdomain.com_access.log;         
    } 
     
    #第三個虛擬主機 
    server 
    { 
        listen 80; 
        server_name bbs.yourdomain.com *.bbs.yourdomain.com; 
             
        location / 
        { 
            proxy_pass http://bbs_server_pool; 
            proxy_set_header Host $host; 
            proxy_set_header X-Forwarded-For $remote_addr; 
            #禁止指定的IP地址或者IP段訪問某些虛擬主機或目錄 
            #deny 192.168.1.1/24; 
            #允許指定的IP地址或者IP段訪問某些虛擬主機或目錄 
            #allow 192.168.1.0/24; 
             
        } 
         
        #不記錄日志 
        access_log off;         
    }                  
    #靜態文件,nginx自己處理 
    location ~ ^/(images|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最大的好處就是負載均衡

 

4.   補充說明

1)下

) use epoll;  

與apache相類,nginx針對不同的操作系統,有不同的事件模型

A)標準事件模型

Select、poll屬于標準事件模型,如果當前系統不存在更有效的方法,nginx會選擇select或poll

B)高效事件模型

Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造成內核崩潰。

Epoll:使用于Linux內核2.6版本及以后的系統。

/dev/poll:使用于Solaris 7 11/99+, HP/UX 11.22+ (eventport), IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

Eventport:使用于Solaris 10. 為了防止出現內核崩潰的問題, 有必要安裝安全補丁

2)

og_format main '$host $status [$time_local] $remote_addr [$time_local] $request_uri '

'"$http_referer" "$http_user_agent" "$http_x_forwarded_for" '

'$bytes_sent $request_time $sent_http_x_cache_hit';

log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';

$remote_addr與$http_x_forwarded_for用以記錄客戶端的ip地址;

$remote_user:用來記錄客戶端用戶名稱;

$time_local: 用來記錄訪問時間與時區;

$request: 用來記錄請求的url與http協議;

$status: 用來記錄請求狀態;成功是200,

$body_bytes_s ent :記錄發送給客戶端文件主體內容大小;

$http_referer:用來記錄從那個頁面鏈接訪問過來的;

$http_user_agent:記錄客戶毒啊瀏覽器的相關信息;

通常web服務器放在反向代理的后面,這樣就不能獲取到客戶的IP地址了,通過$remote_add拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,可以增加x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址;

3)nginx的upstream負載均衡模塊目前支持4種方式的分配

1、輪詢(默認)

每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。

2、weight 
指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。 
例如: 
upstream bakend { 
server 192.168.0.14 weight=10; 
server 192.168.0.15 weight=10; 
}

2、ip_hash 
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。 
例如: 
upstream bakend { 
ip_hash; 
server 192.168.0.14:88; 
server 192.168.0.15:80; 
}

3、fair(第三方) 
按后端服務器的響應時間來分配請求,響應時間短的優先分配。 
upstream backend { 
server server1; 
server server2; 
fair; 
}

4、url_hash(第三方)

按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。

例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法

upstream backend { 
server squid1:3128; 
server squid2:3128; 
hash $request_uri; 
hash_method crc32; 
}

tips:

upstream bakend{#定義負載均衡設備的Ip及設備狀態 
ip_hash; 
server 127.0.0.1:9090 down; 
server 127.0.0.1:8080 weight=2; 
server 127.0.0.1:6060; 
server 127.0.0.1:7070 backup; 

在需要使用負載均衡的server中增加 
proxy_pass http://bakend/;

每個設備的狀態設置為: 
1.down表示單前的server暫時不參與負載 
2.weight默認為1.weight越大,負載的權重就越大。 
3.max_fails:允許請求失敗的次數默認為1.當超過最大次數時,返回proxy_next_upstream模塊定義的錯誤 
4.fail_timeout:max_fails次失敗后,暫停的時間。 
5.backup: 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。

nginx支持同時設置多組的負載均衡,用來給不用的server來使用。

client_body_in_file_only設置為On 可以講client post過來的數據記錄到文件中用來做debug 
client_body_temp_path設置記錄文件的目錄 可以設置最多3層目錄

location對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡


)注釋:變量

Ngx_http_core_module模塊支持內置變量,他們的名字和apache的內置變量是一致的。

首先是說明客戶請求title中的行,例如$http_user_agent,$http_cookie等等。

此外還有其它的一些變量

$args此變量與請求行中的參數相等

$content_length等于請求行的“Content_Length”的值。

$content_type等同與請求頭部的”Content_Type”的值

$document_root等同于當前請求的root指令指定的值

$document_uri與$uri一樣

$host與請求頭部中“Host”行指定的值或是request到達的server的名字(沒有Host行)一樣

$limit_rate允許限制的連接速率

$request_method等同于request的method,通常是“GET”或“POST”

$remote_addr客戶端ip

$remote_port客戶端port

$remote_user等同于用戶名,由ngx_http_auth_basic_module認證

$request_filename當前請求的文件的路徑名,由root或alias和URI request組合而成

$request_body_file

$request_uri含有參數的完整的初始URI

$query_string與$args一樣

$sheeme http模式(http,https)盡在要求是評估例如

Rewrite ^(.+)$ $sheme://example.com$; Redirect;

$server_protocol等同于request的協議,使用“HTTP/或“HTTP/

$server_addr request到達的server的ip,一般獲得此變量的值的目的是進行系統調用。為了避免系統調用,有必要在listen指令中指明ip,并使用bind參數。

$server_name請求到達的服務器名

$server_port請求到達的服務器的端口號

$uri等同于當前request中的URI,可不同于初始值,例如內部重定向時或使用index

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!