Openresty最佳案例 | 第1篇:Nginx介紹

轉載請標明出處:
http://blog.csdn.net/forezp/article/details/78616591
本文出自方誌朋的博客javascript

Nginx 簡介

Nginx是一個高性能的Web 服務器,同時是一個高效的反向代理服務器,它仍是一個IMAP/POP3/SMTP
代理服務器。php

因爲Nginx採用的是事件驅動的架構,可以處理併發百萬級別的tcp鏈接,高度的模塊化設計和自由的BSD許可,使得Nginx有着很是豐富的第三方模塊。好比Openresty、API網關Kong。css

BSD開源協議是一個給予使用者很大自由的協議。基本上使用者能夠"隨心所欲",能夠自由的使用,修改源代碼,也能夠將修改後的代碼做爲開源或者專有軟件再發布。html

Nginx的優勢

  • 高併發響應性能很是好,官方Nginx處理靜態文件併發5w/s
  • 反向代理性能很是強。(可用於負載均衡)
  • 內存和cpu佔用率低。(爲Apache的1/5-1/10)
  • 對後端服務有健康檢查功能。
  • 支持PHP cgi方式和fastcgi方式。
  • 配置代碼簡潔且容易上手。

Nginx的安裝

Centos系統安裝,請參考這裏http://www.linuxidc.com/Linux/2016-09/134907.htm。先複製粘貼下它的文章。java

1.gcc 安裝

安裝 nginx 須要先將官網下載的源碼進行編譯,編譯依賴 gcc 環境,若是沒有 gcc 環境,則須要安裝:node

yum install gcc-c++linux

2.PCRE pcre-devel 安裝

PCRE(Perl Compatible Regular Expressions) 是一個Perl庫,包括 perl 兼容的正則表達式庫。nginx 的 http 模塊使用 pcre 來解析正則表達式,因此須要在 linux 上安裝 pcre 庫,pcre-devel 是使用 pcre 開發的一個二次開發庫。nginx也須要此庫。命令:nginx

yum install -y pcre pcre-develc++

3.zlib 安裝

zlib 庫提供了不少種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,因此須要在 Centos 上安裝 zlib 庫。git

yum install -y zlib zlib-devel

4.OpenSSL 安裝

OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼算法、經常使用的密鑰和證書封裝管理功能及 SSL 協議,並提供豐富的應用程序供測試或其它目的使用。
nginx 不只支持 http 協議,還支持 https(即在ssl協議上傳輸http),因此須要在 Centos 安裝 OpenSSL 庫。

yum install -y openssl openssl-devel

5.官網下載

1.直接下載.tar.gz安裝包,地址:https://nginx.org/en/download.html

2.使用wget命令下載(推薦)。

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz

6.解壓

依然是直接命令:

tar -zxvf nginx-1.10.1.tar.gz
cd nginx-1.10.1

7.配置

其實在 nginx-1.10.1 版本中你就不須要去配置相關東西,默認就能夠了。固然,若是你要本身配置目錄也是能夠的。
使用默認配置

./configure

8.編譯安裝

make
make install

查找安裝路徑:

whereis nginx

Nginx的模塊組成

Nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊:

  • 核心模塊:HTTP模塊、EVENT模塊和MAIL模塊
  • 基礎模塊:HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊,
  • 第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊和HTTP Access Key模塊。

Nginx的高併發得益於其採用了epoll模型,與傳統的服務器程序架構不一樣,epoll是linux內核2.6之後纔出現的。Nginx採用epoll模型,異步非阻塞,而Apache採用的是select模型。

  • Select特色:select 選擇句柄的時候,是遍歷全部句柄,也就是說句柄有事件響應時,select須要遍歷全部句柄才能獲取到哪些句柄有事件通知,所以效率是很是低。
  • epoll的特色:epoll對於句柄事件的選擇不是遍歷的,是事件響應的,就是句柄上事件來就立刻選擇出來,不須要遍歷整個句柄鏈表,所以效率很是高。

Nginx經常使用命令

nginx 環境變量配置:

export PATH=$PATH:/usr/servers/nginx/sbin

  • 查看nginx進程
    ps -ef|grep nginx

  • 啓動nginx
    nginx
    啓動結果顯示nginx的主線程和工做線程,工做線程的數量跟nginx.conf中的配置參數worker_processes有關。

  • 平滑啓動nginx
    kill -HUP cat /var/run/nginx.pid
    或者
    nginx -s reload

  • 強制中止nginx
    pkill -9 nginx

  • 檢查對nginx.conf文件的修改是否正確
    nginx -t

  • 中止nginx的命令
    nginx -s stop或者pkill nginx

  • 查看nginx的版本信息
    nginx -v

  • 查看完整的nginx的配置信息
    nginx -V

Nginx的配置

一般狀況下,Nginx的配置在Ngix的安裝目錄下的/conf/config.default 文件裏,基本配置以下:

worker_process # 表示工做進程的數量,通常設置爲cpu的核數

worker_connections # 表示每一個工做進程的最大鏈接數

server{} # 塊定義了虛擬主機
    listen # 監聽端口
    server_name # 監聽域名
    location {} # 是用來爲匹配的 URI 進行配置,URI 即語法中的「/uri/」
    location /{} # 匹配任何查詢,由於全部請求都以 / 開頭
        root # 指定對應uri的資源查找路徑,這裏html爲相對路徑,完整路徑爲
        # /opt/nginx-1.7.7/html/
        index # 指定首頁index文件的名稱,能夠配置多個,以空格分開。若有多
        # 個,按配置順序查找。

location 經常使用配置以下:

模式 含義
location = /uri = 表示精確匹配,只有徹底匹配上才能生效
location ^~ /uri ^~ 開頭對URL路徑進行前綴匹配,而且在正則以前。
location ~ pattern 開頭表示區分大小寫的正則匹配
location ~* pattern 開頭表示不區分大小寫的正則匹配
location /uri 不帶任何修飾符,也表示前綴匹配,可是在正則匹配以後
location / 通用匹配,任何未匹配到其它location的請求都會匹配到,至關於switch中的default

Nginx的經常使用配置很是多,如下內容摘自於布爾教育課件,僅供參考:

#定義Nginx運行的用戶和用戶組
user  www www;
#啓動進程,一般設置成和cpu的數量相等
worker_processes  8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
#爲每一個進程分配cpu,上例中將8個進程分配到8個cpu,固然能夠寫多個,或者將一個進程分配到多個cpu。
worker_rlimit_nofile 102400;
#這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打
#開文件數(ulimit -n)與nginx進程數相除,可是nginx分配請求並非那麼均勻
#,因此最好與ulimit -n的值保持一致。

#全局錯誤日誌及PID文件
error_log  /usr/local/nginx/logs/error.log; 
#錯誤日誌定義等級,[ debug | info | notice | warn | error | crit ]
pid        /usr/local/nginx/nginx.pid;

#一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,可是nginx分配請求並不均勻.
#因此建議與ulimit -n的值保持一致。
worker_rlimit_nofile 65535;

#工做模式及鏈接數上限
events {
    use   epoll;             	#epoll是多路複用IO(I/O Multiplexing)中的一種方式,可是僅用於linux2.6以上內核,能夠大大提升nginx的性能
    worker_connections  102400;	#單個後臺worker process進程的最大併發連接數 (最大鏈接數=鏈接數*進程數)
    multi_accept on; #儘量多的接受請求
}
#設定http服務器,利用它的反向代理功能提供負載均衡支持
http {
    #設定mime類型,類型由mime.type文件定義
    include       mime.types;
    default_type  application/octet-stream;
    #設定日誌格式
    access_log    /usr/local/nginx/log/nginx/access.log;
	 sendfile      on;
    #sendfile 指令指定 nginx 是否調用 sendfile 函數(zero copy 方式)來輸出文件,對於普通應用必須設爲 on
	#若是用來進行下載等應用磁盤IO重負載應用,可設置爲 off,以平衡磁盤與網絡I/O處理速度,下降系統的uptime.
	#autoindex  on;  #開啓目錄列表訪問,合適下載服務器,默認關閉。
	tcp_nopush on; #防止網絡阻塞
	keepalive_timeout 60;
	#keepalive超時時間,客戶端到服務器端的鏈接持續有效時間,當出現對服務器的後,繼請求時,keepalive-timeout功能可避免創建或從新創建鏈接。
    tcp_nodelay   on; #提升數據的實時響應性
   #開啓gzip壓縮
   gzip on;
	gzip_min_length  1k;
	gzip_buffers     4 16k;
	gzip_http_version 1.1;
	gzip_comp_level 2; #壓縮級別大小,最大爲9,值越小,壓縮後比例越小,CPU處理更快。
	#值越大,消耗CPU比較高。
	gzip_types       text/plain application/x-javascript text/css application/xml;
	gzip_vary on;
	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)
	
    #設定請求緩衝
    large_client_header_buffers  4 4k;
	client_header_buffer_size 4k;
	#客戶端請求頭部的緩衝區大小,這個能夠根據你的系統分頁大小來設置,通常一個請求的頭部大小不會超過1k
	#不過因爲通常系統分頁都要大於1k,因此這裏設置爲分頁大小。分頁大小能夠用命令getconf PAGESIZE取得。
	open_file_cache max=102400 inactive=20s;
	#這個將爲打開文件指定緩存,默認是沒有啓用的,max指定緩存數量,建議和打開文件數一致,inactive是指通過多長時間文件沒被請求後刪除緩存。
	open_file_cache_valid 30s;
	#這個是指多長時間檢查一次緩存的有效信息。
	open_file_cache_min_uses 1;
	#open_file_cache指令中的inactive參數時間內文件的最少使用次數,若是超過這個數字,文件描述符一直是在緩存中打開的,如上例,若是有一個文件在inactive
    #包含其它配置文件,如自定義的虛擬主機
    include vhosts.conf;
}

