Nginx的介紹和使用

jopen 10年前發布 | 90K 次閱讀 Nginx Web服務器

1.什么是Nginx

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

優點:

(1)Nginx 可以在大多數 Unix like OS 上編譯運行,并 有 Windows 移植版。 Nginx 的1.2.6穩定版已經于2012年12月11日發布,[1]1.3.10開發版已經于2012年12月25 日發布,如果新建站點,建議使用最新穩定版作為生產版本,已有站點升級急迫性不高。Nginx 的源代碼使用 2-clause BSD- like license。
(2)Nginx 是一個很強大的高性能Web和反向代理服務器,它具有很多非常優越的特性:
在高連接并發的情況下,Nginx是Apache服務器不錯的替代品:Nginx在美國是做虛擬主機生意的老板們經常選擇的軟件平臺之一。能夠支持高達 50,000 個并發連接數的響應,感謝Nginx為我們選擇了 epoll and kqueue作為開發模型。
(3)Nginx作為負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP 程序對外進行服務,也可以支持作為 HTTP代理服務器對外進行服務。Nginx采用C進行編寫,不論是系統資源開銷還是CPU使用效率都比 Perlbal 要好很多。
作為郵件代理服務器:Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作為郵件代理服務器),Last. fm 描述了成功并且美妙的使用經驗。
(4)Nginx 是一個安裝非常的簡單,配置文件非常簡潔(還能夠支持perl語法),Bugs非常少的服務器:Nginx 啟動特別容易,并且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠不間斷服務的情況下進行軟件版本的升級。

 

2.下載和安裝Nginx

Nginx的官方網站是http://nginx.org/cn/, 英文主頁為http://nginx.net,從這里可以獲得Nginx的最新版本信息。Nginx有三個版本:穩定版、開發版和歷史穩定版。開發版更新 較快,包含最新的功能和bug的修復,但同時也可能會遇到新的bug,開發版一旦更新穩定下來,就會被加入穩定版分支中。然而有些新功能不一定會被加到舊 的穩定版中去。穩定版本更新較慢,但是bug較少,可以作為生產環境的首選,因此通常建議使用穩定版。歷史穩定版本為以往穩定版本的匯總,不包含最新的功 能。
這里選擇當前的穩定版本nginx-0.7.65作為介紹對象,開始介紹編譯安裝。在安裝Nginx之前,確保系統已經安裝了gcc、 openssl-devel、 pcre-devel和zlib-devel軟件庫。
Linux開發庫是在安裝系統時通過手動選擇安裝的,gcc、 openssl-devel、zlib-devel三個軟件庫可以通過安裝光盤直接選擇安裝得到,而pcre-devel庫默認不在系統光盤中,所以這里重點介紹pcre-devel庫。
安裝Nginx所需的pcre-devel庫
安裝pcre庫是為了使Nginx支持HTTP Rewrite 模塊。下面進行安裝,過程如下。

    [root@localhost home]# tar zxvf pcre-8.02.tar.gz    
    [root@localhost home]# cd pcre-8.02    
    [root@localhost pcre-8.02]#./configure    
    [root@localhost pcre-8.02]#make    
    [root@localhost pcre-8.02]#make install    


開始安裝Nginx
 Nginx的安裝非常簡單。在默認情況下,經過編譯安裝的Nginx包含了大部分可用模塊。可以通過“./configure  --help”選項設 置各個模塊的使用情況,例如對不需要的http_ssi模塊,可通過“--without-http_ssi_module”方式關閉此模塊;同理,如果 需要“http_perl”模塊,那么可以通過“--with-http_perl_module”方式安裝此模塊。下面是安裝過程: 

    [root@localhost home]# tar zxvf nginx-0.7.65.tar.gz    
    [root@localhost home]#cd nginx-0.7.65    
    [root@localhostnginx-0.7.65]#./configure \    
    --with-http_stub_status_module  --prefix=/opt/nginx    
    [root@localhost nginx-0.7.65]#make    
    [root@localhost nginx-0.7.65]#make install  

 

