Nginx安裝及核心配置解析

安裝

使用yum進行安裝

yum install -y nginx

查看nginx的安裝位置

whereis nginx

image

啟動測試

 nginx

核心配置文件結構

讀取Nginx自帶的Nginx配置文件,我們將其中的注釋部分【學習一個技術點就是在Nginx的配置文件中可以使用#來注釋】刪除掉後,就剩下下面內容:

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

}
指令名	指令值;  #全局塊,主要設置Nginx服務器整體運行的配置指令

 #events塊,主要設置,Nginx服務器與用戶的網絡連接,這一部分對Nginx服務器的性能影響較大
events {	 
    指令名	指令值;
}
#http塊,是Nginx服務器配置中的重要部分,代理、緩存、日誌記錄、第三方模塊配置...             
http {		
    指令名	指令值;
    server { #server塊,是Nginx配置和虛擬主機相關的內容
        指令名	指令值;
        location / { 
        #location塊,基於Nginx服務器接收請求字符串與location後面的值進行匹配,對特定請求進行處理
            指令名	指令值;
        }
    }
	...
}

簡單小結下:

nginx.conf配置文件中默認有三大塊:全局塊、events塊、http塊

http塊中可以配置多個server塊,每個server塊又可以配置多個location塊。

全局塊

user指令

(1)user:用於配置運行Nginx服務器的worker進程的用戶和用戶組。

語法 user user [group]
默認值 nobody
位置 全局塊

該屬性也可以在編譯的時候指定,語法如下./configure --user=user --group=group,如果兩個地方都進行了設置,最終生效的是配置文件中的配置。

該指令的使用步驟:

(1)設置一個用戶信息”www”

user www;

image

(2) 創建一個用戶

useradd www

(3)修改user屬性

user www

(4)創建/root/html/index.html頁面,添加如下內容

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="//nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="//nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
<p><em>I am WWW</em></p>
</body>
</html>

(5)修改nginx.conf

location / {
	root   /root/html;
	index  index.html index.htm;
}

(5)測試啟動訪問

頁面會報403拒絕訪問的錯誤

(6)分析原因

因為當前用戶沒有訪問/root/html目錄的權限

(7)將文件創建到 /home/www/html/index.html,修改配置

location / {
	root   /home/www/html;
	index  index.html index.htm;
}

(8)再次測試啟動訪問

能正常訪問。

綜上所述,使用user指令可以指定啟動運行工作進程的用戶及用戶組,這樣對於系統的權限訪問控制的更加精細,也更加安全。

work process指令

master_process:用來指定是否開啟工作進程。

語法 master_process on|off;
默認值 master_process on;
位置 全局塊

worker_processes:用於配置Nginx生成工作進程的數量,這個是Nginx服務器實現並發處理服務的關鍵所在。理論上來說workder process的值越大,可以支持的並發處理量也越多,但事實上這個值的設定是需要受到來自服務器自身的限制,建議將該值和服務器CPU的內核數保存一致。

語法 worker_processes num/auto;
默認值 1
位置 全局塊

如果將worker_processes設置成2,則會看到如下內容:

image

其他指令

daemon:設定Nginx是否以守護進程的方式啟動。

守護式進程是linux後台執行的一種服務進程,特點是獨立於控制終端,不會隨着終端關閉而停止。

語法 daemon on|off;
默認值 daemon on;
位置 全局塊

pid:用來配置Nginx當前master進程的進程號ID存儲的文件路徑。

語法 pid file;
默認值 默認為:/usr/local/nginx/logs/nginx.pid
位置 全局塊

該屬性可以通過./configure --pid-path=PATH來指定

error_log:用來配置Nginx的錯誤日誌存放路徑

語法 error_log file [日誌級別];
默認值 error_log logs/error.log error;
位置 全局塊、http、server、location

該屬性可以通過./configure --error-log-path=PATH來指定

其中日誌級別的值有:debug|info|notice|warn|error|crit|alert|emerg,翻譯過來為試|信息|通知|警告|錯誤|臨界|警報|緊急,這塊建議大家設置的時候不要設置成info以下的等級,因為會帶來大量的磁盤I/O消耗,影響Nginx的性能。

(5)include:用來引入其他配置文件,使Nginx的配置更加靈活

語法 include file;
默認值
位置 any

events塊

(1)accept_mutex:用來設置Nginx網絡連接序列化

語法 accept_mutex on|off;
默認值 accept_mutex on;
位置 events

這個配置主要可以用來解決常說的”驚群”問題。大致意思是在某一個時刻,客戶端發來一個請求連接,Nginx後台是以多進程的工作模式,也就是說有多個worker進程會被同時喚醒,但是最終只會有一個進程可以獲取到連接,如果每次喚醒的進程數目太多,就會影響Nginx的整體性能。如果將上述值設置為on(開啟狀態),將會對多個Nginx進程接收連接進行序列號,一個個來喚醒接收,就防止了多個進程對連接的爭搶。

