Nginx基礎

I/O模型:

一次I/O經過兩個階段:
第一步:將數據從磁盤文件先加載至內核內存空間(緩衝區),等待數據準備完成,時間較長
第二步:將數據從內核緩衝區複製到用戶空間的進程的內存中,時間較短

磁盤文件 -----> 內核空間 ----->用戶空間

I/O模型:
同步/異步:關注的是消息通信機制 
同步:synchronous,調用者等待被調用者返回消息,才能繼續執行
異步:asynchronous,被調用者通過狀態,通知或回調機制主動通知調用者被調用者的運行狀態 

阻塞/非阻塞:關注調用者在等待結果返回之前所處的狀態
阻塞:blocking,指IO操作需要徹底完成後才返回到用戶空間,調用結果返回之前,調用者被掛起
非阻塞:nonblocking,指IO操作被調用後立即返回給用戶一個狀態值,無需等到IO操作徹底完成
最終的調用結果返回之前,調用者不會被掛起

5種I/O模型:

同步阻塞:
進程發起調用後,第一階段數據從磁盤空間到內存空間的過程是阻塞的,進程會被掛起
第二階段,數據從內存空間進入進程內存空間時,也是阻塞的!整個過程一個進程只能響應一個請求

同步非阻塞:
進程發起調用後,第一階段數據從磁盤空間到內存空間的過程中進程不用阻塞,但確需要不斷向被調用者詢問
調用是否完成,第二階段數據從內核內存空間到進程空間內存的時候,進程依然會阻塞

I/O複用:
進程發起調用後,會利用select函數進行監控,此時select[epoll]系統調用會阻塞等待調用完成[磁盤---內核內存]
從而解放了進程,進程可以繼續響應別的用戶請求,
當第一節階段完成後,select調用結束,進程會最等待數據進入進程內存
Nginx因爲使用epoll這種系統調用做爲底層的實現方式,當第一階段進程發起系統調用後,會阻塞在epoll調用中
而進程可以去響應其它的用戶請求,當調用結束時,epoll會觸發信號通知進程返回來等待數據進入進程空間!此外
epoll支持的併發訪問基本不受限制,所以Nginx可以支持更好的併發

事件驅動:
進程發起調用後,第一階段數據從磁盤空間到內存空間的過程中進程不用阻塞,當數進入內核內存空間時,
內核會觸發一個信號通知進程回來等待數據進入進程空間!

異步非阻塞--異步I/O:
進程發起調用後,兩個階段都不需要阻塞,直接是在第二個階段完成後,內核直接通知用戶線程可以進行後續操作了

Nginx特性簡介:

特性:
模塊化設計,較好的擴展性
高可靠性
支持熱部署:不停機更新配置文件,升級版本,更換日誌文件
低內存消耗:10000個keep-alive連接模式下的非活動連接,僅需2.5M內存
event-driven[事件驅動],aio[異步I/O],mmap[內存映射],sendfile 

基本功能:
靜態資源的web服務器
http協議反向代理服務器
pop3/imap4協議反向代理服務器
FastCGI(LNMP),uWSGI(python)等協議
模塊化(非DSO)-如zip,SSL模

報文響應碼:

     1XX:信息性狀態碼()
      100:請求繼續 101:轉換協議
     2XX:成功狀態碼
      200:OK 請求沒問題,資源存在!201:服務器接收並且保存

     3XX:重定向狀態碼
       301:永久重定向,在響應報文中使用首部“localtion:URL值”,指定資源現在所處的位置
       302:臨時重定向在響應報文中使用首部“localtion:URL值”指定臨時資源位置
       304:沒修改這個資源可以使用緩存,條件式請求中使用
     4XX:客戶端錯誤
       401:認證
       403:拒絕訪問,請求被服務器拒絕
       404:NOT Found,服務器無法找到請求的URL
       405:不允許使用此方法請求相應的URL

     5XX:服務器類的錯誤
       500:服務器內部錯誤:
       502:代理服務器從上游收到了一條僞相應
       503:服務器此時無法提供服務,但將來可能可可用

Nginx安裝:

epel源中有Nginx安裝包

Nginx啓動方式:
方式1:
Nginx:默認爲啓動nginx  
-h 查看幫助選項  
-V 查看版本和配置選項  
-t 測試nginx語法錯誤
-T 檢測nginx語法並輸出配置文件信息
-q 檢測過程中只顯示錯誤信息  
-c filename 指定配置文件(default: /etc/nginx/nginx.conf)  
-s signal 發送信號給master進程,
signal:stop, quit, reopen, reload
示例: nginx -s stop  停止nginx
nginx -s reload  加載配置文件  
-g directives 在命令行中指明全局指令 

使用nginx啓動後,不支持systemctl控制

方式2:
centos7 --->systemctl start nginx
centos6 --->service nginx start

主配置文件介紹:

主配置文件:
/etc/nginx/nginx.conf

簡要說明:
1 所有配置要以";"結尾
2 支持使用配置變量  
內建變量:由Nginx模塊引入,可直接引用  
自定義變量:由用戶使用set命令定義         
set variable_name value;  
引用變量:$variable_name

