NGINX服務1

I/O模型 ?Nginx介紹 ?Nginx安裝 ?Nginx各種模塊

kI/O模型

1? .同步/異步:關注的是消息通信機制 (既被調用用者是否返回消息)?

同步:synchronous,調用者等待被調用者返回消息,才能繼續執行 (被調用者完成任務也不通知調用者,調用者需要時刻檢查被調用者是否完成任務,浪費資源)?

異步:asynchronous,被調用者通過狀態、通知或回調機制主動通知調用者 被調用者的運行狀態 (被調用者完成任務后主動發消息通知調用者以完成任務,調用者只需發送指令即可無需時刻去詢問被調用者是否完成任務了,節省資源的浪費)?

2? . 阻塞/非阻塞:關注調用者在等待結果返回之前所處的狀態 ?

阻塞:blocking,指IO操作需要徹底完成后才返回到用戶空間,調用結果返回 之前,調用者被掛起 ?(被調用者未完成任務時,調用者阻塞其他任務。直到等到被調用者完成任務后自己才取消阻塞去干別的事去)

非阻塞:nonblocking,指IO操作被調用后立即返回給用戶一個狀態值,無需 等到IO操作徹底完成,最終的調用結果返回之前,調用者不會被掛起 。(被調用者未完成任務時,調用者也不會阻塞其他任務,可以去做其他事,等待被調用者完成任務時在去處理)

I/O模型: 阻塞型、非阻塞型、復用型、信號驅動型、異步

下圖中的nginx為調用者內核為被調用者:

新建位圖圖像

1 . 同步阻塞IO模型

同步阻塞IO模型是最簡單的IO模型,被調用者完成任務后也不會發送消息通知調用者已完成任務;調用者的其他任務被阻塞,無法去做其他的任務只能每隔一段時間去查看被調用者是否完成任務,如果完成才可以進行后續任務的調用。對CPU的資源利用率不夠 ,浪費資源。

2 . 同步非阻塞IO模型 :

被調用者完成任務后也不會發送消息通知調用者已完成任務;但調用者不阻塞其他任務,此時也可以執行其他任務的調用,但由于被調用者不會發送消息告知調用者已完成任務,所以需要調用者需要不斷的重復的發起詢問被調用者是否已完成任務,也是浪費cpu的資源。

整個IO請求的過程中,雖然用戶線程每次發起IO請求后可以立即返回,但是為 了等到數據,仍需要不斷地輪詢、重復請求,消耗了大量的CPU的資源

3 . IO多路復用模型(同步多路阻塞的I/O模型;可以并發的響應多個請求)(常用的類型)

多個連接共用一個等待機制,本模型會阻塞進程,但是進程是阻塞在select或者poll這兩 個系統調用上,而不是阻塞在調用者上面。(多個系統調用者。找個代理人去和被調用者內核去打交道;只是一次 可以執行多個任務)

用戶首先將需要進行IO操作(調用者)添加到select中,繼續執行做其他的工作(異步),同時等 待select系統調用返回。當數據到達時,IO被激活,select函數返回。用戶線程正式發起 read請求,讀取數據并繼續執行。

從流程上來看,使用select函數進行IO請求和同步阻塞模型沒有太大的區別,甚至還多 了添加監視IO,以及調用select函數的額外操作,效率更差。并且阻塞了兩次,但是第 一次阻塞在select上時,select可以監控多個IO上是否已有IO操作準備就緒,即可達到在 同一個線程內同時處理多個IO請求的目的。而不像阻塞IO那種,一次只能監控一個IO

雖然上述方式允許單線程內處理多個IO請求,但是每個IO請求的過程還是阻塞的(在 select函數上阻塞),平均時間甚至比同步阻塞IO模型還要長。如果用戶線程只是注冊 自己需要的IO請求,然后去做自己的事情,等到數據到來時再進行處理,則可以提高 CPU的利用率 ?

IO多路復用是最常使用的IO模型,但是其異步程度還不夠“徹底”,因為它使用了會阻 塞線程的select系統調用。因此IO多路復用只能稱為異步阻塞IO模型,而非真正的異步 IO

多路I/O復用的應用場景

IO多路復用是指內核一旦發現進程指定的一個或者多個IO條件準備讀取,就通知該進程

IO多路復用適用如下場合: ?

當客戶端處理多個描述符時(一般是交互式輸入和網絡套接口),必須使用I/O復用 ?