(2)multi_accept:用來設置是否允許同時接收多個網絡連接

語法 multi_accept on|off;
默認值 multi_accept off;
位置 events

如果multi_accept被禁止了,nginx一個工作進程只能同時接受一個新的連接。否則,一個工作進程可以同時接受所有的新連接

(3)worker_connections:用來配置單個worker進程最大的連接數

語法 worker_connections number;
默認值 worker_commections 512;
位置 events

這裡的連接數不僅僅包括和前端用戶建立的連接數,而是包括所有可能的連接數。另外,number值不能大於操作系統支持打開的最大文件句柄數量。

(4)use:用來設置Nginx服務器選擇哪種事件驅動來處理網絡消息。

語法 use method;
默認值 根據操作系統定
位置 events

注意:此處所選擇事件處理模型是Nginx優化部分的一個重要內容,method的可選值有select/poll/epoll/kqueue等,之前在準備centos環境的時候,我們強調過要使用linux內核在2.6以上,就是為了能使用epoll函數來優化Nginx。

另外這些值的選擇,我們也可以在編譯的時候使用

--with-select_module--without-select_module

--with-poll_module --without-poll_module來設置是否需要將對應的事件驅動模塊編譯到Nginx的內核。

events指令配置實例

打開Nginx的配置文件 nginx.conf,添加如下配置

events{
	accept_mutex on;
	multi_accept on;
	worker_commections 1024;
	use epoll;
}

啟動測試

./nginx -t
./nginx -s reload

http塊

定義MIME-Type

我們都知道瀏覽器中可以顯示的內容有HTML、XML、GIF等種類繁多的文件、媒體等資源,瀏覽器為了區分這些資源,就需要使用MIME Type。所以說MIME Type是網絡資源的媒體類型。Nginx作為web服務器,也需要能夠識別前端請求的資源類型。

在Nginx的配置文件中,默認有兩行配置

include mime.types;
default_type application/octet-stream;

(1)default_type:用來配置Nginx響應前端請求默認的MIME類型。

語法 default_type mime-type;
默認值 default_type text/plain;
位置 http、server、location

在default_type之前還有一句include mime.types,include之前我們已經介紹過,相當於把mime.types文件中MIMT類型與相關類型文件的文件後綴名的對應關係加入到當前的配置文件中。

舉例來說明:

有些時候請求某些接口的時候需要返回指定的文本字符串或者json字符串,如果邏輯非常簡單或者乾脆是固定的字符串,那麼可以使用nginx快速實現,這樣就不用編寫程序響應請求了,可以減少服務器資源佔用並且響應性能非常快。

如何實現:

location /get_text {
	#這裡也可以設置成text/plain
    default_type text/html;
    return 200 "This is nginx's text";
}
location /get_json{
    default_type application/json;
    return 200 '{"name":"TOM","age":18}';
}

自定義服務日誌

Nginx中日誌的類型分access.log、error.log。

access.log:用來記錄用戶所有的訪問請求。

error.log:記錄nginx本身運行時的錯誤信息,不會記錄用戶的訪問請求。

Nginx服務器支持對服務日誌的格式、大小、輸出等進行設置,需要使用到兩個指令,分別是access_log和log_format指令。

(1)access_log:用來設置用戶訪問日誌的相關屬性。

語法 access_log path[format[buffer=size]]
默認值 access_log logs/access.log combined;
位置 http, server, location

(2)log_format:用來指定日誌的輸出格式。

語法 log_format name [escape=default|json|none] string….;
默認值 log_format combined “…”;
位置 http

其他配置指令

(1)sendfile:用來設置Nginx服務器是否使用sendfile()傳輸文件,該屬性可以大大提高Nginx處理靜態資源的性能

語法 sendfile on|off;
默認值 sendfile off;
位置 http、server、location

(2)keepalive_timeout:用來設置長連接的超時時間。

》為什麼要使用keepalive?

HTTP是一種無狀態協議,客戶端向服務端發送一個TCP請求,服務端響應完畢後斷開連接。
如何客戶端向服務端發送多個請求,每個請求都需要重新創建一次連接,效率相對來說比較多,使用keepalive模式,可以告訴服務器端在處理完一個請求後保持這個TCP連接的打開狀態,若接收到來自這個客戶端的其他請求,服務端就會利用這個未被關閉的連接,而不需要重新創建一個新連接,提升效率,但是這個連接也不能一直保持,這樣的話,連接如果過多,也會是服務端的性能下降,這個時候就需要我們進行設置其的超時時間。
語法 keepalive_timeout time;
默認值 keepalive_timeout 75s;
位置 http、server、location

(3)keepalive_requests:用來設置一個keep-alive連接使用的次數。

語法 keepalive_requests number;
默認值 keepalive_requests 100;
位置 http、server、location

server塊和location塊

	server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
       
        error_page   500 502 503 504 404  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
Tags: