1. 程式人生 > >linux-nginx-1

linux-nginx-1

web 暫存 壓縮 中斷 uwsgi 1.9 with keepaliv socket

NGINX
機器環境:web主機192.168.2.18 centos7 測試主機192.168.2.29
Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器,具有占用內存少,並發能力強等優點。
官網:www.nginx.org
官方文檔:http://nginx.org/en/docs/
中文文檔:http://tengine.taobao.org/nginx_docs/cn/docs/
二、nginx的功能與特性
1、基本功能及特性
①作為靜態資源的web服務器,能緩存打開的文件描述符;
②作為反向代理服務器,可做緩存、負載均衡;
③支持FastCGI
④模塊化,非DSO機制(不能動態裝卸載),過濾器gzip,SSI和圖像大小調整等
⑤支持SSL
2、擴展功能:
①基於名稱和IP做虛擬主機
②支持keepalive
③支持平滑配置更新或程序版本升級
④定制訪問日誌,支持使用日誌緩存以提高性能
⑤支持url rewrite
⑥支持路徑別名
⑦支持基於IP及用戶的認證;
⑧支持速率限制,並發限制等;

三、nginx的進程模型
技術分享圖片

◆nginx會運行一個主進程(master)和若幹個由其fork出來的工作進程(worker),配置了緩存時還會有緩存加載器進程(cache loader)和緩存管理器進程(cache manager)等。所有進程均是僅含有一個線程,並主要通過“共享內存”的機制實現進程間通信。連接請求就由為數不多的幾個僅包含一個線程的worker進程以高效的回環(run-loop)機制進行處理,這樣就不會引起很多的進程/線程上下文切換,從而降低了系統開銷。每個線程內部對socket的管理方式是異步非阻塞的,使用epoll事件驅動機制來實現對大量socket描述符的管理,當描述符多的時候也只是會占用較多的內存而已,而不會造成占用大量cpu時間,這就是nginx並發能力強的原因。每個worker可以並行處理數千個的並發連接及請求。

每個worker進程是平等的,當有連接請求進來,交由哪個worker處理呢?master進程在建立需要listen的socket之後,fork出若幹個worker進程,所有worker進程會搶互斥鎖,搶到的的接受並處理連接請求,返回數據給客戶端,最後斷開連接,一個請求只在由一個worker處理。
worker數是可以設置的:如果負載以CPU密集型應用為主,如SSL或壓縮應用,則worker數應與CPU數相同;如果負載以IO密集型為主,如響應大量內容給客戶端,則worker數應該為CPU個數的1.5或2倍。
主進程以root用戶身份運行,而worker、cache loader和cache manager均應以非特權用戶身份運行。
主進程主要完成如下工作:
①讀取並驗正配置信息;
②創建、綁定及關閉套接字;
③啟動、終止及維護worker進程的個數;
④無須中止服務而重新配置工作特性;
⑤控制非中斷式程序升級,啟用新的二進制程序並在需要時回滾至老版本;
⑥重新打開日誌文件,實現日誌滾動;
⑦編譯嵌入式perl腳本;
worker進程主要完成的任務包括:
①接收、傳入並處理來自客戶端的連接;
②提供反向代理及過濾功能;
③nginx任何能完成的其它任務;
cache loader進程主要完成的任務包括:
①檢查緩存存儲中的緩存對象;
②使用緩存元數據建立內存數據庫;
cache manager進程的主要任務:
①緩存的失效及過期檢驗;

     四、nginx的模塊和工作原理

nginx代碼是由內核和一系列的模塊組成, nginx內核主要用於提供Web Server的基本功能,以及Web和Mail反向代理的功能;還用於啟用網絡協議,創建必要的運行時環境以及確保不同的模塊之間平滑地進行交互。不過,大多跟協議相關的功能和某應用特有的功能都是由nginx的模塊實現的。
◆nginx模塊從結構上分為:
核心模塊
http模塊
http標準模塊
http可選模塊
如 http_stub_status_module,http_ssl_module,http_gzip_static_module
郵件模塊
第三方擴展模塊
◆nginx模塊從功能上分為:
handlers:此類模塊直接處理請求,並生成內容
filter:此類模塊對其它handlers生成的內容進行修改,最後由nginx輸出
proxies:此類模塊主要與後端服務如fastcgi進行交互,實現服務代理和負載均衡等功能

NGINX 1.9.11開始增加加載動態模塊支持,從此不再需要替換nginx文件即可增加第三方擴展。目前官方只有幾個模塊支持動態加載,第三方模塊需要升級支持才可編譯成模塊。
這裏可以參考這篇文章https://www.cnblogs.com/tinywan/p/6965467.html
五、nginx安裝
首先要先安裝開發環境
yum -y groupinstall "Development Tools" "Server Platform Development"
nginx的rewrite模塊和http核心模塊會用到PCRE正則表達式語法,所以要安裝pcre-devel
yum -y install gcc pcre-devel openssl-devel zlib-devel
我們這裏采用yum安裝,需要有epel源,配置epel源:
yum install epel-release.noarch
yum install nginx
補充一個編譯安裝的例子
首先創建nginx用戶和組
groupadd nginx
useradd -r -s /sbin/nologin nginx
下載源碼包
wget http://nginx.org/download/nginx-1.14.0.tar.gz
tar xf nginx-1.14.0.tar.gz
cd nginx-1.14.0
./configure \
--prefix=/usr/local/nginx
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \ #指定以什麽身份運行worker進程
--group=nginx \
--with-http_ssl_module \
--with-http_flv_module \ #流媒體模塊
--with-http_stub_status_module \ #監控運行狀態的模塊
--with-http_gzip_static_module \
--http-client-body-temp-path=/usr/local/nginx/client \ #臨時包體的暫存路徑
--http-proxy-temp-path=/usr/local/nginx/proxy \
--http-fastcgi-temp-path=/usr/local/nginx/fcgi \
--http-uwsgi-temp-path=/usr/local/nginx/uwsgi \
--http-scgi-temp-path=/usr/local/nginx/scgi \
--with-pcre
make && make install

linux-nginx-1