基本的HTTP服務器特性
- 處理靜態文件,索引文件以及自動索引;打開文件描述符緩存(緩存元數據和文件描述符,下一次能夠直接從內存找到數據或者文件的位置);
- 使用緩存加速反向代理;簡單負載均衡以及容錯(後端服務的健康情況檢查);
- 遠程FastCGI,uwsgi,SCGI,和memcached服務的緩存加速支持;簡單的負載均衡以及容錯;
- 模塊化的架構。過濾器包括gzip壓縮、ranges支持、chunked響應、XSLT,SSI以及圖像縮放。在SSI 過濾器中,一個包含多個SSI的頁面,若是經由FastCGI或反向代理處理,可被並行處理;
- 支持SSL,TLS SNI。
Tengine(淘寶的nginx或叫tnginx,整合很是多的第三方插件)
varnish:提供緩存,有限內存緩存(使用算法使性能更好)
squid:它和varnish就比如httpd和nginx
nginx:其緩存功能保存到磁盤中
已經附帶了memcached,能夠直接管理memcached
httpd:既支持磁盤緩存,有支持內存緩存
其餘的HTTP服務器特性
- 基於名字和IP的虛擬主機;
- Keep-alive和pipelined鏈接支持;
- 靈活的配置;
- 從新加載配置以及在線升級時,不須要中斷正在處理的請求;
(新的鏈接創建是使用新的配置,老的鏈接則在在下一次請求時候使用新配置,這種方式較nginx的熱部署,平滑升級)- 自定義訪問日誌格式,帶緩存的日誌寫操做(先將日誌放於緩存,而後存在磁盤)以及快速日誌輪轉(日誌滾動);
- 3xx-5xx錯誤代碼重定向;
- 重寫(rewrite)模塊:使用正則表達式改變URI;
- 根據客戶端地址執行不一樣的功能;(根據客戶端的類型好比手機設備返回wrap頁面)
- 基於客戶端IP地址和HTTP基本認證機制的訪問控制;
- 支持驗證HTTP referer;(ngx_http_referer_module模塊容許攔截「Referer」請求頭中含有非法值的請求,阻止它們訪問站點。 須要注意的是僞造一個有效的「Referer」請求頭是至關容易的, 所以這個模塊的預期目的不在於完全地阻止這些非法請求,而是爲了阻止由正常瀏覽器發出的大規模此類請求。 還有一點須要注意,即便正常瀏覽器發送的合法請求,也可能沒有「Referer」請求頭。好比你的網站A的圖片被網站B盜鏈了,當訪問B的時候會產生對A的大量的訪問,致使A訪問量過大,用此方式修改只容許站內鏈接)
- 支持PUT、DELETE、MKCOL、COPY以及MOVE方法;
- 支持FLV流和MP4流;
- 速度限制;
- 來自同一地址的同時鏈接數或請求數限制;
- 嵌入Perl語言。
架構和擴展性
- 一個主進程和多個工做進程,工做進程以非特權用戶運行;
- 支持的事件機制:kqueue(FreeBSD 4.1+)、epoll(Linux 2.6+)、rt signals(realtime signals Linux 2.2.19+)、/dev/poll(Solaris 7 11/99+)、event ports(Solaris 10)、select以及poll;
- 衆多支持的kqueue特性包括EV_CLEAR、EV_DISABLE(臨時禁止事件)、NOTE_LOWAT、EV_EOF,可用數據的數量,錯誤代碼;
- 支持sendfile(FreeBSD 3.1+, Linux 2.2+, Mac OS X 10.5+)、sendfile64(Linux 2.4.21+)和sendfilev(Solaris 8 7/01+);
- 文件AIO(FreeBSD 4.3+, Linux 2.6.22+);
- DIRECTIO (FreeBSD 4.4+, Linux 2.4+, Solaris 2.6+, Mac OS X);
- 支持Accept-filters(FreeBSD 4.1+, NetBSD 5.0+,能夠只接受有限的鏈接 )和 TCP_DEFER_ACCEPT(Linux 2.4+);
- 10000個非活躍的HTTP keep-alive鏈接僅佔用約2.5M內存;
- 儘量避免數據拷貝操做(如sendfile)。
上圖中master監控worker進程運行情況。master是由管理員啓用的,加載配置文件來進行全局管理,worker是使用普通用戶,由master發起,是master的子進程。nginx是高度模塊化的,向上圖中worker進程中有不少模塊,用戶發起的請求交給worker進程,而其自己交給本身的模塊進行相應的處理,這些模塊以流水線的形式進行工做的,好比第一個模塊解析請求的頭部, 第二個取得數據,第三個建立相應。
上面的描述:
從新加載配置以及在線升級時,不須要中斷正在處理的請求
詳細的過程是,當新的配置文件加載到nginx時,nginx創建新的worker進程(使用新的配置文件)來相應新的請求,而原來的worker進程在完成之前的請求以後被master kill掉,因而動態緩慢加載新的配置文件完成內容
- 主進程主要完成以下工做:
- 讀取並驗正配置信息;
- 建立、綁定及關閉套接字;
- 啓動、終止及維護worker進程的個數;
- 無須停止服務而從新配置工做特性;
- 控制非中斷式程序升級,啓用新的二進制程序並在須要時回滾至老版本;(相似從新加載配置文件加載,新版本的master兼容老版本的worker)
- 從新打開日誌文件,實現日誌滾動;
- 編譯嵌入式perl腳本;
- worker進程主要完成的任務包括:
- 接收、傳入並處理來自客戶端的鏈接;
- 提供反向代理及過濾功能;
- nginx任何能完成的其它任務;
cache loader進程主要完成的任務包括:- 檢查緩存存儲中的緩存對象;
- 使用緩存元數據創建內存數據庫;
- cache manager進程的主要任務:
- 緩存的失效及過時檢驗;
Nginx的配置有着幾個不一樣的上下文:main(對任何配置都生效,全局的)、http(包括server,upstream實現反向代理,location定義訪問相應),還有實現郵件服務反向代理的mail。配置語法的格式和定義方式遵循所謂的C風格,所以支持嵌套,還有着邏輯清晰並易於建立、閱讀和維護等優點。- sendfile:
步驟一:系統調用read致使了從用戶空間到內核空間的上下文切換。DMA模塊從磁盤中讀取文件內容,並將其存儲在內核空間的緩衝區內,完成了第1次複製。
步驟二:數據從內核空間緩衝區複製到用戶空間緩衝區,以後系統調用read返回,這致使了從內核空間向用戶空間的上下文切換。此時,須要的數據已存放在指定的用戶空間緩衝區內(參數tmp_buf),程序能夠繼續下面的操做。
步驟三:系統調用write致使從用戶空間到內核空間的上下文切換。數據從用戶空間緩衝區被再次複製到內核空間緩衝區,完成了第3次複製。不過,此次數據存放在內核空間中與使用的socket相關的特定緩衝區中,而不是步驟一中的緩衝區。
步驟四:系統調用返回,致使了第4次上下文切換。第4次複製在DMA模塊將數據從內核空間緩衝區傳遞至協議引擎的時候發生,這與咱們的代碼的執行是獨立且異步發生的。你可能會疑惑:「爲什麼要說是獨立、異步?難道不是在write系統調用返回前數據已經被傳送了?write系統調用的返回,並不意味着傳輸成功——它甚至沒法保證傳輸的開始。調用的返回,只是代表以太網驅動程序在其傳輸隊列中有空位,並已經接受咱們的數據用於傳輸。可能有衆多的數據排在咱們的數據以前。除非驅動程序或硬件採用優先級隊列的方法,各組數據是依照FIFO的次序被傳輸的(圖1中叉狀的DMA copy代表這最後一次複製能夠被延後)。
採用sendfile能夠很好地避免在將數據有DMA傳入用戶空間,再由用戶空間傳入內核空間的socket緩衝:
步驟一:mmap系統調用致使文件的內容經過DMA模塊被複制到內核緩衝區中,該緩衝區以後與用戶進程共享,這樣就內核緩衝區與用戶緩衝區之間的複製就不會發生。
步驟二:write系統調用致使內核將數據從內核緩衝區複製到與socket相關聯的內核緩衝區中。
步驟三:DMA模塊將數據由socket的緩衝區傳遞給協議引擎時,第3次複製發生。
>本文采用編譯安裝的方式
解決依賴關係
編譯安裝nginx須要事先須要安裝開發包組」Development Tools」和 「Development Libraries」。同時,還須要專門安裝pcre-devel包:nginx
yum -y install zlib zlib-devel openssl openssl-devel pcre-devel gd-devel
添加用戶正則表達式
groupadd -r nginx
useradd -r -g nginx nginx
編譯安裝算法
./configure \
--prefix=/usr \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-http_v2_module \
--with-http_image_filter_module \
--with-pcre \
--with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'
make
make install
配置支持Centos7 systemctl服務管理數據庫
vim /lib/systemd/system/nginx.service
添加下面內容vim
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
能夠經過systemctl status start stop來看nginx服務內容後端
配置nginx瀏覽器
vim /etc/nginx/nginx.conf
#在http節點下,添加upstream節點
upstream mysite {
server 172.20.13.229:8081;
server 172.20.13.230:8082;
}
#修改server節點下的location節點
location / {
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_buffering off;
proxy_pass http://mysite;
}
#主要內容在mysite中
完成:)緩存