Nginx基礎
前言
apache在設計的時候已經考慮了并發訪問模型,select()機制可以響應1024個訪問,但是當數量再大,千萬級別的時候http就響應不過來了。這個時候,nginx的出現解決了這一個問題。nginx是一個安裝簡單、配置文件簡單、占用內存少、穩定性高、處理并發能力非常強、靈活好用等有點聚集于一身的輕量級服務器。在Linux操作系統中,Nginx使用epoll事件模型,效率相當高,Nginx能夠支持高達5萬個并發連接數的響應,在高連接并發的情況下,Nginx是apache服務器不錯的替代品。
一、IO模型相關概念
1、同步模型:
一個任務的完成需要依賴另一個任務的時候,被依賴的完成后才能完成這個任務。
A依賴于B,B完成了,才能完成A。http進程去調用內核在那等著,內核去磁盤上加載資源,資源加載完了,返回給http進程,http進程才能進行下一步。
2、異步模型:
調用者無需等待被調用者完成,只是通知被依賴的任務,我要完成什么事,你來幫我完成,要依賴于通知,依賴于回調函數。
3、消息通知
被調用者
同步:等待對方返回消息
異步:被調用者通過消息通知或回調,狀態是調用者每隔一段時間要檢查一次,處于盲等狀態。通知是好了就來通知。
調用者
阻塞:block (盲等) 調用結果返回之前,調用者會被掛起
非阻塞:nonblock (非盲等)
4、IO模型
同步阻塞:同步掛起
同步非阻塞:同步沒掛起,它是怎么等待數據呢?數據準備好了,開始第二階段了怎么辦,所有那個去干別的事的進程要反復輪巡,過一會跑過來看看,數據加載完了沒有,非阻塞的也變成阻塞的了,性能極差。
IO復用:為了解決同步非阻塞的進程老來查詢數據,就準備了一個顯示器【seletc(),1024】,最多顯示1024個,你別來輪巡內核了,直接看輪巡屏幕就好了。
異步:不會阻塞,也可能會阻塞,在等待消息上。
5、IO分類
網絡IO:本質是socket讀取
磁盤IO:流
6、每次IO經過的兩個階段
數據首先會從磁盤或網絡先加載到內核內存(緩沖區),等待數據準備完成
數據從內核緩沖區復制到用戶空間的進程的內存中去,數據從內核復制到進程中去。
7、區別
同步阻塞:第一二階段全部掛起
異步非阻塞:第一階段沒掛起,盲等,第二階段掛起
IO復用:第一階段阻塞,到大屏幕上,而不是內核上,第二階段也阻塞。
二、Nginx概念
1、Nginx特性:
(1)模塊化設計,較好的擴展性;
(2)高可靠性,master/worker
(3)支持熱部署:不停更新配置文件、更換日志文件更新服務程序版本;
(4)低內存消耗:10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存
(5)基本功能:靜態資源的web服務器,可為http做反向代理。還有POP3limap4協議的反向代理服務器,郵件,FASTCGI等協議;lnmp。模塊化(非DSO),編譯時確定:著名的有zip,ssl,……;與web服務器相關的功能:虛擬主機,keepalive,訪問日志,url,rewrite,路勁別名,基于ip及用戶的訪問控制,速率限制及并發數限制。
2、Nginx的程序架構
master\worker架構:一個master進程,可生成一個或多個work進程;
master:加載配置文件,管理worker進程,平滑升級……
worker:http服務,http代理,fastcgi代理
3、Nginx的模塊類型
(1)核心模塊:core module (2)標準模塊:httpd模塊(標準的httpd模塊和可選的httpd模塊) (3)3rd party modules
4、nginx的安裝epel源(下面用編譯的方法安裝)
1、安裝編譯環境:
yum groupinstall "Development Tools" "Server Platform Development" -y
2、安裝可能要啟用的東西:openssl、pcre、zlib等等
yum -y install openssl-devel pcre-devel zlib-devel
3、創建nginx系統用戶
useradd -r nginx
4、在nginx官網下載nginx,解壓縮,次版本號是雙數則是穩定版
wget http://nginx.org/download/nginx-1.8.1.tar.gz
5、根據需要configure
./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=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 --with-http_ssl_module --with-debug --with-http_stub_status_module --with-http_gzip_static_module
6、啟動:/usr/local/nginx/sbin/nginx
7、報錯如下:
問題是,錯誤的原因是沒有創建nginx這個用戶,應該在服務器系統中添加nginx用戶組和用戶nginx,方法如下:
/usr/sbin/groupadd -f nginx /usr/sbin/useradd -g nginx nginx
ps aux 可以看到進程
8、然后可以啟動了,命令太長了怎么辦,修改一下
vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
exec bash /etc/profile.d/nginx.sh (立即生效)
nginx -t 是檢測配置文件是否正確的
nginx -s reload 重載nginx
nginx -s stop 停止啟動
nginx 啟動
9、配置文件(主配置文件/etc/nginx下的nginx.conf)
主要配置文件是:nginx.conf
可以自定義 conf.f/*.conf
還有facsgi、scgi、uwscgi的相關配置
配置指令(必須以分號結尾);
支持使用變量:內置變量(由模塊引入,可以直接使用),自定義變量(set variablename value),引入變量($variablename)
三、配置文件結構(三大塊)
main block :全局配置,對http及mail模塊均有效;
worker-processes 1;表示有幾個worker進程 worker-connectios 1024;表示每個worker進程同時可以響應多少個進程
event 部分:事件驅動的相關配置
http部分:http協議相關配置,web相關的都放在這里面
http { …… 公共配置 server { ……虛擬主機自己的配置 } server{ …… server_name 主機名 root -->DocumentRoot alias-->http alias location /url/{ …… } } }
1、main配置段:全局配置
官網可以看具體使用方法:http://nginx.org/en/docs/ngxcoremodule.html
配置指令的類別:正常運行必備的配置;優化性能的配置;用于調試、定位問題的配置
(1)正常運行必備的配置
1、user USERNAME [GROUPNAME]; 指定用戶運行work進程的用戶和組; 例如:user nginx nginx; 2、pid /PAEH/TO/PID_FILE;指明運行時的pid文件在哪,指定nginx進程的pid文件路徑: pid /var/run/nginx.pid; 3、worker_rlimit_nofile number:單個work進程可以打開的最大文件數,默認是1024個,如果有很多,可以調大一點
(2)性能優化相關配置:
1、worker_processes number |auto;自動設定,1.8以后才支持 用來指明work作進程的進程數 通常應該為cpu的核心數減1,可以是auto 16核服務器,14個隔離出來,2個運行,剩下14個每個綁一個work,不這樣做,每個cpu核心都需要被work進程去調度的,不斷的被進程切換著,nginx被切換出去以后,下次再切換過來就不一定是原來那個核了,cpu本地緩存就不能應用了,性能得不到提升,nginx性能很重要。 ps aux 有幾個worker process lscpu 看cpu有幾個 可以相同,也可以-1.
2、work_cpu_affinity cpumask ...; worker_cpu_affinity auto [cpumask],auto是自動綁定,也可能不支持 work_processes 2; work_cpu_affinity 0010 0100; 含義就是選的兩個work_process,綁定在哪兩個cpu上
(3)指明進程優先級,nice越小,優先級越高
1、worker_priority number;優先級 nice:[-20,19] ps axo command,pid,psr,ni 例子:worker_priority -5;檢測,重載
(4)調試定位問題:
1、daemon on |off; 是否以守護進程方式啟動Nginx,默認是 2、master——process on|off; 是否以master|work 模式啟動,正常都應該啟動 3、error_log 錯誤日志文件記錄方式及日志級別 debug要使用,在編譯時--with要加上 方式: file /PATH/TO/SOME_LOG_FILE; stderr:發送到錯誤輸出,在當前終端 syslog:server=address[parameter=value]:發送到syslog服務器; memory:size,記錄內存中,已關機就沒了 日志級別: debug依賴于configure --with-debug選項
2、event配置段
1、worker_connections number;最大并發響應數 每個work進程所能夠打開的最大連接數;默認是512個 最大連接數=work_process*work_connections 2、use method; 指明并發連接請求處理時使用的方法; 3、accept_mutex on 讓work processes輪流的接受新的連接,一般都啟用,啟用時表示用于讓多個work輪流地序列化地響應請求 4、lock_file file; nginx使用鎖機制去管理互斥
3、http配置段(重點)
官方參考:http://nginx.org/en/docs/http/ngxhttpcore_module.html
五大塊:定義套接字相關功能,定義路徑相關配置,定義客戶端請求的相關配置,對客戶的請求進行限制的相關配置,文件操作優先的配置。
(1)定義套接字相關功能
1、server{……} 定義虛擬主機的 對于nginx,基于ip與主機名沒什么區分 server { 很容易 listen port; server_name HOSTNAME;(主機名,可以使用正則表達式的模式) root /PATH/TO/DOCUMENTROOT; …… }
2、listen 監聽在哪個端口,格式如下: listen address listen port listen unix 例如: listen 127.0.0.1:8000; listen 127.0.0.1; listen 8000; listen *:8000; listen localhost:8000;
default_server :設置默認虛擬主機 ssl:限制通過ssl連接提供服務 backlog:后緩隊列的長度 rcvbuf:接收緩沖大小 sndbuf:發送緩沖區大小
3、server_name name ...; 指明當前server的主機名;后可跟一個或空白字符分隔的多個主機,支持使用*,任意長度的任意字符 例如:www.magedu.com 支持~起始的正則表達式模塊字符串 server_name www.magedu.com; server_name *.magedu.com; server_name www.magedu.*; server_name -^.*\.magedu\.*$; mail.magedu.com 2,4 優先是2 www.magedu.com 1,2,3,4 優先是1 越精確,優先級越高
(2)定義路徑相關配置:
1、root path:設置web資源路徑映射,用于指明用戶請求的url所對應的本地文件系統的文檔目錄路徑;可用上下文有:http,server,location,if 例子:把location的root注釋掉,自己在server下面加,http下也可以加,可以對多個server生效 root /web/html/;
測試如下:(果然比http簡單多了)
vim nginx.conf,再加個server server { listen 80; server_name www.cwj.com www.a.com; root /web/html2; }
為了便于管理,我們也可以令創建一個文件,專門編輯這些主機文件,如下,在/etc/nginx 下創建一餓個conf.d的目錄,然后編輯host2.conf:
vim conf.d/host2.conf vim nginx.conf include conf.d/*.conf;
注意事項:
(1)基于port的虛擬主機:listen指令要使用不同的端口 (2)基于hostname的虛擬主機:server_name指令指向不同的主機名 (3)基于ip的虛擬主機:listen ip:port;
2、tcp_nodelay on|off 對keepalived模式下的連接是否啟用TCP_NODELAY選項 3、tcp_nopush on|off ;默認的選off 4、sendfile:在內核封裝后直接發送給客戶端,不反回httpd或者nginx,默認是off,要on起來 5、location 很有用,根據用戶請求的url來匹配定義的location,匹配到時,請求將被相應的location塊中的配置所處理; 例如: root /web/host1; 路徑是:/web/host1/images/1.jpg 主機名是:www.cwj.com 網址應該是:http://www.cwj.com/images/1.jpg location 含有if之意,引入一個新的上下文,里面如果可以匹配到,則執行 location ~*\.txt { gzip on ; } server {可以多個,嵌套 …… location { } location { } …… } =:url精確匹配,用戶使用的與這里完全不差 ~:正則表達式模式匹配,區分大小寫 ~*:正則表達式模式匹配,不區分大小寫 ^~:牟定行首的,url左半部分進行匹配 優先級:越精確,越優先:= ^~ ~|~* 不帶符號的 6、alias 同http alias ,路徑別名 alias path;定義路徑別名,文檔映射的一種機制,僅能用于location上下文 例如: alias /bbs/ /web/forum/ ,既是 /bbs/ = /web/forum/ http://www.magedu.com/bbs/a.jpg /web/forum/a.jpg location /bbs/ { alias /web/forum/; } /web/forum/a.jpg location /bbs/ { root /web/forum/; } /web/forum/bbs/a.jpg root指令:給定的路徑對于location中的/url/最左側的/ 7、index: 可用的位置:http,server,location,默認主頁 8、error_page:自定義錯誤頁面,基本能力 根據用戶請求的http響應狀態碼實現錯誤重定向 例如: error_page 404 /404.html; error_page 500 502 503 504 /50x.html; 9、try_files 嘗試文件 查找頁面不在時
(3)定義客戶端請求的相關配置
1、keepalive 設定保持連接的超時時長,0表示禁止啟用長連接,默認是75s 2、keepalive_requests number 在一次長連接上所允許請求的資源的最大數量,默認是100 3、keepalive_disable name|browser ... 說明對哪種瀏覽器禁用 4、send_timeout time:向客戶端發送響應報文的超時時長,默認是60s 5、client_body_buffer_size size; 用于接受客戶請求報文body部分的緩沖區大小; 默認是16K;超出此大小時,其將被暫存到磁盤上 6、client_body_temp_path path [level1 |level2 ……]; 設定用于存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;
(4)客戶端請求進行限制的相關匹配
1、limit_rate (限制速率)默認為0,限制每秒鐘響應給客戶端的傳輸速率,字節/秒 location /download/ { limit_rate 20480; } 2、limit_except method 限制請求方法 限制對指定的請求方法之外的其他方法的使用客戶端 limit_except GET POST { allow 192.168.1.109; deny all; } 表示除了GET和POST之外的其他方法,僅允許172.18.0.0/16中的主機使用 3、密鑰訪問: htpasswd -c -m /etc/nginx/.ngxpasswd tom htpasswd -m /etc/nginx/.ngxpasswd jerry location /admin/ { auth _basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; } mkdir /web/html2/admin vim /web/html2/admin/index.html
nginx -t nginx -s reload
輸入密碼
原創文章,作者:N24_yezi,如若轉載,請注明出處:http://www.www58058.com/64591