1. 程式人生 > >Openresty最佳案例 | 第1篇:Nginx介紹

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

Nginx 簡介

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

由於Nginx採用的是事件驅動的架構,能夠處理併發百萬級別的tcp連線,高度的模組化設計和自由的BSD許可,使得Nginx有著非常豐富的第三方模組。比如Openresty、API閘道器Kong。

BSD開源協議是一個給予使用者很大自由的協議。基本上使用者可以"為所欲為",可以自由的使用,修改原始碼,也可以將修改後的程式碼作為開源或者專有軟體再發布。

Nginx的優點

  • 高併發響應效能非常好,官方Nginx處理靜態檔案併發5w/s
  • 反向代理效能非常強。(可用於負載均衡)
  • 記憶體和cpu佔用率低。(為Apache的1/5-1/10)
  • 對後端服務有健康檢查功能。
  • 支援PHP cgi方式和fastcgi方式。
  • 配置程式碼簡潔且容易上手。

Nginx的安裝

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

1.gcc 安裝

安裝 nginx 需要先將官網下載的原始碼進行編譯,編譯依賴 gcc 環境,如果沒有 gcc 環境,則需要安裝:

yum install gcc-c++

2.PCRE pcre-devel 安裝

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

yum install -y pcre pcre-devel

3.zlib 安裝

zlib 庫提供了很多種壓縮和解壓縮的方式, nginx 使用 zlib 對 http 包的內容進行 gzip ,所以需要在 Centos 上安裝 zlib 庫。

yum install -y zlib zlib-devel

4.OpenSSL 安裝

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

yum install -y openssl openssl-devel

5.官網下載

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

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;
		  #如果後端的伺服器返回502、504、執行超時等錯誤,自動將請求轉發到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,可能和最初的值有不同,比如經過重定向之類的

參考資料

布林教育課件


掃碼關注公眾號有驚喜

(轉載本站文章請註明作者和出處 方誌朋的部落格