服務器-Nginx

          作者:NetSeek http://www.linuxtone.org (IT運維專家網|集群架構|性能調優)
          歡迎轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明.
          首發時間: 2008-11-25 更新時間:2009-1-14

          目 錄

          一、 Nginx 基礎知識
          二、 Nginx 安裝及調試
          三、 Nginx Rewrite
          四、 Nginx Redirect
          五、 Nginx 目錄自動加斜線:
          六、 Nginx Location
          七、 Nginx expires
          八、 Nginx 防盜鏈
          九、 Nginx 訪問控制
          十、 Nginx日志處理
          十一、 Nginx Cache
          十二、 Nginx 負載均衡
          十三、 Nginx簡單優化
          十四、 如何構建高性能的LEMP環境
          十五、 Nginx服務監控
          十六、 常見問題與錯誤處理.
          十七、 相關資源下載

          【前言】:

          編寫此技術指南在于推廣普及NGINX在國內的使用,更方便的幫助大家了解和掌握NGINX
          的一些使用技巧。本指南很多技巧來自于網絡和工作中或網絡上朋友們問我的問題.在此對
          網絡上愿意分享的朋友們表示感謝和致意!歡迎大家和我一起豐富本技術指南提出更好的建
          議!請朋友們關注: http://www.linuxtone.org 技術分享社區! 互想學習共同進步!

          一、 Nginx 基礎知識

          1、簡介
          Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服
          務器。 Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的,它已經在該站點運行超
          過兩年半了。Igor 將源代碼以類BSD許可證的形式發布。盡管還是測試版,但是,Nginx 已經因為它的穩
          定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名了。

          更多的請見官方wiki: http://wiki.codemongers.com/

          2、 Nginx的優點
          nginx做為HTTP服務器,有以下幾項基本特性:
          1) 處理靜態文件,索引文件以及自動索引;打開文件描述符緩沖.
          2) 無緩存的反向代理加速,簡單的負載均衡和容錯.
          3) FastCGI,簡單的負載均衡和容錯.
          4) 模塊化的結構。包括gzipping, byte ranges, chunked responses, 以及 SSI-filter等filter。
          如果由FastCGI或其它代理服務器處理單頁中存在的多個SSI,則這項處理可以并行運行,而不
          需要相互等待。
          5) 支持SSL 和 TLS SNI.
          Nginx專為性能優化而開發,性能是其最重要的考量, 實現上非常注重效率 。它支持內核Poll模型,
          能經受高負載的考驗, 有報告表明能支持高達 50,000 個并發連接數。

          Nginx具有很高的穩定性。其它HTTP服務器,當遇到訪問的峰值,或者有人惡意發起慢速連接時,
          也很可能會導致服務器物理內存耗盡頻繁交換,失去響應,只能重啟服務器。例如當前apache一旦上到
          200個以上進程,web響應速度就明顯非常緩慢了。而Nginx采取了分階段資源分配技術,使得它的CPU與
          內存占用率非常低。nginx官方表示保持10,000個沒有活動的連接,它只占2.5M內存,所以類似DOS這
          樣的攻擊對nginx來說基本上是毫無用處的。就穩定性而言, nginx比lighthttpd更勝一籌。

          Nginx支持熱部署。它的啟動特別容易, 并且幾乎可以做到7*24不間斷運行,即使運行數個月也不
          需要重新啟動。你還能夠在不間斷服務的情況下,對軟件版本進行進行升級。

          Nginx采用master-slave模型, 能夠充分利用SMP的優勢,且能夠減少工作進程在磁盤I/O的阻
          塞延遲。當采用select()/poll()調用時,還可以限制每個進程的連接數。

          Nginx代碼質量非常高,代碼很規范, 手法成熟, 模塊擴展也很容易。特別值得一提的是強大
          的Upstream與Filter鏈。 Upstream為諸如reverse proxy, 與其他服務器通信模塊的編寫奠定了很好的
          基礎。而Filter鏈最酷的部分就是各個filter不必等待前一個filter執行完畢。它可以把前一個filter
          的輸出做為當前filter的輸入,這有點像Unix的管線。這意味著,一個模塊可以開始壓縮從后端服務器
          發送過來的請求,且可以在模塊接收完后端服務器的整個請求之前把壓縮流轉向客戶端。

          Nginx采用了一些os提供的最新特性如對sendfile (Linux 2.2+),accept-filter (FreeBSD
          4.1+),TCP_DEFER_ACCEPT (Linux 2.4+) 的支持,從而大大提高了性能

          二、 Nginx 安裝及調試

          1、Pcre 安裝

          ./configure
          make && make install
          cd ../

          2. nginx 編譯安裝

          /configure --user=www --group=www --prefix=/usr/local/nginx/ --with-http_stub_status_module
          --with-openssl=/usr/local/openssl

          make && make install

          更詳細的模塊定制與安裝請參照官方wiki.

          3、Nginx 配置文件測試:

          # /usr/local/nginx/sbin/nginx -t //Debug 配置文件的關鍵命令需要重點撐握.

          2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf
          syntax is ok
          2008/12/16 09:08:35 [info] 28412#0: the configuration file /usr/local/nginx/conf/nginx.conf was
          tested successfully

          3、 Nginx 啟動:

          # /usr/local/nginx/sbin/nginx

          4、 Nginx 配置文件修改重新加載:

          # kill -HUP `cat /usr/local/nginx/logs/nginx.pid `

          三、 Nginx Rewrite

          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 用來判斷文件是否可執行

          3. 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 Redirect

          將所有linuxtone.org與netseek.linuxtone.org域名全部自跳轉到http://www.linuxtone.org

          server {
              listen 80;
              server_name linuxtone.org netseek.linuxtone.org;
              index index.html index.php;
              root /data/www/wwwroot;
              if ($host !~ "^www\.linxtone\.org$") {
                  rewrite ^(.*) http://www.linuxtone.org$1 redirect;
              }
              .....................
          }

          五、 Nginx 目錄自動加斜線:

          if (-d $request_filename){
              rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
          }

          六、 Nginx Location

          1.基本語法:[和上面rewrite正則匹配語法基本一致]
          location [=|~|~*|^~] /uri/ { … }
          ~ 為區分大小寫匹配
          ~* 為不區分大小寫匹配
          !~ 和 !~* 分別為區分大小寫不匹配及不區分大小寫不匹配

          示例1:

          location = / {
              # matches the query / only.
              # 只匹配 / 查詢。
          }

          匹配任何查詢,因為所有請求都已 / 開頭。但是正則表達式規則和長的塊規則將被優先和查詢匹配

          示例2:

          location ^~ /images/ {
              # matches any query beginning with /images/ and halts searching,
              # so regular expressions will not be checked.
              # 匹配任何以 /images/ 開頭的任何查詢并且停止搜索。任何正則表達式將不會被測試。
          }

          示例3:

          location ~* \.(gif|jpg|jpeg)$ {
              # matches any request ending in gif, jpg, or jpeg. However, all
              # requests to the /images/ directory will be handled by
              # 匹配任何以 gif、jpg 或 jpeg 結尾的請求。
          }

          七、 Nginx expires

          1.根據文件類型判斷,添加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;
              }
          }

          2、根據某個目錄判斷,添加expires

          # serve static files
          location ~ ^/(images|javascript|js|css|flash|media|static)/ {
              root /data/www/wwwroot/down;
              expires 30d;
          }

          八、 Nginx 防盜鏈

          1. 針對不同的文件類型

          #Preventing hot linking of images and other file types
          location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
              valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost baidu.com;
              if ($invalid_referer) {
                  rewrite ^/ http://www.linuxtone.org/images/default/logo.gif;
                  # return 403;
              }
          }

          2. 針對不同的目錄

          location /img/ {
              root /data/www/wwwroot/bbs/img/;
              valid_referers none blocked server_names *.linuxtone.org http://localhost baidu.com;
              if ($invalid_referer) {
                  rewrite ^/ http://www.linuxtone.org/images/default/logo.gif;
                  #return 403;
              }
          }

          3. 同實現防盜鏈和expires的方法

          #Preventing hot linking of images and other file types
          location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ {
              valid_referers none blocked server_names *.linuxtone.org linuxtone.org http://localhost ;
              if ($invalid_referer) {
                  rewrite ^/ http://www.linuxtone.org/images/default/logo.gif;
              }
              access_log off;
              root /data/www/wwwroot/bbs;
              expires 1d;
              break;
          }

          九、 Nginx 訪問控制

          1. Nginx 身份證驗證

          #cd /usr/local/nginx/conf
          #mkdir htpasswd
          /usr/local/apache2/bin/htpasswd -c /usr/local/nginx/conf/htpasswd/tongji linuxtone

          #添加用戶名為linuxtone
          New password: (此處輸入你的密碼)
          Re-type new password: (再次輸入你的密碼)
          Adding password for user

          http://count.linuxtone.org/tongji/data/index.html(目錄存在/data/www/wwwroot/tongji/data/目錄

          下)

          將下段配置放到虛擬主機目錄,當訪問http://count.linuxtone/tongji/即提示要密驗證:

          location ~ ^/(tongji)/ {
              root /data/www/wwwroot/count;
              auth_basic "LT-COUNT-TongJi";
              auth_basic_user_file /usr/local/nginx/conf/htpasswd/tongji;
          }

          2. Nginx 禁止訪問某類型的文件.

          如,Nginx下禁止訪問*.txt文件,配置方法如下.

          location ~* \.(txt|doc)$ {
              if (-f $request_filename) {
                  root /data/www/wwwroot/linuxtone/test;
                  #rewrite …..可以重定向到某個URL
                  break;
              }
          }

          方法2:

          location ~* \.(txt|doc)${
              root /data/www/wwwroot/linuxtone/test;
              deny all;
          }

          實例:
          禁止訪問某個目錄

          location ~ ^/(WEB-INF)/ {
              deny all;
          }

          3. 使用ngx_http_access_module限制ip訪問

          location / {
              deny 192.168.1.1;
              allow 192.168.1.0/24;
              allow 10.1.1.0/16;
              deny all;
          }

          詳細參見wiki: http://wiki.codemongers.com/NginxHttpAccessModule#allow

          4. Nginx 下載限制并發和速率

          limit_zone linuxtone $binary_remote_addr 10m;
          server {
              listen 80;
              server_name down.linuxotne.org;
              index index.html index.htm index.php;
              root /data/www/wwwroot/down;
              #Zone limit
              location / {
                  limit_conn linuxtone 1;
                  limit_rate 20k;
              }
              ..........
          }

          只允許客房端一個線程,每個線程20k.

          【注】limit_zone linuxtone $binary_remote_addr 10m; 這個可以定義在主的

          5. Nginx 實現Apache一樣目錄列表

          location / {
              autoindex on;
          }

          6. 上文件大小限制
          主配置文件里加入如下,具體大小根據你自己的業務做調整。

          client_max_body_size 10m;

          十、 Nginx 日志處理

          1.Nginx 日志切割

          #contab -e
          59 23 * * * /usr/local/sbin/logcron.sh /dev/null 2>&1

          # cat /usr/local/sbin/logcron.sh

          #!/bin/bash

          log_dir="/data/logs"

          time=`date +%Y%m%d`

          /bin/mv ${log_dir}/access_linuxtone.org.log ${log_dir}/access_count.linuxtone.org.$time.log
          kill -USR1 `cat /var/run/nginx.pid`

          更多的日志分析與處理就關注(同時歡迎你參加討論):http://bbs.linuxtone.org/forum-8-1.html

          2.利用AWSTATS分析NGINX日志
          設置好Nginx日志格式,仍后利用awstats進行分析.
          請參考: http://bbs.linuxtone.org/thread-56-1-1.html

          3. Nginx 如何不記錄部分日志
          日志太多,每天好幾個G,少記錄一些,下面的配置寫到server{}段中就可以了

          location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
              access_log off;
          }

          十一、Nginx Cache服務配置

          如果需要將文件緩存到本地,則需要增加如下幾個子參數:

          proxy_store on;
          proxy_store_access user:rw group:rw all:rw;
          proxy_temp_path 緩存目錄;

          其中,
          proxy_store on 用來啟用緩存到本地的功能,
          proxy_temp_path 用來指定緩存在哪個目錄下,如:proxy_temp_path html;

          在經過上一步配置之后,雖然文件被緩存到了本地磁盤上,但每次請求仍會向遠端拉取
          文件,為了避免去遠端拉取文件,必須修改proxy_pass:

          if ( !-e $request_filename) {
              proxy_pass http://mysvr;
          }

          即改成有條件地去執行proxy_pass,這個條件就是當請求的文件在本地的
          proxy_temp_path指定的目錄下不存在時,再向后端拉取。

          更多更高級的應用可以研究ncache,官方網站: http://code.google.com/p/ncache/

          詳細安裝請參照http://bbs.linuxtone.org 應用加速版ncache相關的貼子.

          十二、Nginx 負載均衡

          1. Nginx 負載均衡基礎知識

          nginx的upstream目前支持4種方式的分配

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

          2)、weight
          指定輪詢幾率,weight和訪問比率成正比,用于后端服務器性能不均的情況。

          2)、ip_hash
          每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。

          3)、fair(第三方)
          按后端服務器的響應時間來分配請求,響應時間短的優先分配。

          4)、url_hash(第三方)

          2. Nginx 負載均衡實例1

          upstream bbs.linuxtone.org { #定義負載均衡設備的Ip及設備狀態
              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://bbs.linuxtone.org/;

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

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

          client_body_in_file_only 設置為On 可以講client post過來的數據記錄到文件中用來做debug
          client_body_temp_path 設置記錄文件的目錄 可以設置最多3層目錄
          location 對URL進行匹配.可以進行重定向或者進行新的代理 負載均衡

          3. Nginx 負載均衡實例 2
          按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩
          存時比較有效,也可以用作提高Squid緩存命中率.

          簡單的負載均等實例:
          #vi nginx.conf //nginx主配置文件核心配置
          .........

          #loadblance my.linuxtone.org
          upstream my.linuxtone.org {
              ip_hash;
              server 127.0.0.1:8080;
              server 192.168.169.136:8080;
              server 219.101.75.138:8080;
              server 192.168.169.117;
              server 192.168.169.118;
              server 192.168.169.119;
          }
          .........
          include vhosts/linuxtone_lb.conf;
          .........

          # vi proxy.conf

          proxy_redirect off;
          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 50m;
          client_body_buffer_size 256k;
          proxy_connect_timeout 30;
          proxy_send_timeout 30;
          proxy_read_timeout 60;
          proxy_buffer_size 4k;
          proxy_buffers 4 32k;
          proxy_busy_buffers_size 64k;
          proxy_temp_file_write_size 64k;
          proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
          proxy_max_temp_file_size 128m;
          proxy_store on;
          proxy_store_access user:rw group:rw all:r;
          #nginx cache
          #client_body_temp_path /data/nginx_cache/client_body 1 2;
          proxy_temp_path /data/nginx_cache/proxy_temp 1 2;

          #vi linuxtone_lb.conf

          server {

              listen 80;
              server_name my.linuxtone.org;
              index index.php;
              root /data/www/wwwroot/mylinuxtone;

              if (-f $request_filename) {
                  break;
              }

              if (-f $request_filename/index.php) {
                  rewrite (.*) $1/index.php break;
              }

              error_page 403 http://my.linuxtone.org/member.php?m=user&a=login;

              location / {
                  if ( !-e $request_filename) {
                      proxy_pass http://my.linuxtone.org;
                      break;
                  }
                  include /usr/local/nginx/conf/proxy.conf;
              }
          }

          十三、Nginx簡單優化

          1. 減小nginx編譯后的文件大小 (Reduce file size of nginx)
          默認的nginx編譯選項里居然是用debug模式(-g)的(debug模式會插入很多跟蹤和
          ASSERT之類),編譯以后一個nginx有好幾兆。去掉nginx的debug模式編譯,編譯以
          后只有幾百K

          在 auto/cc/gcc,最后幾行有:

          # debug
          CFLAGS=”$CFLAGS -g”

          注釋掉或刪掉這幾行,重新編譯即可。

          2. 修改Nginx的header偽裝服務器

          1) 修改nginx.h

          #vi nginx-0.7.30/src/core/nginx.h
          #define NGINX_VERSION "1.8"
          #define NGINX_VER "LTWS/" NGINX_VERSION
          #define NGINX_VAR "NGINX"
          #define NGX_OLDPID_EXT ".oldbin"

          2) 修改nginx_http_header_filter_module
          #vi nginx-0.7.30/src/http/ngx_http_header_filter_module.c
          將如下

          static char ngx_http_server_string[] = "Server: nginx" CRLF;

          修改為

          static char ngx_http_server_string[] = "Server: LTWS" CRLF;

          a) 修改nginx_http_header_filter_module
          #vi nginx-0.7.30/src/http/ngx_http_special_response.c
          將如下:

          static u_char ngx_http_error_full_tail[] =
          "<hr><center>" NGINX_VER "</center>" CRLF
          "</body>" CRLF
          "</html>" CRLF
          ;

          static u_char ngx_http_error_tail[] =
          "<hr><center>nginx</center>" CRLF
          "</body>" CRLF
          "</html>" CRLF
          ;

          修改為:

          static u_char ngx_http_error_full_tail[] =
          "<center> "NGINX_VER" </center>" CRLF
          "<hr><center>http://www.linuxtone.org</center>" CRLF
          "</body>" CRLF
          "</html>" CRLF
          ;

          static u_char ngx_http_error_tail[] =
          "<hr><center>LTWS</center>" CRLF
          "</body>" CRLF
          "</html>" CRLF
          ;

          修改后重新編譯一下環境,

          404錯誤的時候顯示效果圖(如果沒有指定錯誤頁的話):

          利用curl命令查看服務器header

          3. 為特定的CPU指定CPU類型編譯優化.

          默認nginx使用的GCC編譯參數是-O

          需要更加優化可以使用以下兩個參數

          --with-cc-opt='-O3' \

          --with-cpu-opt=opteron \

          使得編譯針對特定CPU以及增加GCC的優化.

          此方法僅對性能有所改善并不會有很大的性能提升,供朋友們參考.

          CPUD類型確定:

          # cat /proc/cpuinfo | grep "model name"

          編譯優化參數參考:http://en.gentoo-wiki.com/wiki/Safe_Cflags

          4. Tcmalloc優化Nginx 性能

          # wget http://download.savannah.gnu.org/releases/libunwind/libunwind-0.99-alpha.tar.gz
          # tar zxvf libunwind-0.99-alpha.tar.gz
          # cd libunwind-0.99-alpha/
          # CFLAGS=-fPIC ./configure
          # make CFLAGS=-fPIC
          # make CFLAGS=-fPIC install
          # wget http://google-perftools.googlecode.com/files/google-perftools-0.98.tar.gz
          # tar zxvf google-perftools-0.98.tar.gz
          # cd google-perftools-0.98/
          # ./configure
          # make && make install
          # echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
          # ldconfig
          # lsof -n | grep tcmalloc

          編譯nginx 加載google_perftools_module:

          ./configure --with-google_perftools_module

          在主配置文件加入nginx.conf 添加:

          google_perftools_profiles /path/to/profile;

          5. 內核參數優化
          # vi /etc/sysctl.conf

          #在末尾增加以下內容:
          net.ipv4.tcp_fin_timeout = 30
          net.ipv4.tcp_keepalive_time = 300
          net.ipv4.tcp_syncookies = 1
          net.ipv4.tcp_tw_reuse = 1
          net.ipv4.tcp_tw_recycle = 1
          net.ipv4.ip_local_port_range = 5000 65000

          #使配置立即生效
          /sbin/sysctl -p

          十四、如何構建高性的LEMP

          請參見: http://www.linuxtone.org/lemp/lemp.pdf

          1、 提供完整的配置腳本下載:http://www.linuxtone.org/lemp/scripts.tar.gz
          2、 提供NGINX常見配置范例含(虛擬主機,防盜鏈,Rewrite,訪問控制,負載均衡Discuz相關程序靜態化及等等),你只要稍稍修改即可線上應用。
          3、將原版的xcache替換成EA,并提供相關簡單調優腳本及配置文件。

          更多的及更新資料請關注: http://www.linuxtone.org

          十五、Nginx監控

          1、 RRDTOOL+Perl腳本畫圖監控
          先安裝好rrdtool ,關于rrdtool本文不作介紹,具體安裝請參照linuxtone監控版塊.

          #cd /usr/local/sbnin
          #wget http://blog.kovyrin.net/files/mrtg/rrd_nginx.pl.txt
          #mv rrd_nginx.pl.txt rrd_nginx.pl
          #chmod a+x rrd_nginx.pl

          #vi rrd_nginx.pl //配置腳本文件設置好路徑

          #!/usr/bin/perl
          use RRDs;
          use LWP::UserAgent;

          # define location of rrdtool databases
          my $rrd = '/data/www/wwwroot/nginx/rrd';

          # define location of images
          my $img = '/data/www/wwwroot/nginx/html';

          # define your nginx stats URL
          my $URL = "http:// 219.32.205.13/nginx_status";
          …………

          【注】根據自己具體的狀況修改相應的路徑.

          #crontab –e //加入如下

          * * * * * /usr/local/sbin/rrd_nginx.pl

          重啟crond后,通過配置nginx虛擬主機指到/data/www/wwwroot/nginx/html目錄,通過crond
          自動執行perl腳本會生成很多圖片.

          http://xxx/connections-day.png即可看到服務器狀態圖。

          2、 官方Nginx-rrd 監控服務(多虛擬主機)(推薦)
          網址:http://www.nginx.eu/nginx-rrd.html

          此解決方案其實是基于上述監控方案的一個改進和增強,同樣先安裝好rrdtool這個畫圖工
          具和相應的perl模塊再做如下操作:

          # yum install perl-HTML*

          先建立好生成的庫存和圖片存放錄

          #mkdir -p /data/www/wwwroot/nginx/{rrd,html}
          #cd /usr/local/sbin
          #wget http://www.nginx.eu/nginx-rrd/nginx-rrd-0.1.4.tgz
          #tar zxvf nginx-rrd-0.1.4.tgz
          #cd nginx-rrd-0.1.4
          #cd etc/
          #cp nginx-rrd.conf /etc
          #cd etc/cron.d
          #cp nginx-rrd.cron /etc/cron.d
          #cd /usr/local/src/nginx-rrd-0.1.4/html
          # cp index.php /data/www/wwwroot/nginx/html/
          #cd /usr/local/src/nginx-rrd-0.1.4/usr/sbin
          #cp * /usr/sbin/

          #vi /etc/nginx-rrd.conf

          #####################################################
          #
          # dir where rrd databases are stored

          RRD_DIR="/data/www/wwwroot/nginx/rrd";

          # dir where png images are presented

          WWW_DIR="/data/www/wwwroot/nginx/html";

          # process nice level

          NICE_LEVEL="-19";

          # bin dir

          BIN_DIR="/usr/sbin";

          # servers to test

          # server_utl;server_name

          SERVERS_URL="http://219.32.205.13/nginx_status;219.32.205.13

          http://www.linuxtone.org/nginx_status;www.linuxtone.org"" //根據你的具體情況做調整.

          SEVERS_URL 格式 http://domain1/nginx_status;domain1 http://domain2/nginx_status;domain2

          這種格式監控多虛擬主機連接狀態:
          重點啟crond服務,仍后通過http://219.32.205.13/nginx/html/ 即可訪問。配置過程很簡單!

          3、 CACTI模板監控Nginx

          利用Nginx_status狀態來畫圖實現CACTI監控
          nginx編譯時允許http_stub_status_module

          # vi /usr/local/nginx/conf/nginx.conf

          location /nginx_status {
              stub_status on;
              access_log off;
              allow 192.168.1.37;
              deny all;
          }
          # kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
          # wget http://forums.cacti.net/download.php?id=12676
          # tar xvfz cacti-nginx.tar.gz
          # cp cacti-nginx/get_nginx_socket_status.pl /data/cacti/scripts/
          # cp cacti-nginx/get_nginx_clients_status.pl /data/cacti/scripts/
          # chmod 755 /data/cacti/scripts/get_nginx*

          檢測插件
          # /data/cacti/scripts/get_nginx_clients_status.pl http://192.168.1.37/nginx_status

          在cacti管理面板導入

          cacti_graph_template_nginx_clients_stat.xml
          cacti_graph_template_nginx_sockets_stat.xml

          十六、常見問題與錯誤處理

          1、 400 bad request錯誤的原因和解決辦法
          配置nginx.conf相關設置如下.

          client_header_buffer_size 16k;
          large_client_header_buffers 4 64k;

          根據具體情況調整,一般適當調整值就可以。

          2、 Nginx 502 Bad Gateway錯誤

          proxy_next_upstream error timeout invalid_header http_500 http_503;

          或者嘗試設置:

          large_client_header_buffers 4 32k;

          3、 Nginx出現的413 Request Entity Too Large錯誤

          這個錯誤一般在上傳文件的時候會出現,

          編輯Nginx主配置文件Nginx.conf,找到http{}段,添加

          client_max_body_size 10m; //設置多大根據自己的需求作調整.

          如果運行php的話這個大小client_max_body_size要和php.ini中的如下值的最大值
          一致或者稍大,這樣就不會因為提交數據大小不一致出現的錯誤。

          post_max_size = 10M
          upload_max_filesize = 2M

          4、 解決504 Gateway Time-out(nginx)

          遇到這個問題是在升級discuz論壇的時候遇到的

          一般看來, 這種情況可能是由于nginx默認的fastcgi進程響應的緩沖區太小造成的,
          這將導致fastcgi進程被掛起, 如果你的fastcgi服務對這個掛起處理的不好, 那么最后就
          極有可能導致504 Gateway Time-out

          現在的網站, 尤其某些論壇有大量的回復和很多內容的, 一個頁面甚至有幾百K。

          默認的fastcgi進程響應的緩沖區是8K, 我們可以設置大點

          在nginx.conf里, 加入:

          fastcgi_buffers 8 128k

          這表示設置fastcgi緩沖區為8×128k

          當然如果您在進行某一項即時的操作, 可能需要nginx的超時參數調大點,例如設置成60秒:

          send_timeout 60;

          只是調整了這兩個參數, 結果就是沒有再顯示那個超時, 可以說效果不錯, 但是也
          可能是由于其他的原因, 目前關于nginx的資料不是很多, 很多事情都需要長期的經驗
          累計才有結果, 期待您的發現哈!

          5、 如何使用Nginx Proxy

          朋友一臺服務器運行tomcat 為8080端口,IP:192.168.1.2:8080,另一臺機器
          IP:192.168.1.8. 朋友想通過訪問http://192.168.1.8即可訪問tomcat服務.配置如下:

          在192.168.1.8的nginx.conf上配置如下:

          server {
              listen 80;
              server_name java.linuxtone.org
              location / {
                  proxy_pass http://192.168.1.2:8080;
                  include /usr/local/nginx/conf/proxy.conf;
              }
          }

          6、 如何關閉Nginx的LOG

          access_log /dev/null;
          error_log /dev/null;


          posted on 2012-07-06 11:09 陳睿 閱讀(469) 評論(0)  編輯  收藏 所屬分類: 服務器


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2012年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 平顶山市| 桃园县| 精河县| 焉耆| 桐庐县| 青冈县| 专栏| 弥勒县| 肃宁县| 永州市| 疏勒县| 吉首市| 清水县| 玉田县| 芮城县| 遂昌县| 商丘市| 常山县| 平湖市| 北宁市| 扶风县| 孟村| 平江县| 泰来县| 姜堰市| 宁陕县| 英德市| 托克托县| 兴安盟| 德保县| 乾安县| 库伦旗| 平遥县| 惠东县| 阿合奇县| 洪雅县| 龙陵县| 黎城县| 抚松县| 金门县| 东乡族自治县|