當一個客戶端同時處理多個套接字時,此情況可能的但很少出現 ?

當一個TCP服務器既要處理監聽套接口,又要處理已連接套接口,一般也要用到I/O 復用 (常用的場景)

當一個服務器即要處理TCP,又要處理UDP,一般要使用I/O復用 ?

當一個服務器要處理多個服務或多個協議,一般要使用I/O復用

4? .信號驅動IO模型(半阻塞狀態)

用戶進程可以通過sigaction系統調用注冊一個信號處理程序,然后主程序可以 繼續向下執行,當有IO操作準備就緒時,由內核通知觸發一個SIGIO信號處理程 序執行,然后將用戶進程所需要的數據從內核空間拷貝到用戶空間 ?

此模型的優勢在于等待數據報到達期間進程不被阻塞。用戶主程序可以繼續執 行,只要等待來自信號處理函數的通知 ?

該模型并不常用

5 . 異步IO模型

異步IO與信號驅動IO最主要的區別是信號驅動IO是由內核通知何時可以進行IO 操作,而異步IO則是由內核告訴我們IO操作何時完成了。具體來說就是,信號 驅動IO當內核通知觸發信號處理程序時,信號處理程序還需要阻塞在從內核空 間緩沖區拷貝數據到用戶空間緩沖區這個階段,而異步IO直接是在第二個階段 完成后內核直接通知可以進行后續操作了 ?

相比于IO多路復用模型,異步IO并不十分常用,不少高性能并發服務程序使用 IO多路復用模型+多線程任務處理的架構基本可以滿足需求。況且目前操作系統 對異步IO的支持并非特別完善,更多的是采用IO多路復用模型模擬異步IO的方 式(IO事件觸發時不直接通知用戶線程,而是將數據讀寫完畢后放到用戶指定 的緩沖區中)

 

I/O模型的具體實現

主要實現方式有以下幾種;

Select:Linux實現對應,I/O復用模型,BSD4.2最早實現 ?(apache上使用的模型)

Poll:Linux實現,對應I/O復用模型,System V unix最早實現 ?

Epoll:Linux實現,對應I/O復用模型,具有信號驅動I/O模型的某些特性 ?(nginx上使用的模型)

Kqueue:FreeBSD實現,對應I/O復用模型,具有信號驅動I/O模型某些特性 ?

/dev/poll:SUN的Solaris實現,對應I/O復用模型,具有信號驅動I/O模型的 某些特性 ?

Iocp Windows實現,對應第5種(異步I/O)模型

select/poll/epoll三者的相互比較:
捕獲

1 .? Select:POSIX所規定,目前幾乎在所有的平臺上支持,其良好跨平臺支持也是 它的一個優點,本質上是通過設置或者檢查存放fd標志位的數據結構來進行下 一步處理 ?

缺點:?

單個進程可監視的fd數量被限制,即能監聽端口的數量有限

cat /proc/sys/fs/file-max ?

對socket是線性掃描,即采用輪詢的方法,效率較低 ?

select 采取了內存拷貝方法來實現內核將 FD 消息通知給用戶空間,這樣一 個用來存放大量fd的數據結構,這樣會使得用戶空間和內核空間在傳遞該結 構時復制開銷大

2 . ?poll?

本質上和select沒有區別,它將用戶傳入的數組拷貝到內核空間,然后查詢 每個fd對應的設備狀態 ?

其沒有最大連接數的限制,原因是它是基于鏈表來存儲的 ?

大量的fd的數組被整體復制于用戶態和內核地址空間之間,而不管這樣的復 制是不是有意義 ?

poll特點是“水平觸發”,如果報告了fd后,沒有被處理,那么下次poll時 會再次報告該fd ?

邊緣觸發:只通知一次

3 . ? epoll::在Linux 2.6內核中提出的select和poll的增強版本

支持水平觸發LT和邊緣觸發ET,最大的特點在于邊緣觸發,它只告訴進程哪些fd剛 剛變為就需態,并且只會通知一次 ?

使用“事件”的就緒通知方式,通過epoll_ctl注冊fd,一旦該fd就緒,內核就會采 用類似callback的回調機制來激活該fd,epoll_wait便可以收到通知 ?

優點: ?

沒有最大并發連接的限制:能打開的FD的上限遠大于1024(1G的內存能監聽約10萬 個端口) ?

