Nginx應用詳解及配置

、Nginx簡介

概述: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小時的不間斷運行。正則表達式

2、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實現原理

3、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模型;

4、案例:搭建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

相關文章
相關標籤/搜索