目錄
1.前言
2.安裝
3.配置文件詳解
4.工做原理
5.Linux下託管.NET Core項目
6.Linux下.NET Core項目負載均衡
7.Linux下.NET Core項目Nginx+Keepalived高可用(主從模式)
8.Linux下.NET Core項目Nginx+Keepalived高可用(雙主模式)
9.Linux下.NET Core項目LVS+Keepalived+Nginx高可用集羣
10.構建靜態服務器
11.日誌分析
12.優化策略
13.總結
Nginx擁有大量官方發佈的模塊和第三方模塊,這些已有的模塊能夠幫助咱們實現Web服務器上不少的功能。使用這些模塊時,僅僅須要增長、修改一些配置項便可。php
Nginx運行目錄爲/usr/local/nginx,其目錄結構以下:css
|---client_body_temp |---conf ---fastcgi.conf ---fastcgi.conf.default ---fastcgi_params ---fastcgi_params.default ---koi-utf ---koi-win ---mime.types ---mime.types.default ---nginx.conf ---nginx.conf.default ---scgi_params ---scgi_params.default ---uwsgi_params ---uwsgi_params.default ---win-utf |---fastcgi_temp |---html ---50x.html ---index.html |---logs ---access.log ---error.log ---nginx.pid |---proxy_temp |---sbin ---nginx |---scgi_temp |---uwsgi_temp
①、client_body_temp:若是客戶端POST一個比較大的文件,長度超過了nginx緩衝區的大小,須要把這個文件的部分或者所有內容暫存到client_body_temp目錄下的臨時文件。html
②、conf:這是Nginx全部配置文件的目錄,極其重要linux
fastcgi.conf:fastcgi相關參數的配置文件nginx
fastcgi.conf.default:fastcgi.conf的原始備份apache
fastcgi_params:fastcgi的參數文件,nginx配置Fastcgi解析時會調用fastcgi_params配置文件來傳遞服務器變量,這樣CGI中能夠獲取到這些變量的值。windows
fastcgi_params.default:fastcgi_params.conf的原始備份緩存
mime.types:文件擴展名與文件類型映射表,nginx根據映射關係,設置http請求響應頭的Content-Type值。當在映射表找不到時,使用nginx.conf中default-type指定的默認值。例如,默認配置中的指定的default-type爲application/octet-stream。服務器
mime.types.default:mime.types的原始備份網絡
nginx.conf:這是Nginx默認的主配置文件
nginx.conf.default:nginx.conf的原始備份
koi-utf、koi-win、win-utf:這三個文件都是與編碼轉換映射文件,用於在輸出內容到客戶端時,將一種編碼轉換到另外一種編碼。
koi-win: charset_map koi8-r < -- > windows-1251
koi-utf: charset_map koi8-r < -- > utf-8
win-utf: charset_map windows-1251 < -- > utf-8
koi8-r是斯拉夫文字8位元編碼,供俄語及保加利亞語使用。在Unicode未流行以前,KOI8-R 是最爲普遍使用的俄語編碼,使用率甚至起ISO/IEC 8859-5還高。這3個文件存在是由於做者是俄國人的緣由。
scgi_params:scgi的參數文件
scgi_params.default:scgi_params.conf的原始備份
uwsgi_params:uwcgi的參數文件
uwsgi_params.default:uwsgi_params.conf的原始備份
③、fastcgi_temp:Fastcgi的臨時數據目錄
④、html:默認站點目錄
50x.html:錯誤頁面優雅替代顯示文件,例如:出現502錯誤時會調用此頁面
index.html:默認的首頁文件,首頁文件名字是在nginx.conf中事先定義好的。
⑤、logs:這是Nginx默認的日誌路徑,包括錯誤日誌及訪問日誌
access.log:這是Nginx的默認訪問日誌文件,使用tail -f access.log,能夠實時觀看網站用戶訪問狀況信息
error.log:這是Nginx的錯誤日誌文件,若是Nginx出現啓動故障等問題,必定要看看這個錯誤日誌
nginx.pid:Nginx的pid文件,Nginx進程啓動後,會把全部進程的ID號寫到此文件
⑥、proxy_temp:反向代理緩存目錄
⑦、sbin:這是Nginx命令的目錄,如Nginx的啓動命令nginx
nginx:Nginx的啓動命令nginx
⑧、scgi_temp:scgi臨時目錄
⑨、uwsgi_temp:uwscgi臨時目錄
由於有的暫時尚未用到,因此下面咱們重點介紹conf配置文件
nginx.conf 配置文件分爲三大塊:
①、全局塊:主要會設置一些影響nginx 服務器總體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、容許生成的 worker process 數,進程 PID 存放路徑、日誌存放路徑和類型以及配置文件的引入等。下面的紅色部分爲全局塊
②、Events塊:events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡鏈接,經常使用的設置包括是否開啓對多 work process 下的網絡鏈接進行序列化,是否容許同時接收多個網絡鏈接,選取哪一種事件驅動模型來處理鏈接請求,每一個 word process 能夠同時支持的最大鏈接數等。下面的綠色部分爲Events塊
③、Http塊:Nginx 服務器配置中最頻繁的部分,代理、緩存和日誌定義等絕大多數功能和第三方模塊的配置都在這裏。Http部分又包含:http全局部分、一個或以上server 部分。下面的藍色部分爲Http塊
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }
①、#user nobody;
nobody 是系統用戶,是一個不能登錄的賬號,一個特殊用途的用戶 ID ,一些服務進程如apache,aquid等都採用一些特殊的賬號來運行,好比nobody,news,games等等。通常來講 uid < 500 的都是系統 ID 。如不指定nginx默認用戶是nobody. 這裏用戶的設置又有什麼意義呢?主要是指定執行nginx的worker process的用戶,linux裏全部程序都是文件,都具備權限問題,這個指定的用戶對特定的文件有沒有權限訪問或執行,就是這個用戶的意義。
出現訪問權限的時候,咱們不能直接把user改成root,這樣就能夠把每一個服務運行的狀況隔離出來,保證不會由於服務器程序的問題而讓服務器程序成了黑客的直接操做源。
指令格式:user user [group];
user:指定能夠運行Nginx服務器的用戶;group:可選項,能夠運行Nginx服務器的用戶組。
若是user指令不配置或者配置爲user nobody nobody,默認由nobody帳戶運行。
②、worker_processes 1;
Nginx開啓的進程數,worker_processes默認狀況下爲1,通常狀況下不用修改,但考慮到實際狀況,能夠修改這個數值,以提升性能;也能夠修改成worker_processes auto;自動的設置進程個數。
官方的建議是修改爲CPU的內核數,這裏引用一段翻譯過的文章:
worker_processes指明瞭nginx要開啓的進程數,
據官方說法,通常開一個就夠了,多開幾個,能夠減小機器io帶來的影響。
指令格式:worker_processes number | auto;
number : Nginx 進程最多能夠產生的worker process 數。
auto : Nginx 進程將自動檢測
③、#error_log logs/error.log;
error_log是關鍵字不能改變
logs/error.log是存放日誌的目錄,能夠指定任意目錄
在後面還能夠添加日誌級別,例如 error_log logs/error.log info;常見的錯誤日誌級別有[debug | info | notice | warn | error | crit | alert | emerg],級別越高記錄的信息越少。生產場景通常是 warn | error | crit 這三個級別之一,不要配置info等級較低的級別,會帶來大量的磁盤I/O消耗。
指定格式:error_log file | stderr;
file : 日誌輸出到某個文件file
stderr : 日誌輸出到標準錯誤輸出 (日誌輸出級別)。
④、#pid logs/nginx.pid;
Nginx進程是做爲系統守護進程在進行,須要在某個文件中保存當前運行程序的主進程號,Nginx支持該保存文件路徑的定義。
指令格式:pid file;
file:指定存放路徑和文件名稱。
若是不指定,則默認置於路徑 logs/nginx.pid
①、worker_connections 1024;
用於定義Nginx每一個進程的最大鏈接數,默認是1024。
②、#use [ kqueue | epoll | /dev/poll | select | poll ];
指定Nginx的工做模式。Nginx支持的工做模式有select、poll、kqueue、epoll、rtsig和/dev/poll 。其中select 和poll 都是標準的工做模式,kqueue和epoll是高效的工做模式,不一樣的是epoll用在Linux平臺上,而kqueue用在BSD系統中。對於Linux系統,epoll工做模式是首選。
①、定義MIMI-Type
include mime.types;
default_type application/octet-stream;
指令格式:include file;
該指令主要用於將其餘的Nginx配置或第三方模塊的配置引用到當前的主配文件中,減小主配置文件的複雜度。default_type application/octet-stream;
default_type
屬於HTTP核心模塊指令,這裏設定默認類型爲二進制流。也就是當文件類型未定義時使用這種方式,
②、自定義服務日誌
#log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main;
用於指定Nginx日誌的輸出日誌,後面章節有更詳細的講解
③、容許sendfile方式傳輸文件
sendfile on;
#tcp_nopush on;
開啓高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設爲 on,若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡I/O處理速度,下降系統的負載。注意:若是圖片顯示不正常把這個改爲off。
#sendfile指令指定 nginx 是否調用sendfile 函數(zero copy 方式)來輸出文件,對於普通應用,必須設爲on。若是用來進行下載等應用磁盤IO重負載應用,可設置爲off,以平衡磁盤與網絡IO處理速度,下降系統uptime。
#tcp_nopush on;此選項容許或禁止使用socke的TCP_CORK的選項,此選項僅在使用sendfile的時候使用
④、鏈接超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
設置客戶端鏈接保持活動的超時時間。在超過這個時間以後,服務器會關閉該鏈接,單位是秒。
若將它設置爲 0,就禁止了 keepalive 鏈接。
⑤、gzip壓縮
#gzip on;
開啓nginx gzip壓縮後,網頁、css、js等靜態資源的大小會大大的減小,從而能夠節約大量的帶寬,提升傳輸效率,給用戶快的體驗。
這塊和虛擬主機有密切關係,虛擬主機從用戶角度看,和一臺獨立的硬件主機是徹底同樣的,該技術的產生是爲了節省互聯網服務器硬件成本。後面會詳細介紹虛擬主機的概念。
每一個 http 塊能夠包括多個 server 塊,而每一個 server 塊就至關於一個虛擬主機。
而每一個 server 塊也分爲全局 server 塊,以及能夠同時包含多個 locaton 塊。
關於Server這一塊後面還有詳細介紹,這裏只是簡單說明。
①、listen 80;
聲明服務器監聽的端口號
②、server_name localhost;
用來指定IP地址或者域名,多個域名之間用空格分開
③、#charset koi8-r;
用於設置網頁的默認編碼格式
④、#access_log logs/host.access.log main;
定此虛擬主機的訪問日誌存放路徑,最後的main用於指定訪問日誌的輸出格式,在前面已經定義了。
這塊的主要做用是基於 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱(也能夠是IP別名)以外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這裏進行。
①、location / {}
該指令用於匹配 URL。Location接受兩個參數,一個字符串或者正則和一段代碼。字符串或者正則用於匹配某個特定目錄
②、proxy_pass
設置被代理服務器的地址。能夠是主機名稱、IP地址加端口號的形式。
③、index
設置網站的默認首頁。