簡介
nginx(發音同engine x)是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like協議下發行。
nginx由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler使用。
第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。
nginx的特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
特性與優點
nginx是一個很牛的高性能Web和反向代理服務器,它具有很多非常優越的特性:
- 在高連接併發的情況下,nginx是Apache服務器不錯的替代品,能夠支持高達50000個併發連接數的響應
- 使用epoll and kqueue作爲開發模型
- nginx作爲負載均衡服務器:nginx既可在內部直接支持和PHP程序對外進行服務,也可支持作爲HTTP代理服務器對外進行服務
- nginx採用C進行編寫,不論系統資源開銷還是CPU使用效率都比Perlbal要好很多
優點:
- 高併發連接:官方測試能夠支撐5萬併發連接,在實際生產環境中跑到2-3萬併發連接數
- 內存消耗少:在3萬併發連接下,開啓的10個nginx進程才消耗150M內存(15M*10=150M)
- 配置文件非常簡單:風格跟程序一樣通俗易懂
- 成本低廉:nginx爲開源軟件,可以免費使用。而購買F5 BIG-IP、NetScaler等硬件負載均衡交換機則需要十多萬至幾十萬人民幣
- 支持Rewrite重寫規則:能夠根據域名、URL的不同,將HTTP請求分到不同的後端服務器羣組
- 內置的健康檢查功能:如果Nginx Proxy後端的某臺Web服務器宕機了,不會影響前端訪問
- 節省帶寬:支持GZIP壓縮,可以添加瀏覽器本地緩存的Header頭
- 穩定性高:用於反向代理,宕機的概率微乎其微
- 模塊化設計:模塊可以動態編譯
- 外圍支持好:文檔全,二次開發和模塊較多
- 支持熱部署:可以不停機重載配置文件
- 支持事件驅動、AIO(AsyncIO,異步IO)、mmap(Memory Map,內存映射)等性能優化
nginx的功能及應用類別
nginx的基本功能:
- 靜態資源的web服務器,能緩存打開的文件描述符
- http、smtp、pop3協議的反向代理服務器
- 緩存加速、負載均衡
- 支持FastCGI(fpm,LNMP),uWSGI(Python)等
- 模塊化(非DSO機制),過濾器zip、SSI及圖像的大小調整
- 支持SSL
nginx的擴展功能:
- 基於名稱和IP的虛擬主機
- 支持keepalive
- 支持平滑升級
- 定製訪問日誌、支持使用日誌緩衝區提高日誌存儲性能
- 支持URL重寫
- 支持路徑別名
- 支持基於IP及用戶的訪問控制
- 支持速率限制,支持併發數限制
nginx的應用類別:
- 使用nginx結合FastCGI運行PHP、JSP、Perl等程序
- 使用nginx作反向代理、負載均衡、規則過濾
- 使用nginx運行靜態HTML網頁、圖片
- nginx與其他新技術的結合應用
nginx的模塊與工作原理
nginx由內核和模塊組成。其中,內核的設計非常微小和簡潔,完成的工作也非常簡單,僅僅通過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每個指令將會啓動不同的模塊去完成相應的工作。
nginx的模塊分類
nginx的模塊從結構上分爲核心模塊、基礎模塊和第三方模塊
- HTTP模塊、EVENT模塊和MAIL模塊等屬於核心模塊
- HTTP Access模塊、HTTP FastCGI模塊、HTTP Proxy模塊和HTTP Rewrite模塊屬於基本模塊
- HTTP Upstream模塊、Request Hash模塊、Notice模塊和HTTP Access Key模塊屬於第三方模塊
用戶根據自己的需要開發的模塊都屬於第三方模塊。正是有了如此多模塊的支撐,nginx的功能纔會如此強大
nginx模塊從功能上分爲三類,分別是:
- Handlers(處理器模塊)。此類模塊直接處理請求,並進行輸出內容和修改headers信息等操作。handlers處理器模塊一般只能有一個
- Filters(過濾器模塊)。此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最後由nginx輸出
- Proxies(代理器模塊)。就是nginx的HTTP Upstream之類的模塊,這些模塊主要與後端一些服務比如fastcgi等操作交互,實現服務代理和負載均衡等功能
nginx模塊分爲:核心模塊、事件模塊、標準Http模塊、可選Http模塊、郵件模塊、第三方模塊和補丁等
-
nginx基本模塊:所謂基本模塊,指的是nginx默認的功能模塊,它們提供的指令,允許你使用定義nginx基本功能的變量,在編譯時不能被禁用,包括:
- 核心模塊:基本功能和指令,如進程管理和安全。常見的核心模塊指令,大部分是放置在配置文件的頂部
- 事件模塊:在Nginx內配置網絡使用的能力。常見的events(事件)模塊指令,大部分是放置在配置文件的頂部
- 配置模塊:提供包含機制
具體的指令,請參考nginx的官方文檔
nginx的工作原理
nginx的模塊直接被編譯進nginx,因此屬於靜態編譯方式。
啓動nginx後,nginx的模塊被自動加載,與Apache不一樣,首先將模塊編譯爲一個so文件,然後在配置文件中指定是否進行加載。
在解析配置文件時,nginx的每個模塊都有可能去處理某個請求,但是同一個處理請求只能由一個模塊來完成。
nginx的進程架構:
啓動nginx時,會啓動一個Master進程,這個進程不處理任何客戶端的請求,主要用來產生worker線程,一個worker線程用來處理n個request。
下圖展示了nginx模塊一次常規的HTTP請求和響應的過程
下圖展示了基本的WEB服務請求步驟
nginx的安裝與配置
[root@master ~]# useradd -r -M -s /sbin/nologin nginx
[root@master ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++
[root@master ~]# yum -y groups mark install 'Development Tools'
[root@master ~]# mkdir -p /var/log/nginx
[root@master ~]# chown -R nginx.nginx /var/log/nginx
[root@master ~]# cd /usr/src/
[root@master src]# wget http://nginx.org/download/nginx-1.14.2.tar.gz
[root@master src]# tar xf nginx-1.14.2.tar.gz
[root@master src]# cd nginx-1.14.2
[root@master nginx-1.14.2]# ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-debug \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--error-log-path=/var/log/nginx/error.log
[root@master nginx-1.14.2]# make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install
nginx安裝後配置
[root@master ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh
[root@master ~]# . /etc/profile.d/nginx.sh
//服務控制方式,使用nginx命令
-t //檢查配置文件語法
-v //輸出nginx的版本
-c //指定配置文件的路徑
-s //發送服務控制信號,可選值有{stop|quit|reopen|reload}
//啓動nginx
[root@master ~]# nginx
[root@master ~]# ss -antl
State Recv-Q Send-Q Local Address:Port
LISTEN 0 128 *:80
以service來啓動nginx
[root@master ~]# cd /etc/init.d/
[root@master init.d]# vim nginx
#!bin/bash
case $1 in
start)
/usr/local/nginx/sbin/nginx
;;
stop)
/usr/local/nginx/sbin/nginx -s stop
;;
restart)
/usr/local/nginx/sbin/nginx -s reload
;;
esac
[root@master init.d]# chmod +x nginx
[root@master init.d]# service nginx stop
[root@master init.d]# ss -antl
這樣就可以了
nginx的配置文件詳解
主配置文件:/usr/local/nginx/conf/nginx.conf
- 默認啓動nginx時,使用的配置文件是:安裝路徑/conf/nginx.conf文件
- 可以在啓動nginx時通過-c選項來指定要讀取的配置文件
nginx常見的配置文件及其作用
配置文件 | 作用 |
---|---|
nginx.conf | nginx的基本配置文件 |
mime.types | MIME類型關聯的擴展文件 |
fastcgi.conf | 與fastcgi相關的配置 |
proxy.conf | 與proxy相關的配置 |
sites.conf | 配置nginx提供的網站,包括虛擬主機 |
nginx.conf的內容分爲以下幾段:
- main配置段:全局配置段。其中main配置段中可能包含event配置段
- event {}:定義event模型工作特性
- http {}:定義http協議相關的配置
用於調試、定位問題的配置參數
daemon {on|off}; //是否以守護進程方式運行nginx,調試時應設置爲off
master_process {on|off}; //是否以master/worker模型來運行nginx,調試時可以設置爲off
error_log 位置 級別; //配置錯誤日誌
error_log裏的位置和級別能有以下可選項:
位置 | 級別 |
---|---|
file stderr syslog:server=address[,parameter=value] memory:size |
debug:若要使用debug級別,需要在編譯nginx時使用–with-debug選項 info notice warn error crit alert emerg |
正常運行必備的配置參數
user USERNAME [GROUPNAME]; //指定運行worker進程的用戶和組
pid /path/to/pid_file; //指定nginx守護進程的pid文件
worker_rlimit_nofile number; //設置所有worker進程最大可以打開的文件數,默認爲1024
worker_rlimit_core size; //指明所有worker進程所能夠使用的總體的最大核心文件大小,保持默認即可
事件相關的配置:event{}段中的配置參數
accept_mutex {off|on}; //master調度用戶請求至各worker進程時使用的負載均衡鎖;on表示能讓多個worker輪流地、序列化地去響應新請求
lock_file file; //accept_mutex用到的互斥鎖鎖文件路徑
use [epoll | rtsig | select | poll]; //指明使用的事件模型,建議讓nginx自行選擇
worker_connections #; //每個進程能夠接受的最大連接數
網絡連接相關的配置參數
keepalive_timeout number; //長連接的超時時長,默認爲75s
keepalive_requests number; //在一個長連接上所能夠允許請求的最大資源數
keepalive_disable [msie6|safari|none]; //爲指定類型的UserAgeng禁用長連接
tcp_nodelay on|off; //是否對長連接使用TCP_NODELAY選項,爲了提升用戶體驗,通常設爲on
client_header_timeout number; //讀取http請求報文首部的超時時長
client_body_timeout number; //讀取http請求報文body部分的超時時長
send_timeout number; //發送響應報文的超時時長
fastcgi的相關配置參數
LNMP:php要啓用fpm模型
配置示例如下:
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000; //定義反向代理
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
常需要進行調整的參數
worker_processes
worker_connections
worker_cpu_affinity
worker_priority
nginx作爲web服務器時使用的配置:http{}段的配置參數
http{…}:配置http相關,由ngx_http_core_module模塊引入。nginx的HTTP配置主要包括四個區塊,結構如下:
http {//協議級別
include mime.types;
default_type application/octet-stream;
keepalive_timeout 65;
gzipon;
upstream {//負載均衡配置
...
}
server {//服務器級別,每個server類似於httpd中的一個<VirtualHost>
listen80;
server_name localhost;
location / {//請求級別,類似於httpd中的<Location>,用於定義URL與本地文件系統的映射關係
root html;
index index.html index.htm;
}
}
}
http{}段配置指令:
server {}:定義一個虛擬主機,示例如下:
server {
listen 80;
server_name www.idfsoft.com;
root "/vhosts/web";
}
listen:指定監聽的地址和端口
listen address[:port];
listen port;
server_name NAME […]; 後面可跟多個主機,名稱可使用正則表達式或通配符
當有多個server時,匹配順序如下:
先做精確匹配檢查
左側通配符匹配檢查,如*.idfsoft.com
右側通配符匹配檢查,如mail.*
正則表達式匹配檢查,如~ ^.*\.idfsoft\.com$
default_server
root path; 設置資源路徑映射,用於指明請求的URL所對應的資源所在的文件系統上的起始路徑
alias path; 用於location配置段,定義路徑別名
index file; 默認主頁面
index index.php index.html;
常用修飾符說明:
修飾符 | 功能 |
---|---|
= | 精確匹配 |
~ | 正則表達式模式匹配,區分大小寫 |
~* | 正則表達式模式匹配,不區分大小寫 |
^~ | 前綴匹配,類似於無修飾符的行爲,也是以指定模塊開始,不同的是,如果模式匹配,那麼就停止搜索其他模式了,不支持正則表達式 |
@ | 定義命名location區段,這些區段客戶端不能訪問,只可以由內部產生的請求來訪問,如try_files或error_page等 |
沒有修飾符表示必須以指定模式開始,如:
server {
server_name www.idfsoft.com;
location /abc {
…
}
}
查找順序和優先級:由高到底依次爲
帶有=的精確匹配優先
正則表達式按照他們在配置文件中定義的順序
帶有^~修飾符的,開頭匹配
帶有~或~*修飾符的,如果正則表達式與URI匹配
沒有修飾符的精確匹配
優先級次序如下:
( location = 路徑 ) --> ( location ^~ 路徑 ) --> ( location ~ 正則 ) --> ( location ~* 正則 ) --> ( location 路徑 )
訪問控制
用於location段
allow:設定允許哪臺或哪些主機訪問,多個參數間用空格隔開
deny:設定禁止哪臺或哪些主機訪問,多個參數間用空格隔開
示例:
allow 192.168.1.1/32 172.16.0.0/16;
deny all;
auth_basic "歡迎信息";
auth_basic_user_file "/path/to/user_auth_file"
https配置
生成私鑰,生成證書籤署請求並獲得證書,然後在nginx.conf中配置如下內容:
server {
listen 443 ssl;
server_name www.idfsoft.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
開啓狀態界面
開啓status:
location /status {
stub_status {on | off};
allow 172.16.0.0/16;
deny all;
}
訪問狀態頁面的方式:http://server_ip/status
狀態頁面信息詳解:
狀態碼 | 表示的意義 |
---|---|
Active connections 2 | 當前所有處於打開狀態的連接數 |
accepts | 總共處理了多少個連接 |
handled | 成功創建多少握手 |
requests | 總共處理了多少個請求 |
Reading | nginx讀取到客戶端的Header信息數,表示正處於接收請求狀態的連接數 |
Writing | nginx返回給客戶端的Header信息數,表示請求已經接收完成,且正處於處理請求或發送響應的過程中的連接數 |
Waiting | 開啓keep-alive的情況下,這個值等於active - (reading + writing),意思就是Nginx已處理完正在等候下一次請求指令的駐留連接 |