天天看點

ubunt,cent OS安裝配置Nginx

Nginx 安裝

系統平台:CentOS release 6.6 (Final) 64位。

一、安裝編譯工具及庫檔案

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel
## ubunt
sudo apt-get install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

      

二、首先要安裝 PCRE

PCRE 作用是讓 Ngnix 支援 Rewrite 功能。

1、下載下傳 PCRE 安裝包,下載下傳位址: http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz

[[email protected] src]# wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz      
ubunt,cent OS安裝配置Nginx

2、解壓安裝包:

[[email protected] src]# tar zxvf pcre-8.35.tar.gz      

3、進入安裝包目錄

[[email protected] src]# cd pcre-8.35      

4、編譯安裝 

[[email protected] pcre-8.35]#./configure
[[email protected] pcre-8.35]# make && make install      

5、檢視pcre版本

[[email protected] pcre-8.35]# pcre-config --version      
ubunt,cent OS安裝配置Nginx

安裝 Nginx

1、下載下傳 Nginx,下載下傳位址:http://nginx.org/download/nginx-1.6.2.tar.gz

[[email protected] src]# wget http://nginx.org/download/nginx-1.9.15.tar.gz      

2、解壓安裝包

[[email protected] src]# tar zxvf nginx-1.9.15.tar.gz      

3、進入安裝包目錄

[[email protected] src]# cd nginx-1.9.15      

4、編譯安裝

[[email protected] nginx-1.6.2]#./configure --prefix=/opt/nginx[[email protected] nginx-1.6.2]# make
[[email protected] nginx-1.6.2]# make install      

5、檢視nginx版本

[[email protected] nginx-1.6.2]#/opt/nginx/sbin/nginx -v      

到此,nginx安裝完成。

    nginx.conf

#nginx程序數,建議設定為等于CPU總核心數。
worker_processes  ;
              #全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
              #程序檔案
pid        logs/nginx.pid;
              #一個nginx程序打開的最多檔案描述符數目,理論值應該是最多打開檔案數(系統的值ulimit -n)與nginx程序數相除,但是nginx配置設定請求并不均勻,是以建議與ulimit -n的值保持一緻。
# worker_rlimit_nofile 65535;


events {
              #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本核心中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;
              #單個程序最大連接配接數(最大連接配接數=連接配接數*程序數)
    worker_connections  ;
}


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; #設定請求緩                 #tcp_nopush on; #防止網絡阻塞
   #tcp_nodelay on; #防止網絡阻塞
   #keepalive_timeout 120; 



    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    # tcp_nopush     on;
                  #長連接配接逾時時間,機關是秒                
    keepalive_timeout  ;

  # gzip壓縮功能設定
    gzip on;
    gzip_min_length ;
    gzip_buffers     ;
    gzip_http_version .;
    gzip_comp_level ;
    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;

  # http_proxy 設定
    client_max_body_size   ;
    client_body_buffer_size   ;
    proxy_connect_timeout   ;
    proxy_send_timeout   ;
    proxy_read_timeout   ;
    proxy_buffer_size   ;
    proxy_buffers    ;
    proxy_busy_buffers_size   ;
    proxy_temp_file_write_size  ;
    proxy_temp_path   /usr/local/nginx/proxy_temp  ;

  # 設定負載均衡背景伺服器清單 
    upstream  localhost{ 
              #ip_hash; 
              server    max_fails= fail_timeout= ;  
              server    max_fails= fail_timeout= ;  
    }

  # 很重要的虛拟主機配置
    server {
        listen       ;
        server_name                localhost                ;
        root   html;
        charset utf-;

        #對 / 所有做負載均衡+反向代理
        location / {
            root   html;
            index  index.html index.htm;

            proxy_pass        http://localhost;  
            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;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

        }

        #靜态檔案,nginx自己處理
        location  ~* /download/ {  
            root               download                ;  

        }
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$   
        {   
            root images;   
            expires      ; 
        }
        location /nginx_status {
            stub_status on;
            access_log off;
            allow /;
            deny all;
        }

        location ~ ^/(WEB-INF)/ {   
            deny all;   
        }
        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page        /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
           

   如果啟動nginx出錯:

  ./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or   directory

[[email protected] sbin]# ln -s /usr/local/lib/libpcre.so.1 /lib64

#nginx程序數,建議設定為等于CPU總核心數。
worker_processes 8;

#全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

#程序檔案
pid /var/run/nginx.pid;

#一個nginx程序打開的最多檔案描述符數目,理論值應該是最多打開檔案數(系統的值ulimit -n)與nginx程序數相除,但是nginx配置設定請求并不均勻,是以建議與ulimit -n的值保持一緻。
worker_rlimit_nofile 65535;

#工作模式與連接配接數上限
events
{
#參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本核心中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
use epoll;
#單個程序最大連接配接數(最大連接配接數=連接配接數*程序數)
worker_connections 65535;
}

#設定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;
#壓縮類型,預設就已經包含text/html,是以下面就不用再寫了,寫上去也不會有問題,但是會有一個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;
}
#JS和CSS緩存時間設定
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 /var/log/nginx/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 conf/htpasswd;
#htpasswd檔案的内容可以用apache提供的htpasswd工具來産生。
}