效率提升:非輪詢的方式,不會隨著FD數目的增加而效率下降;只有活躍可用的FD 才會調用callback函數,即epoll最大的優點就在于它只管理“活躍”的連接,而跟 連接總數無關 ?

內存拷貝,利用mmap(Memory Mapping內存映射)加速與內核空間的消息傳遞;即epoll 使用mmap減少復制開銷: 將磁盤里的數據映射到內存的空間上。

 

Nginx介紹

官網:http://nginx.org

特性:

模塊化設計,較好的擴展性 ?

高可靠性 ?

支持熱部署:不停機更新配置文件,升級版本,更換日志文件 ?

低內存消耗:10000個keep-alive連接模式下的非活動連接,僅需2.5M內存 ?

event-driven,aio,mmap,sendfile ?

基本功能: ?

靜態資源的web服務器 (只是靜態的,要想運行動態的php程序需要安裝對應的php的FastCGI協議)

http協議反向代理服務器 ?

pop3/imap4協議反向代理服務器 ?

FastCGI(LNMP),uWSGI(python)等協議 ?

模塊化(非DSO),如zip,SSL模塊

nginx的程序架構 (沒有線程,一個master帶多個worker)

nginx的程序架構:

master/worker結構 ?

一個master進程:

負載加載和分析配置文件、管理worker進程、平滑升級 ?

一個或多個worker進程 (work進程開啟的數量時根據服務器的內核數量開啟,默認是有個內核就會開啟相應個數的work進程數,但在配置文件里可以調整的)

處理并響應用戶請求 ?

緩存相關的進程:

cache loader:載入緩存對象

cache manager:管理緩存對象

nginx的模塊

模塊分類:

1 . 核心模塊:core module ?

2? .標準模塊:

HTTP 模塊: ngx_http_*

HTTP Core modules 默認功能

HTTP Optional modules 需編譯時指定 ?

Mail 模塊 ngx_mail_* ? ? (郵件模塊)

Stream 模塊 ngx_stream_*

3? . 第三方模塊

 

nginx的安裝:

yum install nginx

也可到官網上配的yum倉庫來安裝最新版的

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/x86_64/
gpgcheck=0
enabled=1

還可以編譯安裝:

nginx的啟動:(兩種方法啟停服務不能混用)

systemctl start nginx

systemctl stop nginx

還可以不使用systemctl開啟服務:

nginx? (開啟服務)

nginx? -s? stop? (停止服務)

nginx -t ?? (檢查配置文件的語法錯誤)

nginx命令的選項:

-h 查看幫助選項

-V 查看版本和配置選項

-t 測試nginx語法錯誤

-c filename 指定配置文件(default: /etc/nginx/nginx.conf)

-s signal 發送信號給master進程,signal可為:stop, quit, reopen, reload

示例: -s stop 停止nginx服務 ? ? ? -s reload 加載配置文件當修改配置文件時只需要重新加載以下就可以了

-g directives 在命令行中指明全局指令

 

 

nginx配置和性能的優化:

幫助文檔:http://nginx.org/en/docs/ngx_core_module.html
主配置文件:nginx.conf
子配置文件 include conf.d/*.conf (需要自己新建)

默認主頁面路徑:/usr/share/nginx/html
日志存放路徑:/var/log/nginx/{access.log,error.log} (訪問日志和錯誤日志)
注意:
(1) 指令必須以分號結尾
(2) 支持使用配置變量

nginx的主配置文件里的全局配置:

1 ? .worker_processes auto;? (控制開啟的worker數,系統默認是自動的根據內核的個數來開啟相應個數的work數,可以修改此條命令來設置)

2、pid /PATH/TO/PID_FILE 指定存儲nginx主進程PID的文件路徑 (此文件為nginx運行時生成的臨時文件;作用:當執行nginx -s stop命令時會找到此文件里存放的進程編號然后調用kill命令將其終止)

3、include file | mask 指明包含進來的其它配置文件片斷

4、load_module file 模塊加載配置文件:/usr/share/nginx/modules/*.conf 指明要裝載的動態模塊路徑: /usr/lib64/nginx/modules

QQ截圖20180705143741

性能優化相關的配置:

1、worker_processes 進程的數量;通常應該為當前主機的cpu的物理核心數 。

?2、worker_cpu_affinity 0010 0100 ?? (此處的二進制數為具體啟用的那顆cpu的編號,0010是2號CPU;0100為3號CPU;此條命令是自己添加到配置文件的全局配置里的如上圖)

3、worker_priority 10 指定worker進程的nice值,設定worker進程優先級:[-20,20]? (此條命令也是添加到全局配置中的 默認的優先級為0)

4、worker_rlimit_nofile 30000 ?? worker進程所能夠打開的文件數量上限. ( 是所有worker打開文件數的總和并不是指的是單個worker所打開文件數 。統默認是沒有設置的 ? 。此條命令也是添加到全局配置中的)

事件驅動相關的配置: event

1、worker_connections 15000 每個worker進程所能夠打開的最大并發連接數數量 .(指單個worker進程所能接收的并發連接數,和上面的總數相對應就可以了)

2、use method 指明并發連接請求的處理方法 ,默認自動選擇最優方法 use epoll; ?

3、accept_mutex on | off 互斥 處理新的連接請求的方法;on指由各個worker輪流處理新請求,Off指每個新請 求的到達都會通知(喚醒)所有的worker進程,但只有一個進程可獲得連接,造成“驚 群”,影響性能 (默認為on的)

QQ截圖20180705150503

 

調試和定位問題

1、daemon on|off 是否以守護進程方式運行nignx,默認是守護進程方式 (所謂的守護進程就是前臺執行還是后臺執行;此命令必須放到全局配置的語句塊里;默認是on的在后臺執行的;)

daemon off ; ? (在前臺執行,多用于測試中按ctrl+c就可以關閉nginx服務了)

2、master_process on|off 是否以master/worker模型運行nginx;默認為on; 如果設為off 將不啟動worker

3、error_log file [level] 錯誤日志文件及其級別;出于調試需要,可設定為debug;但debug僅在編譯時 使用了“–with-debug”選項時才有效

QQ截圖20180705151427

 

?http協議的相關配置:

QQ截圖20180705151718

由于在此修改會造成主配置文件的混亂;http服務的設置可以在自定義的配置文件里:/etc/nginx/conf.d/*.conf? 里就行了。

 

 

配置一個虛擬主機? (基于主機頭hostname)

QQ截圖20180705153129

vim /etc/nginx/conf.d/test1.conf ? (自建的配置文件,參照上述模式來配置搭建三個虛擬主機的各自的配置文件)

server {
listen 80;
server_name www.a.com;
root /data/test1;
}

vim /etc/nginx/conf.d/test2.conf

server {
listen 8080;
server_name www.b.com;
root /data/test2;
}

vim /etc/nginx/conf.d/test3.conf
server {
listen 80;
server_name www.c.com;
root /data/test3;
}

建立三個主機各自的主頁面文件:

echo hello1 >/data/test1/index.html

echo hello2>/data/test2/index.html

echo hello3 >/data/test3/index.html

啟動nginx服務:

在另一臺主機上訪問:由于涉及到dns解析的問題可以臨時在客戶端將下面命令寫到里面:

192.168.60.4(此為nginx服務器的IP地址) www.a.com? www.b.com ? www.c.com

此時訪問curl? www.a.com

如果訪問主機的IP會顯示什么:curl? 192.168.60.4? 此時會出現默認的本機的nginx服務的默認路徑:因為前面主配置文件里寫了:listen 80;default_server (為默認)如果取消此設置在訪問則會按照配置文件的先后順序來訪問的。

default_server 設定為默認虛擬主機

ssl 限制僅能夠通過ssl連接提供服務

backlog=number 超過并發連接數后,新請求進入后援隊列的長度 (既訪問數到達上限后,設置一個排隊的數目,在后面排隊)

rcvbuf=size 接收緩沖區大小

sndbuf=size 發送緩沖區大小

也可以實現基于以下方式來創建虛擬機

基于port; listen PORT; 指令監聽在不同的端口

基于ip的虛擬主機 listen IP:PORT; IP 地址不同

3、server_name

虛擬主機的主機名稱后可跟多個由空白字符分隔的字符串

支持*通配任意長度的任意字符 server_name *.magedu.com www.magedu.*

支持~起始的字符做正則表達式模式匹配,性能原因慎用 server_name ~^www\d+\.magedu\.com$

匹配優先級機制從高到低:

(1) 首先是字符串精確匹配 如:www.magedu.com

(2) 左側*通配符 如:*.magedu.com

(3) 右側*通配符 如:www.magedu.*

(4) 正則表達式 如: ~^.*\.magedu\.com$

(5) default_server

4、tcp_nodelay on | off;

在keepalived模式下的連接是否啟用TCP_NODELAY選項

當為off時,延遲發送,合并多個請求后一起發送 請求

默認On時,不延遲發送

可用于:http, server, location ?(在此語句塊里添加)

5、sendfile on | off;

是否啟用sendfile功能,在內核中封裝報文直接發送

默認Off ?

6、server_tokens on | off | build | string

是否在響應報文的Server首部顯示nginx版本 (默認是啟用的)

server_tokens off ?? (此設置在主配置文件的http的語句塊里添加)

7、root 定義路徑相關的配置

設置web資源的路徑映射;用于指明請求的URL所對應的文檔的目錄路徑,可 用于http, server, location, if in location

示例:

定義路徑:root ? ? ? ?? /data/www/vhost1;

http://www.magedu.com/images/logo.jpg (訪問時輸入的路徑)

–> /data/www/vhosts/images/logo.jpg ?? (真實文件存放的路徑)

本質:當訪問//www.magedu.com/時真實的路徑就是/data/www/vhost1;

8、location

在一個server中location配置段可存在多個,用于實現從uri到文件系統的路 徑映射;ngnix會根據用戶請求的URI來檢查定義的所有location,并找出一個最 佳匹配,而后應用其配置 ?

示例:

server {…

server_name www.magedu.com;

root ? ? /data/www/

location ? ?? /images/ {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? root ? ? ? /app/test/;

}

}

當訪問? http://www.magedu.com/images/

? ? ? ? ? ? ? ? ? ? ? –> /app/test/images/ ? ? ??

但當訪問http://www.magedu.com/時不添加子路徑時又會訪問/data/www/下的文件

location /images/ {
? ? ? ? ? ? ? ? root /app/test/; ? (此種做法相當于重新指定了images子路徑的真實文件存放的路徑;當用戶去訪問www. magedu.com/images時images目錄下的真實問價被指定到了/app/test/; 里面)

使用此種方法可以將多個url的子路徑指向不同的路徑下:

www.magedu.com/test1——->/data/test1/

www.magedu.com/news1——->/app/news1/

www.magedu.com/hello1——->/root/hello1/

總結:如果將location? / 定義為根的話當訪問www.magedu.com/時會和系統默認的路徑沖突;此時location的優先級比系統默認的根的優先級要高。

9、alias path; 路徑別名,文檔映射的另一種機制;僅能用于location上下文

location /bbs/ {

alias /web/forum/;

當訪問www.magedu.com/bbs/時其真實訪問的路徑應該是 /web/forum/下的文件

10、index file …; 指定默認網頁文件,注意:ngx_http_index_module模塊

11、error_page (報錯界面)

模塊:ngx_http_core_module

可用位置:http, server, location, if in location

自定義錯誤界面:

server{

error_page? 404 ? /404.html;

location ??/404.html {

root ?? /data/error/; ?? (錯誤界面定義的路徑)

}

}

然后再/data/error/新建一個404的界面

vim? 404.html? (新建的錯誤界面的文件名必須以此為文件名成,因為location /404.html已經定義了錯誤界面的名稱)

<h1>error</h1>

error_page 404 =200 /404.html ? (將錯誤的404信息等于200的正確信息不會被瀏覽器劫持,看到的響應碼為200,不是404了,但看到的還是自定義的錯誤界面)如下圖所示:

QQ截圖20180705193111

12、try_files file … uri;

按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示 為文件夾),如果所有的文件或文件夾都找不到,會進行一個內部重定向到最 后一個參數。只有最后一個參數可以引起一個內部重定向,之前的參數只設置 內部URI的指向。最后一個參數是回退URI且必須存在,否則會出現內部500錯 誤

 

定義客戶端請求的相關配置

13、keepalive_timeout timeout [header_timeout];? (長連接;一般情況下為了更多的用戶訪問可以考慮將長連接關上或者時間設置較短)

設定保持連接超時時長,0表示禁止長連接,默認為75s (如果是游戲業務則需要持續連接)

keepalive_timeout? 0

14、keepalive_requests number; ?? 然后就斷開連接

在一次長連接上所允許請求的資源的最大數量, 默認為100 ?

15、keepalive_disable none | browser …

對哪種瀏覽器禁用長連接

16、send_timeout time; ? (超過規定時間就斷開連接)

向客戶端發送響應報文的超時時長,此處是指兩次寫操作之間的間隔時長, 而非整個響應過程的傳輸時長

17、client_body_buffer_size size;

用于接收每個客戶端請求報文的body部分的緩沖區大??;默認為16k;超 出此大小時,其將被暫存到磁盤上的由下面client_body_temp_path指令所定義 的位置 ?

18、client_body_temp_path path [level1 [level2 [level3]]];

設定存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量

目錄名為16進制的數字; (對文件進行哈希值計算)

client_body_temp_path /var/tmp/client_body 1 2 2? (取 哈希值的第一個第2,3個第4,5個創建文件夾)

1 1級目錄占1位16進制,即2^4=16個目錄 0-f

2 2級目錄占2位16進制,即2^8=256個目錄 00-ff

2 3級目錄占2位16進制,即2^8=256個目錄 00-ff

 

對客戶端進行限制的相關配置

19、limit_rate rate;

限制響應給客戶端的傳輸速率,單位是bytes/second 默認值0表示無限制

limit_rate 1048576(為1M的下載速度)是以字節為單位的

20、limit_except method … { … },僅用于location

限制客戶端使用除了指定的請求方法之外的其它方法

method:GET, HEAD, POST, PUT, DELETE , MKCOL, COPY, MOVE, OPTIONS, PROPFIND, PROPPATCH, LOCK, UNLOCK, PATCH

location

limit_except

GET {

allow 192.168.1.0/24;

deny all;

此代碼用在location里面

除了GET和HEAD 之外其它方法僅允許192.168.1.0/24網段主機使用

GET包含HEAD(看頭部信息的)

 

文件操作優化的配置

21、aio on | off | threads[=pool];

是否啟用aio功能 (系統默認是off的)

22、directio size | off;

directio 4m

當文件大于等于給定大小時,例如directio 4m,同步(直接)寫磁盤,而非寫緩存

directio off ?? (立即寫磁盤而不寫入緩存里)

23、open_file_cache off;

open_file_cache max=N [inactive=time];

nginx可以緩存以下三種信息:

(1) 文件元數據:文件的描述符、文件大小和最近一次的修改時間

(2) 打開的目錄結構

(3) 沒有找到的或者沒有權限訪問的文件的相關信息

max=N:可緩存的緩存項上限;達到上限后會使用LRU算法實現管理(LRU算法:用的最少的淘汰算法)

inactive=time:緩存項的時間,如果超過此時間還沒有人訪問此緩存項就將其刪除。

open_file_cache_min_uses指令所指定的次數的緩存項即為非活動項,將被刪除

24、open_file_cache_errors on | off;

是否緩存查找時發生錯誤的文件一類的信息 默認值為off ?

25、open_file_cache_min_uses number;

open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定 的次數方可被歸類為活動項

默認值為1 ?

26、open_file_cache_valid time;

緩存項有效性的檢查頻率 默認值為60s

 

ngx_http_access_module? (允許和拒絕訪問的列表)

默認站點搭建起來是不限制用戶的訪問的

規則:自上而下檢查,一旦匹配,將生效,所以要將條件嚴格的置前

location / {

deny 192.168.1.1;? (拒絕此IP的訪問)

allow 192.168.1.0/24; ? (允許此網段的訪問)

allow 10.1.1.0/16; ? ? ? ? ? ?? (允許此網段的訪問)

allow 2001:0db8::/32; ?? (支持IPV6地址段)

deny all; ? ? ? ?? (拒絕所有的訪問,即使自己訪問自己也被拒絕)

}

ngx_http_auth_basic_module (實現用戶加密碼訪問)

cd ? /etc/nginx/conf.d/

htpasswd -cm nginxuser httpuer1(nginxuser:存放用戶名及密碼的文件;httpuer1:為創建的用戶名)

(使用htppasswd命令需要安裝httpd-tools包)

htpasswd -cm nginxuser httpuer2 ? (創建第二個用戶賬號及密碼)

將生成的文件告訴配置文件路徑:

 

此語句需要寫在server{}語句塊下。

QQ截圖20180705210729

 

ngx_http_stub_status_module (可以檢查服務器的運行狀態)

用于輸出nginx的基本狀態信息

要啟用的話需要將以下代碼寫進去:

location /status {

stub_status;

allow 172.16.0.0/16; ?? (允許那些主機可以看到本機的nginx的狀態信息)

deny all; ? ? ? ? ? ? ? ? (剩余的全部都拒絕)

}

在客戶端訪問:http://192.168.60.66/status/ ? (就可以查看到訪問的狀態信息)

server accepts handled requests

1? 1? 1 ? ? ? ? ? ? ? ? ?? (訪問之后可以發現如上的描述:為服務器的接收了幾個;處理了幾個;請求的有幾個)

accepts:統計總值,已經接受的客戶端請求的總數

handled:統計總值,已經處理完成的客戶端請求的總數

requests:統計總值,客戶端發來的總的請求數

Reading:當前狀態,正在讀取客戶端請求報文首部的連接的連接數

Writing:當前狀態,正在向客戶端發送響應報文過程中的連接數

Waiting:當前狀態,正在等待客戶端發出請求的空閑連接數

 

ngx_http_log_module? (日志模塊)

在主配置文件下的http語句塊下寫:

access_log off; ? (關掉日志記錄默認是開啟的)

QQ截圖20180707092853

上圖中的時間格式可以更改為[$time_iso8601](此模式下月份也會顯示成數字而不是英文字母了)

上述定義的變量可以在官網上的變量上查詢具體的使用方法及參數。

對每個虛擬主機配置日志格式:(日志文件會自動生成的)

QQ截圖20180707093656

 

 

 

 

ngx_http_gzip_module (壓縮文件模塊)

1、gzip on | off;

啟用或禁用gzip壓縮 ?

2、gzip_comp_level level;

壓縮比由低到高:1 到 9 默認:1 ?

3、gzip_disable regex …;

匹配到客戶端瀏覽器不執行壓縮 ?

4、gzip_min_length length;

啟用壓縮功能的響應報文大小閾值

5、gzip_http_version 1.0 | 1.1;

設定啟用壓縮功能時,協議的最小版本 默認:1.1 ?

6、gzip_buffers number size;

支持實現壓縮功能時緩沖區數量及每個緩存區的大小 默認:32 4k 或 16 8k ?

7、gzip_types mime-type …;

指明僅對哪些類型的資源執行壓縮操作;即壓縮過濾器 默認包含有text/html,不用顯示指定,否則出錯

8、gzip_vary on | off;

如果啟用壓縮,是否在響應報文首部插入“Vary: Accept-Encoding”

 

ngx_http_ssl_module ?? (實現https的訪問數據加密 ?? )

1、ssl on | off; 為指定虛擬機啟用HTTPS protocol, 建議用listen指令代替 (直接寫成這樣就可以了:listen 443 ssl; )

2、ssl_certificate file;

當前虛擬主機使用PEM格式的證書文件

3、ssl_certificate_key file;

當前虛擬主機上與其證書匹配的私鑰文件

4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2];

支持ssl協議版本,默 認為后三個 ?

5、ssl_session_cache off | none | [builtin[:size]] [shared:name:size];

none: 通知客戶端支持ssl session cache,但實際不支持

builtin[:size]:使用OpenSSL內建緩存,為每worker進程私有

[shared:name:size]: 在多個worker進程之間共享一個緩存。(用的時候起個名并指定大?。?/p>

6、ssl_session_timeout time;

客戶端連接可以復用ssl session cache中緩存的ssl參數的有效時長,默認5m (五分鐘)

具體實現步驟:

1 .cd /etc/pki/tls/certs/ (進入此文件夾下生成自簽名的證書文件)

make a.crt ? ? ? ? ? (輸入口令3編;開始自簽名了輸入;國家;?。皇?;公司;組織;)

QQ截圖20180707101929

openssl rsa -in a.key -out aa.key ? (將生成的私鑰文件解密生成新的文件aa.key)

cp aa.key a.crt /etc/nginx/conf.d/ ? ? (將剛生成的兩個文件復制到nginx目錄下)

mv aa.key a.key ? (改一下名稱為了好看)

填寫虛主機的配置文件:

QQ截圖20180707102853

最后開始啟動服務;會發現80和443端口應該開啟了。

curl -k https://www.a.com ? (-k 忽略證書檢查訪問)

https://192.168.60.4/? (在瀏覽器上也可以訪問了)

在實際工作中只需將申請下來的兩個證書文件放到指定的路徑下就可以了。

對多個虛擬主機的不同網站實現不同的https加密。只需要執行上述相同的步驟就可以了,在各自的配置文件里寫上自己的證書文件路徑就可以了。(在apache上是不可以實現兩個加密的虛擬主機兩個網站https)

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/102239

(0)
無所謂無所謂
上一篇 2018-07-04
下一篇 2018-07-05

相關推薦

欧美性久久久久