在上面的configure選項中“--with-http_stub_status_module”可以用來啟用 Nginx 的 NginxStatus 功能,以監控 Nginx 的當前狀態。
至此,Nginx已經安裝完成了。

 

3.Nginx配置

Nginx的配置文件是一個純文本文件,它一般位于Nginx安裝目錄的conf目錄 下,整個配置文件是以block的形式組織的。每個block一般以一個大括號“{}”來表示,block可以分為幾個層次,整個配置文件中Main指令 位于最高層,在Main層下面可以有Events、HTTP等層級,而在HTTP層中又包含有Server層,即 server block,server block中又可分為location層,并且一個server block中可以包含多個 location block。
一個完整的配置文件結構如下圖所示。

Nginx的介紹和使用
在了解完配置文件結構之后,就可以開始配置和調試Nginx了。

 

nginx.conf的配置文件詳解如下:

    #開啟進程數 <=CPU數  
    worker_processes 1;  

    #錯誤日志保存位置  
    #error_log logs/error.log;  
    #error_log logs/error.log notice;  
    #error_log logs/error.log info;  

    #進程號保存文件  
    #pid logs/nginx.pid;  

    #等待事件  
    events {  
    #每個進程最大連接數(最大連接=連接數x進程數)   
    worker_connections 1024;  
    }  


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

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

    #日志文件輸出格式 這個位置相于全局設置  
    #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 0;  
    keepalive_timeout 65;  

    #打開gzip壓縮  
    #gzip on;  

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

    #設定負載均衡的服務器列表  
    upstream myproject {   
    #weigth參數表示權值,權值越高被分配到的幾率越大  
    #max_fails 當有#max_fails個請求失敗,就表示后端的服務器不可用,默認為1,將其設置為0可以關閉檢查  
    #fail_timeout 在以后的#fail_timeout時間內nginx不會再把請求發往已檢查出標記為不可用的服務器  
    #這里指定多個源服務器,ip:端口,80端口的話可寫可不寫   
    server 192.168.1.78:8080 weight=5 max_fails=2 fail_timeout=600s;  
    #server 192.168.1.222:8080 weight=3 max_fails=2 fail_timeout=600s;   
    }  

    #第一個虛擬主機  
    server {  
    #監聽IP端口  
    listen 80;  

    #主機名  
    server_name localhost;  

    #設置字符集  
    #charset koi8-r;  

    #本虛擬server的訪問日志 相當于局部變量  
    #access_log logs/host.access.log main;   

    #對本server"/"啟用負載均衡  
    location / {   
    #root /root; #定義服務器的默認網站根目錄位置  
    #index index.php index.html index.htm; #定義首頁索引文件的名稱  
    proxy_pass http://myproject; #請求轉向myproject定義的服務器列表  

    #以下是一些反向代理的配置可刪除.  
    # 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 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服務器傳  
    }   
    location /upload {   
    alias e:/upload;   
    }  
    #設定查看Nginx狀態的地址   
    location /NginxStatus {   
    stub_status on;   
    access_log off;   
    #allow 192.168.0.3;  
    #deny all;  
    #auth_basic "NginxStatus";   
    #auth_basic_user_file conf/htpasswd;   
    }  

    #error_page 404 /404.html;  

    # redirect server error pages to the static page /50x.html  
    # 定義錯誤提示頁面  
    error_page 500 502 503 504 /50x.html;  
    location = /50x.html {  
    root html;  
    }  


    # proxy the PHP scripts to Apache listening on 127.0.0.1:80  
    #  
    #location ~ \.php$ {  
    # proxy_pass http://127.0.0.1;  
    #}  

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
    #  
    #location ~ \.php$ {  
    # root html;  
    # fastcgi_pass 127.0.0.1:9000;  
    # fastcgi_index index.php;  
    # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;  
    # include fastcgi_params;  
    #}  

    # deny access to .htaccess files, if Apache's document root  
    # concurs with nginx's one  
    #  
    #location ~ /\.ht {  
    # deny all;  
    #}  
    }   


    # another virtual host using mix of IP-, name-, and port-based configuration  
    #  
    #server {  
    #多監聽   
    # listen 8000;  
    #主機名  
    # listen somename:8080;  
    # server_name somename alias another.alias;  

    # location / {  
    #WEB文件路徑  
    # root html;  
    #默認首頁  
    # index index.html index.htm;  
    # }  
    #}  


    # HTTPS server HTTPS SSL加密服務器  
    #  
    #server {  
    # listen 443;  
    # server_name localhost;  

    # ssl on;  
    # ssl_certificate cert.pem;  
    # ssl_certificate_key cert.key;  

    # ssl_session_timeout 5m;  

    # ssl_protocols SSLv2 SSLv3 TLSv1;  
    # ssl_ciphers HIGH:!aNULL:!MD5;  
    # ssl_prefer_server_ciphers on;  

    # location / {  
    # root html;  
    # index index.html index.htm;  
    # }  
    #}   
    }  



 