#本地動靜分離反向代理配置
#所有jsp的頁面均交由tomcat或resin處理
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直接讀取不經過tomcat或resin
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; }
}
}      

main全局配置

nginx在運作時與具體業務功能(比如http服務或者email服務代理)無關的一些參數,比如工作程序數,運作的身份等。

  • woker_processes 2

    在配置檔案的頂級main部分,worker角色的工作程序的個數,master程序是接收并配置設定請求給worker處理。這個數值簡單一點可以設定為cpu的核數

    grep ^processor /proc/cpuinfo | wc -l

    ,也是 auto 值,如果開啟了ssl和gzip更應該設定成與邏輯CPU數量一樣甚至為2倍,可以減少I/O操作。如果nginx伺服器還有其它服務,可以考慮适當減少。
  • worker_cpu_affinity

    也是寫在main部分。在高并發情況下,通過設定cpu粘性來降低由于多CPU核切換造成的寄存器等現場重建帶來的性能損耗。如

    worker_cpu_affinity 0001 0010 0100 1000;

     (四核)。
  • worker_connections 2048

    寫在events部分。每一個worker程序能并發處理(發起)的最大連接配接數(包含與用戶端或後端被代理伺服器間等所有連接配接數)。nginx作為反向代理伺服器,計算公式 

    最大連接配接數 = worker_processes * worker_connections/4

    ,是以這裡用戶端最大連接配接數是1024,這個可以增到到8192都沒關系,看情況而定,但不能超過後面的

    worker_rlimit_nofile

    。當nginx作為http伺服器時,計算公式裡面是除以2。
  • worker_rlimit_nofile 10240

    寫在main部分。預設是沒有設定,可以限制為作業系統最大的限制65535。
  • use epoll

    寫在

    events

    部分。在Linux作業系統下,nginx預設使用epoll事件模型,得益于此,nginx在Linux作業系統下效率相當高。同時Nginx在OpenBSD或FreeBSD作業系統上采用類似于epoll的高效事件模型kqueue。在作業系統不支援這些高效模型時才使用select。

http伺服器

與提供http服務相關的一些配置參數。例如:是否使用keepalive啊,是否使用gzip進行壓縮等。

  • sendfile on

    開啟高效檔案傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出檔案,減少使用者空間到核心空間的上下文切換。對于普通應用設為 on,如果用來進行下載下傳等應用磁盤IO重負載應用,可設定為off,以平衡磁盤與網絡I/O處理速度,降低系統的負載。
  • keepalive_timeout 65

     : 長連接配接逾時時間,機關是秒,這個參數很敏感,涉及浏覽器的種類、後端伺服器的逾時設定、作業系統的設定,可以另外起一片文章了。長連接配接請求大量小檔案的時候,可以減少重建連接配接的開銷,但假如有大檔案上傳,65s内沒上傳完成會導緻失敗。如果設定時間過長,使用者又多,長時間保持連接配接會占用大量資源。
  • send_timeout

     : 用于指定響應用戶端的逾時時間。這個逾時僅限于兩個連接配接活動之間的時間,如果超過這個時間,用戶端沒有任何活動,Nginx将會關閉連接配接。
  • client_max_body_size 10m

    允許用戶端請求的最大單檔案位元組數。如果有上傳較大檔案,請設定它的限制值
  • client_body_buffer_size 128k

    緩沖區代理緩沖使用者端請求的最大位元組數

子產品http_proxy:

這個子產品實作的是nginx作為反向代理伺服器的功能,包括緩存功能(另見文章)

  • proxy_connect_timeout 60

    nginx跟後端伺服器連接配接逾時時間(代理連接配接逾時)
  • proxy_read_timeout 60

    連接配接成功後,與後端伺服器兩個成功的響應操作之間逾時時間(代理接收逾時)
  • proxy_buffer_size 4k

    設定代理伺服器(nginx)從後端realserver讀取并儲存使用者頭資訊的緩沖區大小,預設與proxy_buffers大小相同,其實可以将這個指令值設的小一點
  • proxy_buffers 4 32k

    proxy_buffers緩沖區,nginx針對單個連接配接緩存來自後端realserver的響應,網頁平均在32k以下的話,這樣設定
  • proxy_busy_buffers_size 64k

    高負荷下緩沖大小(proxy_buffers*2)
  • proxy_max_temp_file_size

    當proxy_buffers放不下後端伺服器的響應内容時,會将一部分儲存到硬碟的臨時檔案中,這個值用來設定最大臨時檔案大小,預設1024M,它與proxy_cache沒有關系。大于這個值,将從upstream伺服器傳回。設定為0禁用。
  • proxy_temp_file_write_size 64k

    當緩存被代理的伺服器響應到臨時檔案時,這個選項限制每次寫臨時檔案的大小。

    proxy_temp_path

    (可以在編譯的時候)指定寫到哪那個目錄。

