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 -HUPcat /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,可能和最初的值有不同,比如經過重定向之類的 |
參考資料
布林教育課件
掃碼關注公眾號有驚喜
(轉載本站文章請註明作者和出處 方誌朋的部落格)