一、Nginx簡介 概述:Nginx是一款由俄羅斯開發的開源的高性能HTTP伺服器和反向代理伺服器,同時支持IMAP/POP3/SMTP代理服務,其性能優勢著為顯著,官網上稱:單台nginx伺服器可以處理50000併發; 特點:高性能、穩定、消耗硬體資源小、能夠處理大併發,主要用於靜態的解析,動靜頁 ...
一、Nginx簡介
概述:Nginx是一款由俄羅斯開發的開源的高性能HTTP伺服器和反向代理伺服器,同時支持IMAP/POP3/SMTP代理服務,其性能優勢著為顯著,官網上稱:單台nginx伺服器可以處理50000併發;
特點:高性能、穩定、消耗硬體資源小、能夠處理大併發,主要用於靜態的解析,動靜頁面的分離;
功能:
1.作為Web伺服器,nginx處理靜態文件、索引文件以及自動索引效率非常高。
2.作為代理伺服器,Nginx可以實現無緩存的反向代理加速,提高網站運行速度。
3.作為負載均衡伺服器,Nginx既可以在內部直接支持Rails和PHP,也可以支持HTTP代理伺服器,對外進行服務。同時支持簡單的容錯和利用演算法進行負載均衡。
優勢:
1.在性能方面,Nginx在實現上非常註重效率。它採用內核Poll模型,可以支持更多的併發連接,最大可以支持對50 000個併發連接數的響應,而且占用很低的記憶體資源。
2.在穩定性方面,Nginx採取了分階段資源分配技術,使得對CPU與記憶體的占用率非常低。Nginx官方表示Nginx保持10 000個沒有活動的連接,這些連接只占2.5M記憶體,因此,類似DOS這樣的攻擊對Nginx來說基本上是沒有任何作用的。
3.在高可用性方面,Nginx支持熱部署,啟動速度特別迅速,因此可以在不間斷服務的情況下,對軟體版本或者配置進行升級,即使運行數月也無需重新啟動,幾乎可以做到7*24小時的不間斷運行。
二、Nginx實現原理
Nginx核心組件:
核心模塊:HTTP模塊、EVENT事件模塊、MAIL模塊。
基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊、HTTP Rewrite模塊
第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊、HTTP Access Key模塊。
Nginx模塊分類(基於功能):
Handlers:處理器模塊,此類模塊直接處理請求,併進行輸出內容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。
Filters:過濾器模塊,此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由Nginx輸出。
Proxies:代理類模塊,此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如FastCGI等進行交互,實現服務代理和負載均衡等功能。
Nginx的進程模型:
單工作進程模式:除主進程外,還有一個工作進程,工作進程是單線程的,預設為此模式;
多工作進程模式:每個工作進程包含多個線程;
master進程:
1.接收外界傳遞給Nginx的信號,進而管理服務的狀態等;
2.管理worker進程,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程異常情況下退出後,會自動重新啟動新的worker進程;
3.master進程充當整個進程組與用戶的交互介面,同時對進程進行監護。它不需要處理網路事件,不負責業務的執行,只會通過管理worker進程來實現重啟服務、平滑升級、更換日誌文件、配置文件實時生效等功能。
worker進程:
1.處理基本的網路事件,多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。
2.一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。
3.worker進程的個數是可以設置的,一般我們會設置與機器cpu核心數量一致。
擴展:
http://blog.csdn.net/hguisu/article/details/8930668 ##nginx實現原理
三、Nginx支持高併發的原因
I/O模型之select:
1.每個連接對應一個描述。select模型受限於 FD_SETSIZE(即進程最大打開的描述符數),linux2.6.35為1024,實際上linux每個進程所能打開描數字的個數僅受限於記憶體大小,然而在設計select的系統調用時,卻是參考FD_SETSIZE的值。可通過重新編譯內核更改此值,但不能根治此問題,對於百萬級的用戶連接請求即便增加相應進程數,仍顯得杯水車薪;
2.select每次請求都會掃描一個文件描述符的集合,這個集合的大小是作為select第一個參數傳入的值。但是每個進程所能打開文件描述符若是增加了,掃描的效率也將減小;
3.內核到用戶空間,採用記憶體複製方式傳遞信息,這樣就增加了不必要的複製延遲;
I/O模型之epoll模型:
1.請求無文件描述字大小限制,僅與記憶體大小相關;
2.epoll返回時已經明確的知道哪個socket fd發生了什麼事件,不用像select那樣再一個個比對;
3.內核到用戶空間,採用共用記憶體方式傳遞消息,使用mmap加速內核與用戶空間的消息傳遞;
Apache:Apache 2.2.9之前只支持select模型,2.2.9之後支持epoll模型;
Nginx:支持epoll模型;
四、案例:搭建Nginx網站服務
案例環境:
系統類型 | IP地址 | 主機名 | 所需軟體 | 硬體 |
Centos 6.5 64bit | 192.168.100.150 | www.linuxfan.cn | nginx-1.12.2.tar.gz |
記憶體:2G CPU:8核 |
案例步驟:
安裝nginx程式;
優化nginx服務並啟動服務;
客戶端訪問測試;
開啟nginx的狀態監聽模塊;
客戶端訪問nginx的狀態監聽界面;
企業級優化Nginx服務;
訪問測試優化後nginx服務;
安裝webbench壓力測試工具,進行測試nginx性能;
自主學習:Nginx伺服器內核優化;
安裝nginx程式
[root@www ~]# rpm -e httpd --nodeps [root@www ~]# yum -y install pcre-devel zlib-devel [root@www ~]# useradd -M -s /sbin/nologin nginx [root@www ~]# tar zxvf nginx-1.12.2.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/nginx-1.12.2/ [root@www nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module 註解: --prefix=/usr/local/nginx ##指定安裝位置 --user=nginx --group=nginx ##指定運行服務的用戶和組 --with-http_stub_status_module ##開啟狀態監聽模塊 --conf-path= ##指向配置文件存放位置 --error-log-path= ##指向錯誤日誌存放位置 --pid-path= ##指向pid文件存放位置 --with-rtsig_module ##啟用rtsig模塊支持(實時信號) --with-select_module ##啟用select模塊支持(一種輪詢模式,不推薦在高載環境下使用)禁用:--without-select_module --with-http_ssl_module ##啟用ngx_http_ssl_module支持(使支持https請求,需已安裝openssl) --with-http_xslt_module ##啟用ngx_http_xslt_module支持(過濾轉換XML請求) --with-http_image_filter_module ##啟用ngx_http_image_filter_module支持(傳輸JPEG/GIF/PNG 圖片的一個過濾器)(預設為不啟用,要用到gd庫) --with-http_gzip_static_module ##啟用ngx_http_gzip_static_module支持(線上實時壓縮輸出數據流) --with-http_degradation_module ##啟用ngx_http_degradation_module支持(允許在記憶體不足的情況下返回204或444碼) --without-http_access_module ##禁用ngx_http_access_module支持(該模塊提供了一個簡單的基於主機的訪問控制,允許或拒絕基於ip地址) --without-http_auth_basic_module ##禁用ngx_http_auth_basic_module(該模塊是可以使用用戶名和密碼基於http基本認證方法,來保護你的站點或其部分內容) ---without-http_rewrite_module ##禁用ngx_http_rewrite_module支持(該模塊允許使用正則表達式改變URL) --without-http_fastcgi_module ##禁用ngx_http_fastcgi_module支持(該模塊允許Nginx 與FastCGI 進程交互,並通過傳遞參數來控制FastCGI 進程工作。) [root@www nginx-1.12.2]# make &&make install [root@www nginx-1.12.2]# ls /usr/local/nginx/ client_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp
優化nginx服務並啟動服務
[root@www ~]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ ##優化命令執行路徑 [root@www ~]# vi /etc/init.d/nginx #!/bin/bash # chkconfig: - 99 20 # description: Nginx Server Control Script NP="/usr/local/nginx/sbin/nginx" NPF="/usr/local/nginx/logs/nginx.pid" case "$1" in start) $NP; if [ $? -eq 0 ] then echo "nginx is starting!! " fi ;; stop) kill -s QUIT $(cat $NPF) if [ $? -eq 0 ] then echo "nginx is stopping!! " fi ;; restart) $0 stop $0 start ;; reload) kill -s HUP $(cat $NPF) if [ $? -eq 0 ] then echo "nginx config file is reload! " fi ;; *) echo "Usage: $0 {start|stop|restart|reload}" exit 1 esac exit 0 [root@www ~]# chmod +x /etc/init.d/nginx [root@www ~]# chkconfig --add nginx [root@www ~]# chkconfig nginx on [root@www ~]# /etc/init.d/nginx start nginx is starting!! [root@www ~]# netstat -utpln |grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3713/nginx
客戶端訪問測試
開啟nginx的狀態監聽模塊
[root@www ~]# vi /usr/local/nginx/conf/nginx.conf ##編輯配置文件在server中添加如下行: 47 location /status { 48 stub_status on; 49 access_log off; 50 } [root@www ~]# /etc/init.d/nginx restart nginx is stopping!! nginx is starting!!
客戶端訪問nginx的狀態監聽界面
http://192.168.100.150/status
活動的連接數
已處理的連接數 成功的tcp握手次數 已處理的請求數
企業級優化Nginx服務
[root@www ~]# vi /usr/local/nginx/conf/nginx.conf worker_processes 8; worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; error_log /usr/local/nginx/logs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 204800; events { use epoll; worker_connections 204800; } http { include mime.types; default_type application/octet-stream; charset utf-8; server_names_hash_bucket_size 128; client_header_buffer_size 2k; large_client_header_buffers 4 4k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 4k; fastcgi_buffers 8 4k; fastcgi_busy_buffers_size 8k; fastcgi_temp_file_write_size 8k; fastcgi_cache TEST; fastcgi_cache_valid 200 302 1h; fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; fastcgi_cache_use_stale error timeout invalid_header http_500; open_file_cache max=204800 inactive=20s; open_file_cache_min_uses 1; open_file_cache_valid 30s; tcp_nodelay on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; server { listen 80; server_name www.linuxfan.cn; location / { root /usr/local/nginx/html/; index index.html index.htm; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; } access_log /usr/local/nginx/logs/access.log access; } }
註解: worker_processes 8; ##設置worker進程數量 worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000; ##設置每個worker進程對應一個cpu的核心 error_log /usr/local/nginx/logs/nginx_error.log crit; ##指定錯誤日誌 pid /usr/local/nginx/logs/nginx.pid; ##指定運行時產生的pid文件 worker_rlimit_nofile 204800; ##指定nginx進程最多能夠打開多少個文件描述符,通常與系統中的ulimit -n保持一致; events { ##事件區域配置 use epoll; ##指定處理模型為epoll worker_connections 204800; ##每個進程最多能夠處理多少個連接 } http { ##http服務配置區域 include mime.types; ##指定文件擴展名和文件類型映射表 default_type application/octet-stream; ##指定文件類型 charset utf-8; ##指定字元集 server_names_hash_bucket_size 128; ##伺服器名字的hash表大小 client_header_buffer_size 2k; ##客戶端請求頭部buffer大小 large_client_header_buffers 4 4k; ##指定客戶端請求中較大的消息頭的緩存數量和大小 client_max_body_size 8m; ##指定客戶端請求的單個文件的最大位元組數 sendfile on; ##開啟高效傳輸模式 tcp_nopush on; ##防止網路阻塞 keepalive_timeout 60; ##客戶端連接超時時間 #FastCGI相關參數是為了改善網站的性能:減少資源占用,提高訪問速度。 fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 ##配置fastcgi緩存路徑和目錄結構等級 keys_zone=TEST:10m inactive=5m; ##關鍵字區域存儲時間和非活動刪除時間 fastcgi_connect_timeout 300; ##連接到後端FastCGI的超時時間 fastcgi_send_timeout 300; ##向FastCGI傳送請求的超時時間 fastcgi_read_timeout 300; ##接收FastCGI應答的超時時間 fastcgi_buffer_size 4k; ##指定讀取FastCGI應答第一部分需要多大的緩衝區 fastcgi_buffers 8 4k; ##指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求 fastcgi_busy_buffers_size 8k; ##通常為fastcgi_buffer_size大小的兩倍 fastcgi_temp_file_write_size 8k; ##寫入緩存文件時使用多大的數據塊,大小同上 fastcgi_cache TEST; ##開啟Fastcgi的緩存並且為其指定一個名稱 fastcgi_cache_valid 200 302 1h; ##指定不同的狀態碼,其緩存的時間 fastcgi_cache_valid 301 1d; fastcgi_cache_valid any 1m; fastcgi_cache_min_uses 1; ##URL經過被訪問多少次將被緩存 fastcgi_cache_use_stale error timeout invalid_header http_500; ##指定什麼情況下不進行緩存 open_file_cache max=204800 inactive=20s; ##指定緩存文件最大數量,經過多長時間文件沒有被請求後則刪除緩存, open_file_cache_min_uses 1; ##指令中的inactive參數時間內文件的最少使用次數,如果超過這個數字,文件更改信息一直是在緩存中打開的; open_file_cache_valid 30s; ##指定多長時間檢查一次緩存的有效信息,檢查該緩存的源文件是否發生變化修改等; tcp_nodelay on; ## nagle演算法,有需要發送的就立即發送,連接轉換為長連接時使用; gzip on; ##開啟gzip壓縮 gzip_min_length 1k; ##指定最小壓縮文件的大小 gzip_buffers 4 16k; ##指定壓縮緩衝區的個數和大小 gzip_http_version 1.0; ##指定壓縮版本 gzip_comp_level 2; ##指定壓縮等級1-9,9等級最高 gzip_types text/plain application/x-javascript text/css application/xml; ##指定壓縮文件類型 gzip_vary on; ##前端緩存伺服器緩存經過壓縮的頁面 log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; ##配置日誌格式,具體變數表示請結合百度,日誌格式為access server { listen 80; server_name www.linuxfan.cn; location / { root /usr/local/nginx/html/; index index.html index.htm; } location /status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ { expires 30d; ##指定以上格式的文件將進行緩存 } access_log /usr/local/nginx/logs/access.log access; } }
[root@www~]# /etc/init.d/nginx start nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /usr/local/nginx/conf/nginx.conf:75 nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /usr/local/nginx/conf/nginx.conf:75 nginx: [warn] no "fastcgi_cache_key" for "fastcgi_cache" in /usr/local/nginx/conf/nginx.conf:75 nginx is starting!! [root@www ~]# netstat -utpln |grep nginx tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3627/nginx [root@www ~]# ps aux |grep nginx |grep -v grep root 3627 0.0 0.0 30708 376 ? Ss 18:59 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 3628 0.1 11.6 113920 57600 ? S 18:59 0:00 nginx: worker process nginx 3629 0.0 11.1 113920 54932 ? S 18:59 0:00 nginx: worker process nginx 3630 0.0 9.7 113920 48336 ? S 18:59 0:00 nginx: worker process nginx 3631 0.0 9.6 113920 47768 ? S 18:59 0:00 nginx: worker process nginx 3632 0.0 9.8 113920 48516 ? S 18:59 0:00 nginx: worker process nginx 3633 0.0 10.5 113920 52084 ? S 18:59 0:00 nginx: worker process nginx 3634 0.0 11.5 113920 57156 ? S 18:59 0:00 nginx: worker process nginx 3635 0.0 9.4 113920 46892 ? S 18:59 0:00 nginx: worker process nginx 3636 0.0 0.0 30844 392 ? S 18:59 0:00 nginx: cache manager process
[root@www ~]# top
訪問測試優化後nginx服務
安裝webbench壓力測試工具,進行測試nginx性能
[root@www ~]# yum -y install gcc ctags [root@www ~]# wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz [root@www ~]# tar zxvf webbench-1.5.tar.gz -C /usr/src/ [root@www ~]# cd /usr/src/webbench-1.5/ [root@www webbench-1.5]# mkdir /usr/local/man [root@www webbench-1.5]# make && make install [root@www webbench-1.5]# cd [root@www~]# webbench -c 10000 -t 5 http://www.linuxfan.cn:80/index.html ##併發數為10000,時間為5秒 Webbench - Simple Web Benchmark 1.5 Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software. Benchmarking: GET http://www.linuxfan.cn:80/index.html 10000 clients, running 5 sec. Speed=147744 pages/min, 1397500 bytes/sec. Requests: 12312 susceed, 0 failed. [root@www ~]# netstat -nat | awk '/^tcp/ {++S[$NF]} END {for(key in S) print key,"\t",S[key]}' ##查看資料庫狀態 TIME_WAIT 15961 ##表示收到了對方的FIN報文,併發送出了ACK報文 FIN_WAIT1 166 ##已發送FIN報文,等待對方的ACK SYN_SENT 189 ##這個狀態與SYN_RCVD遙相呼應,用於建立連接 FIN_WAIT2 1 ##半關閉狀態 ESTABLISHED 1343 ##已經建立連接 SYN_RECV 256 ##已經接收到對方的SYN報文,等待ACK報文 LISTEN 9 ##監聽狀態
瀏覽器訪問監控界面刷新測試
Nginx伺服器內核優化
[root@www ~]# vi /etc/sysctl.conf
[root@www ~]# sysctl -p