主配置文件分塊:
main block {
    主配置段
}

http {
    http塊
}

mail {
    郵件模塊
}

stream {
    stream模塊
}

Nginx編譯安裝:

創建用戶和組:
groupadd -r nginx
useradd -r -g nginx -s /sbin/nologin nginx

準備開發環境:
    首先配置yum源然後安裝:
        yum groupinstall Development tools
        yum groupinstall "Server Platform Development"
        yum install pcre-devel
        yum install openssl-devel
        yum install zlib[devel]

準備nginx源碼包組,解壓及編譯:
    tar xf nginx-1.14.0.tar.gz
    cd nginx-1.14.0
./configure --prefix=/usr/local/nginx --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/nginx.pid --lock-path=/var/lock/nginx.lock --user=nginx --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=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy/ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre

make && make install 

創建目錄:
mkdir /var/tmp/nginx
根據你自己指定的文件存放目錄來創建!

準備語法高亮:
1 再家目錄下創建 mkdir .vim/syntax
2 再網上或者官網上找一個 nginx.vim文件,放在這個目錄中
3 然後cd到父目錄中,創建一個  filetype.vim文件
au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' |  setfiletype nginx | endif 

4 配置nginx腳本文件,因爲文字太多這裏就不附送腳本文件內容
1 vim /etc/rc.d/init.d/nginx
把腳本文件複製進去
2 chmod +x nginx
3 chkconfig --add nginx
4 service nginx start

啓動Nginx並測試使用!

編譯選項解析:
--prefix=/etc/nginx 安裝路徑
--sbin-path=/usr/sbin/nginx 指明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 指明pid文件安裝位置
--lock-path=/var/run/nginx.lock 鎖文件安裝位置
--http-client-body-temp-path=/var/cache/nginx/client_temp
客戶端body部分的臨時文件存放路徑,服務器允許客戶端使用put方法提交大數據時
臨時存放的磁盤路徑
--http-proxy-temp-path=/var/cache/nginx/proxy_temp 作爲代理服務器,服務器響應報文的臨時文件存放路徑 
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 作爲fastcgi代理服務器,服務器響應報文的臨時文件存放路徑 
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 作爲uwsgi代理服務器,服務器響應報文的臨時文件存放路徑 
--http-scgi-temp-path=/var/cache/nginx/scgi_temp 作爲scgi反代服務器,服務 器響應報文的臨時文件存放路徑 
--user=nginx 指明以那個身份運行worker進程,主控master進程一般由root運行 
--group=nginx 
--with-http_ssl_module 表示把指定模塊編譯進
--with-http_v2_module --支持http2.0版本
--with-file-aio --異步ai
--with-threads  ---支持線程
--with-http_dav_module 
--withhttp_stub_status_module

編譯時如何更改nginx名稱和版本:
1 更改版本和名稱:
編輯源碼包目錄下:
nginx-1.14.0/src/core/nginx.h
更改版本:
#define NGINX_VERSION      "10.6.10"
更改nginx名稱:
#define NGINX_VER          "test/" NGINX_VERSION

2 設置不在相應報文中顯示真正的server
編輯源碼包目錄下:
/nginx-1.14.0/src/http/ngx_http_header_filter_module.c 
更改項:
 static u_char ngx_http_server_string[] = "Server: testnginx" CRLF; 

 編譯成功後測試訪問:
 [root@apache122:26:02yum.repos.d]#curl -I 192.168.23.48
HTTP/1.1 200 OK
Server: test/10.6.10 -->server已經自定義
Date: Sat, 10 Nov 2018 14:55:48 GMT
Content-Type: text/html
Content-Length: 20
Last-Modified: Sat, 10 Nov 2018 14:55:24 GMT
Connection: keep-alive
ETag: "5be6f15c-14"
Accept-Ranges: bytes

使用隱藏server:
server_tokens off; 
測試結果:
[root@apache122:55:48yum.repos.d]#curl -I 192.168.23.48
HTTP/1.1 200 OK
Server: testnginx --->已經改變成自定義
Date: Sat, 10 Nov 2018 14:58:11 GMT
Content-Type: text/html
Content-Length: 20
Last-Modified: Sat, 10 Nov 2018 14:55:24 GMT
Connection: keep-alive
ETag: "5be6f15c-14"
Accept-Ranges: bytes

具體配置項介紹:

主語句塊配置:
Main 全局配置段常見的配置指令分類
正常運行必備的配置
優化性能相關的配置
用於調試及定位問題相關的配置
事件驅動相關的配置

相關配置:
1 user [username groupname]:以哪個用戶的身份運行
2 pid /path/to/pidfile_name:指定nginx的pid文件
注意:
1 進程結束pid文件自動刪除
2 所在路徑應該對所有者開放寫權限
3 include file | mask  
指明包含進來的其它配置文件片斷
4 load_module file:模塊加載
模塊加載配置文件:/usr/share/nginx/modules/*.conf  
指明要裝載的動態模塊路徑: /usr/lib64/nginx/modules
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章