目錄html
nginx(發音同engine x)是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like協議下發行。前端
nginx由俄羅斯的程序設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler使用。python
第一個公開版本0.1.0發佈於2004年10月4日。其將源代碼以類BSD許可證的形式發佈,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發佈。mysql
nginx的特色是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。nginx
nginx的官網:c++
nginx的特性:web
nginx的基本功能:sql
nginx的優勢:後端
nginx由內核和模塊組成。其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。瀏覽器
nginx的程序結構: master/worker結構
一個master進程:負責加載和分析配置文件、管理worker進程、平滑升級
一個或多個worker進程:處理並響應用戶請求
緩存相關的進程:
cache loader:載入緩存對象
cache manager:管理緩存對象
nginx由內核和模塊組成。其中,內核的設計很是微小和簡潔,完成的工做也很是簡單,僅僅經過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用於URL匹配),而在這個location中所配置的每一個指令將會啓動不一樣的模塊去完成相應的工做。
nginx模塊分類: 模塊分類:
nginx工做原理
nginx模塊一次常規的HTTP請求和響應的過程
web服務請求過程
Nginx的配置文件nginx.conf位於其安裝目錄的conf目錄下。
nginx.conf由多個塊組成,main(全局設置)、event(事件驅動設置)、server(主機設置)、upstream(負載均衡服務器設置)和 location(URL匹配特定位置的設置)。這五者之間的關係式:server繼承main,location繼承server,upstream既不會繼承其餘設置也不會被繼承。
Main 全局配置段常見的配置指令分類:
正常運行必備的配置:
幫助文檔:http://nginx.org/en/docs/ngx_core_module.html
一、user
Syntax: user user [group];
Default: user nobody nobody;
Context: main
指定worker進程的運行身份,如組不指定,默認和用戶名同名
二、pid /PATH/TO/PID_FILE
指定存儲nginx主進程PID的文件路徑
三、include file | mask
指明包含進來的其它配置文件片段
四、load_module file
模塊加載配置文件:/usr/share/nginx/modules/*.conf
指明要裝載的動態模塊路徑: /usr/lib64/nginx/modules
性能優化相關的配置:
一、worker_processes number | auto
worker進程的數量;一般應該爲當前主機的cpu的物理核心數
二、worker_cpu_affinity cpumask ...
worker_cpu_affinity auto [cpumask] 提升緩存命中率
CPU MASK: 00000001:0號CPU
00000010:1號CPU
10000000:8號CPU
worker_cpu_affinity 0001 0010 0100 1000;
worker_cpu_affinity 0101 1010;
三、worker_priority number
指定worker進程的nice值,設定worker進程優先級:[-20,20]
四、worker_rlimit_nofile number
worker進程所可以打開的文件數量上限,如65535
events { ... }
一、worker_connections number
每一個worker進程所可以打開的最大併發鏈接數數量,如10240
總最大併發數:worker_processes * worker_connections
二、use method
指明併發鏈接請求的處理方法 ,默認自動選擇最優方法
use epoll;
三、accept_mutex on | off 互斥
處理新的鏈接請求的方法;on指由各個worker輪流處理新請求,Off指每一個新請求的到達都會通知(喚醒)全部的worker進程,但只有一個進程可得到鏈接,形成「驚羣」,影響性能
http協議的相關配置:
http { ... ... server { ... server_name root location [OPERATOR] /uri/ { ... } } server { ... }
此配置請看隨筆----nginx-http協議具體配置
nginx的其它的二次發行版:
Tengine:由淘寶網發起的Web服務器項目。它在Nginx的基礎上,針對大訪問量網站的需求,添加了不少高級功能和特性。Tengine的性能和穩定性已經在大型的網站如淘寶網,天貓商城等獲得了很好的檢驗。它的最終目標是打造一個高效、穩定、安全、易用的Web平臺。從2011年12月開始,Tengine成爲一個開源項目,官網 http://tengine.taobao.org/
OpenResty:基於 Nginx 與 Lua 語言的高性能 Web平臺
nginx_stream_core_module模塊
模擬反代基於tcp或udp的服務鏈接,即工做於傳輸層的反代或調度器
stream { upstream mysqlsrvs { server 192.168.22.2:3306; server 192.168.22.3:3306; least_conn; } server { listen 10.1.0.6:3306; proxy_pass mysqlsrvs; } }
二、listen
listen address:port [ssl] [udp] [proxy_protocol][backlog=number] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
可實現代理基於TCP,UDP (1.9.13), UNIX-domain sockets的數據流
1 proxy_pass address; 指定後端服務器地址
2 proxy_timeout timeout; 無數據傳輸時,保持鏈接狀態的超時時長,默認爲10m
3 proxy_connect_timeout time; 設置nginx與被代理的服務器嘗試創建鏈接的超時時長,默認爲60s
stream { upstream mysqlsrvs { server 192.168.0.10:3306; server 192.168.0.11:3306; hash $remote_addr consistent; } server { listen 172.16.100.100:3306; proxy_pass mysqlsrvs; proxy_timeout 60s; proxy_connect_timeout 10s; } }
//建立系統用戶nginx [root@localhost ~]# useradd -r -M -s /sbin/nologin nginx //安裝依賴環境 [root@localhost ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++ [root@localhost ~]# yum -y groups mark install 'Development Tools' //建立日誌存放目錄 [root@localhost ~]# mkdir -p /var/log/nginx [root@localhost ~]# chown -R nginx.nginx /var/log/nginx //下載nginx [root@localhost ~]# cd /usr/src/ [root@localhost src]# wget http://nginx.org/download/nginx-1.12.0.tar.gz //編譯安裝 [root@localhost src]# ls debug kernels nginx-1.12.0.tar.gz [root@localhost src]# tar xf nginx-1.12.0.tar.gz [root@localhost src]# cd nginx-1.12.0 [root@localhost nginx-1.12.0]# ./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@localhost nginx-1.12.0]# make -j 2 && make install //設置環境變量 [root@localhost ~]# echo 'export PATH=/usr/local/nginx/sbin:$PATH' > /etc/profile.d/nginx.sh [root@localhost ~]# . /etc/profile.d/nginx.sh //啓動nginx [root@localhost ~]# nginx -t //j檢查配置文件是否有問題 [root@localhost ~]# nginx //啓動nginx [root@localhost ~]# nginx -s stop //中止nginx