Nginx配置詳解javascript
nginx概述php
nginx是一款自由的、開源的、高性能的HTTP服務器和反向代理服務器;同時也是一個IMAP、POP三、SMTP代理服務器;nginx能夠做爲一個HTTP服務器進行網站的發佈處理,另外nginx能夠做爲反向代理進行負載均衡的實現。css
這裏主要經過三個方面簡單介紹nginxhtml
反向代理java
負載均衡node
nginx特色linux
1. 反向代理nginx
關於代理web
說到代理,首先咱們要明確一個概念,所謂代理就是一個表明、一個渠道;算法
此時就設計到兩個角色,一個是被代理角色,一個是目標角色,被代理角色經過這個代理訪問目標角色完成一些任務的過程稱爲代理操做過程;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是adidas廠家,目標角色就是用戶
正向代理
說反向代理以前,咱們先看看正向代理,正向代理也是你們最常接觸的到的代理模式,咱們會從兩個方面來講關於正向代理的處理模式,分別從軟件方面和生活方面來解釋一下什麼叫正向代理
在現在的網絡環境下,咱們若是因爲技術須要要去訪問國外的某些網站,此時你會發現位於國外的某網站咱們經過瀏覽器是沒有辦法訪問的,此時你們可能都會用一個操做FQ進行訪問,FQ的方式主要是找到一個能夠訪問國外網站的代理服務器,咱們將請求發送給代理服務器,代理服務器去訪問國外的網站,而後將訪問到的數據傳遞給咱們!
上述這樣的代理模式稱爲正向代理,正向代理最大的特色是客戶端很是明確要訪問的服務器地址;服務器只清楚請求來自哪一個代理服務器,而不清楚來自哪一個具體的客戶端;正向代理模式屏蔽或者隱藏了真實客戶端信息。
反向代理
明白了什麼是正向代理,咱們繼續看關於反向代理的處理方式,舉例如我大天朝的某寶網站,天天同時鏈接到網站的訪問人數已經爆表,單個服務器遠遠不能知足人民日益增加的購買慾望了,此時就出現了一個你們耳熟能詳的名詞:分佈式部署;也就是經過部署多臺服務器來解決訪問人數限制的問題;某寶網站中大部分功能也是直接使用nginx進行反向代理實現的,而且經過封裝nginx和其餘的組件以後起了個高大上的名字:Tengine,有興趣的童鞋能夠訪問Tengine的官網查看具體的信息:http://tengine.taobao.org/
那麼反向代理具體是經過什麼樣的方式實現的分佈式的集羣操做呢,咱們先看一個示意圖:
經過上述的圖解你們就能夠看清楚了,多個客戶端給服務器發送的請求,nginx服務器接收到以後,按照必定的規則分發給了後端的業務處理服務器進行處理了。此時~請求的來源也就是客戶端是明確的,可是請求具體由哪臺服務器處理的並不明確了,nginx扮演的就是一個反向代理角色
反向代理,主要用於服務器集羣分佈式部署的狀況下,反向代理隱藏了服務器的信息!
項目場景
一般狀況下,咱們在實際項目操做時,正向代理和反向代理頗有可能會存在在一個應用場景中,正向代理代理客戶端的請求去訪問目標服務器,目標服務器是一個反向單利服務器,反向代理了多臺真實的業務處理服務器。具體的拓撲圖以下:
2. 負載均衡
咱們已經明確了所謂代理服務器的概念,那麼接下來,nginx扮演了反向代理服務器的角色,它是以依據什麼樣的規則進行請求分發的呢?不用的項目應用場景,分發的規則是否能夠控制呢?
這裏提到的客戶端發送的、nginx反向代理服務器接收到的請求數量,就是咱們說的負載量
請求數量按照必定的規則進行分發到不一樣的服務器處理的規則,就是一種均衡規則
因此~將服務器接收到的請求按照規則分發的過程,稱爲負載均衡。
負載均衡在實際項目操做過程當中,有硬件負載均衡和軟件負載均衡兩種,硬件負載均衡也稱爲硬負載,如F5負載均衡,相對造價昂貴成本較高,可是數據的穩定性安全性等等有很是好的保障,如中國移動中國聯通這樣的公司纔會選擇硬負載進行操做;更多的公司考慮到成本緣由,會選擇使用軟件負載均衡,軟件負載均衡是利用現有的技術結合主機硬件實現的一種消息隊列分發機制
nginx支持的負載均衡調度算法方式以下:
weight輪詢(默認):接收到的請求按照順序逐一分配到不一樣的後端服務器,即便在使用過程當中,某一臺後端服務器宕機,nginx會自動將該服務器剔除出隊列,請求受理狀況不會受到任何影響。 這種方式下,能夠給不一樣的後端服務器設置一個權重值(weight),用於調整不一樣的服務器上請求的分配率;權重數據越大,被分配到請求的概率越大;該權重值,主要是針對實際工做環境中不一樣的後端服務器硬件配置進行調整的。
ip_hash:每一個請求按照發起客戶端的ip的hash結果進行匹配,這樣的算法下一個固定ip地址的客戶端總會訪問到同一個後端服務器,這也在必定程度上解決了集羣部署環境下session共享的問題。
fair:智能調整調度算法,動態的根據後端服務器的請求處理到響應的時間進行均衡分配,響應時間短處理效率高的服務器分配到請求的機率高,響應時間長處理效率低的服務器分配到的請求少;結合了前二者的優勢的一種調度算法。可是須要注意的是nginx默認不支持fair算法,若是要使用這種調度算法,請安裝upstream_fair模塊
url_hash:按照訪問的url的hash結果分配請求,每一個請求的url會指向後端固定的某個服務器,能夠在nginx做爲靜態服務器的狀況下提升緩存效率。一樣要注意nginx默認不支持這種調度算法,要使用的話須要安裝nginx的hash軟件包
Nginx安裝
1. windows安裝
官方網站下載地址:
https://nginx.org/en/download.html
以下圖所示,下載對應的版本的nginx壓縮包,解壓到本身電腦上存放軟件的文件夾中便可
解壓完成後,文件目錄結構以下:
啓動nginx
1) 直接雙擊該目錄下的nginx.exe,便可啓動nginx服務器
2) 命令行計入該文件夾,執行nginx命令,也會直接啓動nginx服務器
D:/resp_application/nginx-1.13.5> nginx
訪問nginx
打開瀏覽器,輸入地址:http://localhost,訪問頁面,出現以下頁面表示訪問成功
中止nginx
命令行進入nginx根目錄,執行以下命令,中止服務器:
# 強制中止nginx服務器,若是有未處理的數據,丟棄
D:/resp_application/nginx-1.13.5> nginx -s stop
# 優雅的中止nginx服務器,若是有未處理的數據,等待處理完成以後中止
D:/resp_application/nginx-1.13.5> nginx -s quit
2. ubuntu安裝
按照正常軟件的安裝方式,直接經過以下命令進行安裝:
$ sudo apt-get install nginx
安裝完成便可,在/usr/sbin/目錄下是nginx命令所在目錄,在/etc/nginx/目錄下是nginx全部的配置文件,用於配置nginx服務器以及負載均衡等信息
查看nginx進程是否啓動
$ ps -ef|grep nginx
nginx會自動根據當前主機的CPU的內核數目建立對應的進程數量(當前ubuntu主機是2核4線程配置)
備註:這裏啓動的服務進程實際上是4個進程,由於nginx進程在啓動的時候,會附帶一個守護進程,用於保護正式進程不被異常終止;若是守護進程一旦返現nginx繼承被終止了,會自動重啓該進程。
守護進程通常會稱爲master進程,業務進程被稱爲worker進程
啓動nginx服務器命令
直接執行nginx會按照默認的配置文件進行服務器的啓動
$ nginx
中止nginx服務命令
和windows系統執行過程同樣,兩種中止方式
$ nginx -s stop
or
$ nginx -s quit
從新啓動加載
一樣也可使用命令reopen和reload來從新啓動nginx或者從新加載配合着文件。
3. mac os安裝
直接經過brew進行nginx的安裝,或者下載tar.gz壓縮包都是能夠的。
直接經過brew進行安裝
brew install nginx
安裝完成後,後續的命令操做,服務器的啓動、進程查看、服務器的中止、服務器的重啓已經文件加載命令都是一致的。
nginx配置
nginx是一個功能很是強大的web服務器加反向代理服務器,同時又是郵件服務器等等
在項目使用中,使用最多的三個核心功能是反向代理、負載均衡和靜態服務器
這三個不一樣的功能的使用,都跟nginx的配置密切相關,nginx服務器的配置信息主要集中在nginx.conf這個配置文件中,而且全部的可配置選項大體分爲如下幾個部分
main # 全局配置
events { # nginx工做模式配置
}
http { # http設置
....
server { # 服務器主機配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 負載均衡配置
....
}
}
如上述配置文件所示,主要由6個部分組成:
main:用於進行nginx全局信息的配置
events:用於nginx工做模式的配置
http:用於進行http協議信息的一些配置
server:用於進行服務器訪問信息的配置
location:用於進行訪問路由的配置
upstream:用於進行負載均衡的配置
main模塊
觀察下面的配置代碼
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
worker_rlimit_nofile 1024;
上述配置都是存放在main全局配置模塊中的配置項
user用來指定nginx worker進程運行用戶以及用戶組,默認nobody帳號運行
worker_processes指定nginx要開啓的子進程數量,運行過程當中監控每一個進程消耗內存(通常幾M~幾十M不等)根據實際狀況進行調整,一般數量是CPU內核數量的整數倍
error_log定義錯誤日誌文件的位置及輸出級別【debug / info / notice / warn / error / crit】
pid用來指定進程id的存儲文件的位置
worker_rlimit_nofile用於指定一個進程能夠打開最多文件數量的描述,最大文件打開數(鏈接),可設置爲系統優化後的ulimit -HSn的結果
event 模塊
上乾貨
event {
accept_mutex on; #設置網路鏈接序列化,防止驚羣現象發生,默認爲on
worker_connections 1024;
multi_accept on;
use epoll;
}
上述配置是針對nginx服務器的工做模式的一些操做配置
worker_connections 指定最大能夠同時接收的鏈接數量,這裏必定要注意,最大鏈接數量是和worker processes共同決定的。
multi_accept 配置指定nginx在收到一個新鏈接通知後儘量多的接受更多的鏈接
use epoll 配置指定了線程輪詢的方法,若是是linux2.6+,使用epoll,若是是BSD如Mac請使用Kqueue
http模塊
做爲web服務器,http模塊是nginx最核心的一個模塊,配置項也是比較多的,項目中會設置到不少的實際業務場景,須要根據硬件信息進行適當的配置,常規狀況下,使用默認配置便可!
http {
##
# 基礎配置
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
#設定請求緩存
server_names_hash_bucket_size 256;
#保存服務器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。參數hash bucket size老是
#等於hash表的大小,而且是一路處理器緩存大小的倍數。在減小了在內存中的存取次數後,使在處理器中加速查找hash表鍵值成爲可能。若是
#hash bucket size等於一路處理器緩存的大小,那麼在查找鍵的時候,最壞的狀況下在內存中查找的次數爲2。第一次是肯定存儲單元的地址,
#第二次是在存儲單元中查找鍵 值。所以,若是Nginx給出須要增大 hash max size 或 hash bucket size的提示,那麼首要的是增大前一個參數的大小.
client_header_buffer_size 256k;
# 設定請求緩衝
large_client_header_buffers 4 256k
# 設定請求緩衝;
client_max_body_size 500m;
#==容許客戶端請求的最大單文件字節數
client_body_buffer_size 256k;
#==衝區代理緩衝用戶端請求的最大字節數
client_header_timeout 3m;
#用於設置客戶端請求讀取超時時間,若是超過這個時間,客戶端沒有發送任何數據,nginx將返回「request time out (408)」錯誤。
client_body_timeout 3m;
#用於設置客戶端請求主體讀取超時時間,默認值爲60.若是超過這個時間,客戶端尚未發送任何數據,nginx將返回「Request time out(408)」
send_timeout 3m;
#服務器超時設置
large_client_header_buffers 4 512k;
client_max_body_size 100m;
'
#設定日誌格式通常來講:nginx的log_format有不少可選的參數用於指示服務器的活動狀態,默認的是:
log_format main '$remote_addr - $remote_user [$time_local] "$request"
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';;
#隱藏響應header和錯誤通知中的版本號
server_tokens off;
##
# SSL證書配置
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# 日誌配置
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip 壓縮配置
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript;
##
# 虛擬主機配置
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
1) 基礎配置
sendfile on:配置on讓sendfile發揮做用,將文件的回寫過程交給數據緩衝去去完成,而不是放在應用中完成,這樣的話在性能提高有有好處
tcp_nopush on:讓nginx在一個數據包中發送全部的頭文件,而不是一個一個單獨發
tcp_nodelay on:讓nginx不要緩存數據,而是一段一段發送,若是數據的傳輸有實時性的要求的話能夠配置它,發送完一小段數據就馬上能獲得返回值,可是不要濫用哦
keepalive_timeout 10:給客戶端分配鏈接超時時間,服務器會在這個時間事後關閉鏈接。通常設置時間較短,可讓nginx工做持續性更好
client_header_timeout 10:設置請求頭的超時時間
client_body_timeout 10:設置請求體的超時時間
send_timeout 10:指定客戶端響應超時時間,若是客戶端兩次操做間隔超過這個時間,服務器就會關閉這個連接
limit_conn_zone $binary_remote_addr zone=addr:5m :設置用於保存各類key的共享內存的參數,
limit_conn addr 100: 給定的key設置最大鏈接數
server_tokens:雖然不會讓nginx執行速度更快,可是能夠在錯誤頁面關閉nginx版本提示,對於網站安全性的提高有好處哦
include /etc/nginx/mime.types:指定在當前文件中包含另外一個文件的指令
default_type application/octet-stream:指定默認處理的文件類型能夠是二進制
type_hash_max_size 2048:混淆數據,影響三列衝突率,值越大消耗內存越多,散列key衝突率會下降,檢索速度更快;值越小key,佔用內存較少,衝突率越高,檢索速度變慢
日誌格式詳解:
在日誌格式樣式中,變量$remote_addr和$http_x_forwarded_for用於記錄IP地址;
$remote_user用於記錄遠程客戶端用戶名稱;
$time_local用於記錄訪問時間與時區;
$request用於記錄請求URL與HTTP協議;
$status用於記錄請求狀態,例如成功時狀態爲200,頁面找不到時狀態爲404;
$body_bytes_sent用於記錄發送客戶端的文件主體內容大小;
$http_referer用於記錄是從哪一個頁面連接訪問過來的;
$http_user_agent用於記錄客戶瀏覽器的相關信息。
2) 日誌配置
access_log logs/access.log:設置存儲訪問記錄的日誌
error_log logs/error.log:設置存儲記錄錯誤發生的日誌
3) SSL證書加密
ssl_protocols:指令用於啓動特定的加密協議,nginx在1.1.13和1.0.12版本後默認是ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2,TLSv1.1與TLSv1.2要確保OpenSSL >= 1.0.1 ,SSLv3 如今還有不少地方在用但有很多被攻擊的漏洞。
ssl prefer server ciphers:設置協商加密算法時,優先使用咱們服務端的加密套件,而不是客戶端瀏覽器的加密套件
4) 壓縮配置
gzip 是告訴nginx採用gzip壓縮的形式發送數據。這將會減小咱們發送的數據量。
gzip_disable 爲指定的客戶端禁用gzip功能。咱們設置成IE6或者更低版本以使咱們的方案可以普遍兼容。
gzip_static 告訴nginx在壓縮資源以前,先查找是否有預先gzip處理過的資源。這要求你預先壓縮你的文件(在這個例子中被註釋掉了),從而容許你使用最高壓縮比,這樣nginx就不用再壓縮這些文件了(想要更詳盡的gzip_static的信息,請點擊這裏)。
gzip_proxied 容許或者禁止壓縮基於請求和響應的響應流。咱們設置爲any,意味着將會壓縮全部的請求。
gzip_min_length 設置對數據啓用壓縮的最少字節數。若是一個請求小於1000字節,咱們最好不要壓縮它,由於壓縮這些小的數據會下降處理此請求的全部進程的速度。
gzip_comp_level 設置數據的壓縮等級。這個等級能夠是1-9之間的任意數值,9是最慢可是壓縮比最大的。咱們設置爲4,這是一個比較折中的設置。
gzip_type 設置須要壓縮的數據格式。上面例子中已經有一些了,你也能夠再添加更多的格式。
5) 文件緩存配置
open_file_cache 打開緩存的同時也指定了緩存最大數目,以及緩存的時間。咱們能夠設置一個相對高的最大時間,這樣咱們能夠在它們不活動超過20秒後清除掉。
open_file_cache_valid 在open_file_cache中指定檢測正確信息的間隔時間。
open_file_cache_min_uses 定義了open_file_cache中指令參數不活動時間期間裏最小的文件數。
open_file_cache_errors 指定了當搜索一個文件時是否緩存錯誤信息,也包括再次給配置中添加文件。咱們也包括了服務器模塊,這些是在不一樣文件中定義的。若是你的服務器模塊不在這些位置,你就得修改這一行來指定正確的位置。
server模塊
srever模塊配置是http模塊中的一個子模塊,用來定義一個虛擬訪問主機,也就是一個虛擬服務器的配置信息
server {
listen 80;
server_name localhost 192.168.1.100;
root /nginx/www;
index index.php index.html index.html;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......
}
server {
listen 80 default;
server_name _;
return 404;
# 這裏設置一個默認的主機,當默認訪問的時候返回404錯誤
# 也能夠修改爲403或者500,根據自身狀況進行設置
核心配置信息以下:
server:一個虛擬主機的配置,一個http中能夠配置多個server
server_name:用於指定ip地址或者域名,多個配置之間用空格分隔
root:表示整個server虛擬主機內的根目錄,全部當前主機中web項目的根目錄
index:用戶訪問web網站時的全局首頁
charset:用於設置www/路徑中配置的網頁的默認編碼格式
access_log:用於指定該虛擬主機服務器中的訪問記錄日誌存放路徑
error_log:用於指定該虛擬主機服務器中訪問錯誤日誌的存放路徑
location模塊:https://blog.csdn.net/dmw412724/article/details/79770159
location模塊是nginx配置中出現最多的一個配置,主要用於配置路由訪問信息
在路由訪問信息配置中關聯到反向代理、負載均衡等等各項功能,因此location模塊也是一個很是重要的配置模塊:
基本配置
location / {
root /nginx/www;
index index.php index.html index.htm;
}
location /:表示匹配訪問根目錄
root:用於指定訪問根目錄時,訪問虛擬主機的web目錄
index:在不指定訪問具體資源時,默認展現的資源文件列表
反向代理配置方式
經過反向代理代理服務器訪問模式,經過proxy_set配置讓客戶端訪問透明化
location ~ /siteserver {
limit_except GET POST {
deny all;
}
#Nginx提供HTTP的Basic Auth功能,配置了Basic Auth以後,須要輸入正確的用戶名和密碼以後才能正確的訪問網站。
auth_basic "湖北國聯公司官網"; #自定義名稱
auth_basic_user_file /www/server/nginx/pass_file; #自定義加密文件存放路徑 。先要到http://tool.oschina.net/htpasswd生成密碼,保存在自定義的文件中,而後如上給出一個路徑,就能夠有一個驗證密碼的過程。
proxy_pass http://192.168.9.153:80;
proxy_redirect off;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header Accept-Encoding "";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 36000; #設置與代理服務器的讀超時時間
# limit_except技術資料參考 #https://blog.csdn.net/woshizhangliang999/article/details/51160877
#限制除GET 與 POST方法外的http方法經過
limit_except GET POST {
deny all;
}
chunked_transfer_encoding on;
$args : #這個變量等於請求行中的參數,同$query_string
$content_length : 請求頭中的Content-length字段。
$content_type : 請求頭中的Content-Type字段。
$document_root : 當前請求在root指令中指定的值。
$host : 請求主機頭字段,不然爲服務器名稱。
$http_user_agent : 客戶端agent信息
$http_cookie : 客戶端cookie信息
$limit_rate : 這個變量能夠限制鏈接速率。
$request_method : 客戶端請求的動做,一般爲GET或POST。
$remote_addr : 客戶端的IP地址。
$remote_port : 客戶端的端口。
$remote_user : 已經通過Auth Basic Module驗證的用戶名。
$request_filename : 當前請求的文件路徑,由root或alias指令與URI請求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 請求使用的協議,一般是HTTP/1.0或HTTP/1.1。
$server_addr : 服務器地址,在完成一次系統調用後能夠肯定這個值。
$server_name : 服務器名稱。
$server_port : 請求到達服務器的端口號。
$request_uri : 包含請求參數的原始URI,不包含主機名,如:」/foo/bar.php?arg=baz」。
$uri : 不帶請求參數的當前URI,$uri不包含主機名,如」/foo/bar.html」。
$document_uri : 與$uri相同。
#分塊數據傳輸,運用於動態頁面較多若是結合Transfer-Encoding: chunked使用,就沒必要申請一個很大的字節數組了,能夠一#塊一塊的輸出,更科學,佔用資源更少。這個通常結合Content-Encoding:gzip使用,即先將數據壓縮,再使用塊技術傳輸數據。
#技術資料https://blog.csdn.net/zhanglh046/article/details/78641662
# sub_filter技術資料:http://www.javashuo.com/article/p-tnksqdlx-du.html
sub_filter www.szbjhy.com #要替換的字符串
'www.hbsz.gov.cn'; #替換後的字符串
sub_filter_types *;#選定查找替換文件類型爲文本型,特殊值「 *」匹配任何MIME類型
sub_filter_once off;# 指示是否查找每一個字符串以替換一次或重複替換。On爲開啓,off爲關閉。
# limit_except 技術參考資料#https://blog.csdn.net/woshizhangliang999/article/details/51160877
limit_except GET POST {
deny all;
}
}
uwsgi配置
wsgi模式下的服務器配置訪問方式
location / {
include uwsgi_params;
uwsgi_pass localhost:8888
}
upstream模塊
upstream模塊主要負責負載均衡的配置,經過默認的輪詢調度方式來分發請求到後端服務器
簡單的配置方式以下
upstream name {
ip_hash;
server 192.168.1.100:8000;
server 192.168.1.100:8001 down;
server 192.168.1.100:8002 max_fails=3;
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
核心配置信息以下
ip_hash:指定請求調度算法,默認是weight權重輪詢調度,能夠指定
server host:port:分發服務器的列表配置
-- down:表示該主機暫停服務
-- max_fails:表示失敗最大次數,超過失敗最大次數暫停服務
-- fail_timeout:表示若是請求受理失敗,暫停指定的時間以後從新發起請求