概述:Nginx是一款由俄羅斯開發的開源的高性能HTTP服務器和反向代理服務器,同時支持IMAP/POP3/SMTP代理服務,其性能優點着爲顯著,官網上稱:單臺nginx服務器能夠處理50000併發;javascript
特色:高性能、穩定、消耗硬件資源小、可以處理大併發,主要用於靜態的解析,動靜頁面的分離;css
功能:html
1.做爲Web服務器,nginx處理靜態文件、索引文件以及自動索引效率很是高。前端
2.做爲代理服務器,Nginx能夠實現無緩存的反向代理加速,提升網站運行速度。java
3.做爲負載均衡服務器,Nginx既能夠在內部直接支持Rails和PHP,也能夠支持HTTP代理服務器,對外進行服務。同時支持簡單的容錯和利用算法進行負載均衡。node
優點:linux
1.在性能方面,Nginx在實現上很是注重效率。它採用內核Poll模型,能夠支持更多的併發鏈接,最大能夠支持對50 000個併發鏈接數的響應,並且佔用很低的內存資源。nginx
2.在穩定性方面,Nginx採起了分階段資源分配技術,使得對CPU與內存的佔用率很是低。Nginx官方表示Nginx保持10 000個沒有活動的鏈接,這些鏈接只佔2.5M內存,所以,相似DOS這樣的攻擊對Nginx來講基本上是沒有任何做用的。web
3.在高可用性方面,Nginx支持熱部署,啓動速度特別迅速,所以能夠在不間斷服務的狀況下,對軟件版本或者配置進行升級,即便運行數月也無需從新啓動,幾乎能夠作到7*24小時的不間斷運行。正則表達式
核心模塊:HTTP模塊、EVENT事件模塊、MAIL模塊。
基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊、HTTP Rewrite模塊
第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊、HTTP Access Key模塊。
Handlers:處理器模塊,此類模塊直接處理請求,並進行輸出內容和修改headers信息等操做。Handlers處理器模塊通常只能有一個。
Filters:過濾器模塊,此類模塊主要對其餘處理器模塊輸出的內容進行修改操做,最後由Nginx輸出。
Proxies:代理類模塊,此類模塊是Nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務好比FastCGI等進行交互,實現服務代理和負載均衡等功能。
單工做進程模式:除主進程外,還有一個工做進程,工做進程是單線程的,默認爲此模式;
多工做進程模式:每一個工做進程包含多個線程;
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實現原理
1.每一個鏈接對應一個描述。select模型受限於 FD_SETSIZE(即進程最大打開的描述符數),linux2.6.35爲1024,實際上linux每一個進程所能打開描數字的個數僅受限於內存大小,然而在設計select的系統調用時,倒是參考FD_SETSIZE的值。可經過從新編譯內核更改此值,但不能根治此問題,對於百萬級的用戶鏈接請求即使增長相應進程數,仍顯得杯水車薪;
2.select每次請求都會掃描一個文件描述符的集合,這個集合的大小是做爲select第一個參數傳入的值。可是每一個進程所能打開文件描述符如果增長了,掃描的效率也將減少;
3.內核到用戶空間,採用內存複製方式傳遞信息,這樣就增長了沒必要要的複製延遲;
1.請求無文件描述字大小限制,僅與內存大小相關;
2.epoll返回時已經明確的知道哪一個socket fd發生了什麼事件,不用像select那樣再一個個比對;
3.內核到用戶空間,採用共享內存方式傳遞消息,使用mmap加速內核與用戶空間的消息傳遞;
Apache:Apache 2.2.9以前只支持select模型,2.2.9以後支持epoll模型;
Nginx:支持epoll模型;
案例環境:
系統類型 | 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服務器內核優化;
[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
[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
客戶端訪問測試
[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握手次數 已處理的請求數
[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服務
[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 ##監聽狀態
瀏覽器訪問監控界面刷新測試
[root@www ~]# vi /etc/sysctl.conf
[root@www ~]# sysctl -p