配置詳解2以下:

#這裏爲後端服務器wugk應用集羣配置,根據後端實際狀況修改便可,tdt_wugk爲負載均衡名稱,能夠任意指定
	#但必須跟vhosts.conf虛擬主機的pass段一致,不然不能轉發後端的請求。weight配置權重,在fail_timeout內檢查max_fails次數,失敗則剔除均衡。
	upstream tdt_wugk {
		server   127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
		server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=30s;
	}
   #虛擬主機配置
	server {
		#偵聽80端口
        listen       80;
        #定義使用www.wuguangke.cn訪問
        server_name  www.wuguangke.cn;
        #設定本虛擬主機的訪問日誌
        access_log  logs/access.log  main;
			root   /data/webapps/wugk;  #定義服務器的默認網站根目錄位置
        index index.php index.html index.htm;   #定義首頁索引文件的名稱
        #默認請求
        location ~ /{
          root   /data/www/wugk;      #定義服務器的默認網站根目錄位置
          index index.php index.html index.htm;   #定義首頁索引文件的名稱
          #如下是一些反向代理的配置.
		  proxy_next_upstream http_502 http_504 error timeout invalid_header;
		  #若是後端的服務器返回50二、50四、執行超時等錯誤,自動將請求轉發到upstream負載均衡池中的另外一臺服務器,實現故障轉移。
          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_pass  http://tdt_wugk;     #請求轉向後端定義的均衡模塊
       }
	   
        # 定義錯誤提示頁面
			error_page   500 502 503 504 /50x.html;  
            location = /50x.html {
            root   html;
        }
		#配置Nginx動靜分離,定義的靜態頁面直接從Nginx發佈目錄讀取。
		location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
		{
			root /data/www/wugk;
			#expires定義用戶瀏覽器緩存的時間爲3天,若是靜態頁面不常更新,能夠設置更長,這樣能夠節省帶寬和緩解服務器的壓力。
			expires      3d;
		}
        #PHP腳本請求所有轉發到 FastCGI處理. 使用FastCGI默認配置.
        location ~ \.php$ {
            root /root;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME /data/www/wugk$fastcgi_script_name;
            include fastcgi_params;
        }
        #設定查看Nginx狀態的地址
        location /NginxStatus {
            stub_status  on;
        }
     }
}

Nginx 內置綁定變量

名稱 說明
$arg_name 請求中的name參數
$args 請求中的參數
$binary_remote_addr 遠程地址的二進制表示
$body_bytes_sent 已發送的消息體字節數
$content_length HTTP 請求信息裏的"Content-Length"
$content_type 請求信息裏的"Content-Type"
$document_root 針對當前請求的根路徑設置值
$host 請求信息中的"Host",若是請求中沒有Host行,則等於設置的服務器名
$hostname 機器名使用 gethostname系統調用的值
$http_cookie cookie 信息
$http_referer 引用地址
$http_user_agent 客戶端代理信息
$http_via 最後一個訪問服務器的Ip地址。
$http_x_forwarded_for 至關於網絡訪問路徑
$is_args 若是請求行帶有參數,返回「?」,不然返回空字符串
$limit_rate 對鏈接速率的限制
$nginx_version 當前運行的nginx版本號
$pid worker 進程的PID
$query_string 與args相同
$realpath_root 按root指令或alias指令算出的當前請求的絕對路徑。其中的符號連接都會解析成真是文件路徑,使用 Nginx 內置綁定變量
207$remote_addr 客戶端IP地址
$remote_port 客戶端端口號
$remote_user 客戶端用戶名,認證用
$request 用戶請求
$request_body 這個變量(0.7.58+) 包含請求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比較有意義
$request_body_file 客戶端請求主體信息的臨時文件名
$request_completion 若是請求成功,設爲"OK";若是請求未完成或者不是一系列請求中最後一部分則設爲空
$request_filename 當前請求的文件路徑名,好比/opt/nginx/www/test.php
$request_method 請求的方法,好比"GET"、"POST"等
$request_uri 請求的URI,帶參數
$scheme 所用的協議,好比http或者是https
$server_addr 服務器地址,若是沒有用listen指明服務器地址,使用這個變量將發起一次系統調用以取得地址(形成資源浪費)
$server_name 請求到達的服務器名
$server_port 請求到達的服務器端口號
$server_protocol 請求的協議版本,「HTTP/1.0"或"HTTP/1.1」
$uri 請求的URI,可能和最初的值有不一樣,好比通過重定向之類的

參考資料

http://www.linuxidc.com/Linux/2016-09/134907.htm

https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx/nginx.html

布爾教育課件


掃碼關注公衆號有驚喜

(轉載本站文章請註明做者和出處 方誌朋的博客

相關文章
相關標籤/搜索