nginx

簡介

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已處理完正在等候下一次請求指令的駐留連接
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章