proxy_pass,proxy_redirect見 location 部分。

子產品http_gzip:

  • gzip on

     : 開啟gzip壓縮輸出,減少網絡傳輸。
    • gzip_min_length 1k

       : 設定允許壓縮的頁面最小位元組數,頁面位元組數從header頭得content-length中進行擷取。預設值是20。建議設定成大于1k的位元組數,小于1k可能會越壓越大。
    • gzip_buffers 4 16k

       : 設定系統擷取幾個機關的緩存用于存儲gzip的壓縮結果資料流。4 16k代表以16k為機關,安裝原始資料大小以16k為機關的4倍申請記憶體。
    • gzip_http_version 1.0

       : 用于識别 http 協定的版本,早期的浏覽器不支援 Gzip 壓縮,使用者就會看到亂碼,是以為了支援前期版本加上了這個選項,如果你用了 Nginx 的反向代理并期望也啟用 Gzip 壓縮的話,由于末端通信是 http/1.0,故請設定為 1.0。
    • gzip_comp_level 6

       : gzip壓縮比,1壓縮比最小處理速度最快,9壓縮比最大但處理速度最慢(傳輸快但比較消耗cpu)
    • gzip_types

       :比對mime類型進行壓縮,無論是否指定,”text/html”類型總是會被壓縮的。
    • gzip_proxied any

       : Nginx作為反向代理的時候啟用,決定開啟或者關閉後端伺服器傳回的結果是否壓縮,比對的前提是後端伺服器必須要傳回包含”Via”的 header頭。
    • gzip_vary on

       : 和http頭有關系,會在響應頭加個 Vary: Accept-Encoding ,可以讓前端的緩存伺服器緩存經過gzip壓縮的頁面,例如,用Squid緩存經過Nginx壓縮的資料。

    server虛拟主機

    http服務上支援若幹虛拟主機。每個虛拟主機一個對應的server配置項,配置項裡面包含該虛拟主機相關的配置。在提供mail服務的代理時,也可以建立若幹server。每個server通過監聽位址或端口來區分。
  • listen

    監聽端口,預設80,小于1024的要以root啟動。可以為

    listen *:80

    listen 127.0.0.1:80

    等形式。
  • server_name

    伺服器名,如

    localhost

    www.example.com

    ,可以通過正則比對。

子產品http_stream

這個子產品通過一個簡單的排程算法來實作用戶端IP到後端伺服器的負載均衡,

upstream

後接負載均衡器的名字,後端realserver以

host:port options;

 方式組織在 {} 中。如果後端被代理的隻有一台,也可以直接寫在 proxy_pass 。

 location

http服務中,某些特定的URL對應的一系列配置項。

  • root /var/www/html

    定義伺服器的預設網站根目錄位置。如果

    location

    URL比對的是子目錄或檔案,

    root

    沒什麼作用,一般放在

    server

    指令裡面或

    /

    下。
  • index index.jsp index.html index.htm

    定義路徑下預設通路的檔案名,一般跟着

    root

  • proxy_pass http:/backend

    請求轉向backend定義的伺服器清單,即反向代理,對應

    upstream

    負載均衡器。也可以

    proxy_pass http://ip:port

  • 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;

    這四個暫且這樣設,如果深究的話,每一個都涉及到很複雜的内容,也将通過另一篇文章來解讀。
  •  通路控制 allow/deny

    Nginx 的通路控制子產品預設就會安裝,而且寫法也非常簡單,可以分别有多個allow,deny,允許或禁止某個ip或ip段通路,依次滿足任何一個規則就停止往下比對。如:
    location /nginx-status {
      stub_status on;
      access_log off;
    #  auth_basic   "NginxStatus";
    #  auth_basic_user_file   /usr/local/nginx-1.6/htpasswd;
    
      allow ;
      allow /;
      deny all;
    }
               
    我們也常用 httpd-devel 工具的 htpasswd 來為通路的路徑設定登入密碼:
    # htpasswd -c htpasswd admin
    New passwd:
    Re-type new password:
    Adding password for user admin
    
    # htpasswd htpasswd admin    //修改admin密碼
    # htpasswd htpasswd sean    //多添加一個認證使用者
                    
    這樣就生成了預設使用CRYPT加密的密碼檔案。打開上面nginx-status的兩行注釋,重新開機nginx生效。

列出目錄 autoindex

Nginx預設是不允許列出整個目錄的。如需此功能,打開nginx.conf檔案,在location,server 或 http段中加入

autoindex on;

,另外兩個參數最好也加上去:

  • autoindex_exact_size off;

     預設為on,顯示出檔案的确切大小,機關是bytes。改為off後,顯示出檔案的大概大小,機關是kB或者MB或者GB
  • autoindex_localtime on;

    預設為off,顯示的檔案時間為GMT時間。改為on後,顯示的檔案時間為檔案的伺服器時間
location /images {
  root   /var/www/nginx-default/images;
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
  }
           

繼續閱讀