作者:方誌朋
來源:https://blog.csdn.net/forezp/article/details/78616591

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.官網下載

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.gzcd 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 常用配置如下:

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

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 內置綁定變量

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

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

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

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

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

參考資料

http://www.linuxidc.com/Linux/2016-09/134907.htm
https://moonbingbing.gitbooks.io/openresty-best-practices/content/ngx/nginx.html
布爾教育課件
相关文章