4.nginx啟動,重啟,關閉命令

停止操作
停止操作是通過向nginx進程發送信號(什么是信號請參閱linux文 章)來進行的
步驟1:查詢nginx主進程號
ps -ef | grep nginx
在進程列表里 面找master進程,它的編號就是主進程號了。
步驟2:發送信號
從容停止Nginx:
kill -QUIT 主進程號
快速停止Nginx:
kill -TERM 主進程號
強制停止Nginx:
pkill -9 nginx

另外, 若在nginx.conf配置了pid文件存放路徑則該文件存放的就是Nginx主進程號,如果沒指定則放在nginx的logs目錄下。有了pid文 件,我們就不用先查詢Nginx的主進程號,而直接向Nginx發送信號了,命令如下:
kill -信號類型 '/usr/nginx/logs/nginx.pid'

平滑重啟
如果更改了配置就要重啟Nginx,要先關閉Nginx再打開?不是的,可以向Nginx 發送信號,平滑重啟。
平滑重啟命令:
kill -HUP 住進稱號或進程號文件路徑

或者使用

/usr/nginx/sbin/nginx -s reload

 


注意,修改了配置文件后最好先檢查一下修改過的配置文件是否正 確,以免重啟后Nginx出現錯誤影響服務器穩定運行。判斷Nginx配置是否正確命令如下:
nginx -t -c /usr/nginx/conf/nginx.conf

或者

/usr/nginx/sbin/nginx -t

 

平滑升級
如果服務器正在運行的Nginx要進行升級、添加或刪除模塊時,我們需 要停掉服務器并做相應修改,這樣服務器就要在一段時間內停止服務,Nginx可以在不停機的情況下進行各種升級動作而不影響服務器運行。
步驟1:
如 果升級Nginx程序,先用新程序替換舊程序文件,編譯安裝的話新程序直接編譯到Nginx安裝目錄中。
步 驟2:執行命令
kill -USR2 舊版程序的主進程號或進程文件名
此時舊的Nginx主進程將會把自己的進程文件改名為.oldbin,然后執行新版 Nginx。新舊Nginx會同市運行,共同處理請求。
這時要逐步停止舊版 Nginx,輸入命令:
kill -WINCH 舊版主進程號
慢慢舊的工作進程就都會隨著任務執行完畢而退出,新版的Nginx的工作進程會逐漸取代舊版 工作進程。

此 時,我們可以決定使用新版還是恢復到舊版。
不重載配置啟動新/舊工作進程
kill -HUP 舊/新版主進程號
從容關閉舊/新進程
kill -QUIT 舊/新主進程號
如果此時報錯,提示還有進程沒有結束就用下面命令先關閉舊/新工作進程,再關閉主進程號:
kill -TERM 舊/新工作進程號

這樣下來,如果要恢復到舊版本,只需要上面的幾個步 驟都是操作新版主進程號,如果要用新版本就上面的幾個步驟

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