Nginx 使用札記
作者:Mmzer
來自:https://segmentfault.com/a/1190000013781162
nginx是什麼?
nginx是俄羅斯人 Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的一個十分輕量級的HTTP伺服器。它是一個高性能的HTTP和反向代理伺服器,同時也可以作為IMAP/POP3/SMTP的代理伺服器。nginx使用的是BSD許可。
Nginx 以事件驅動的方式編寫,所以有非常好的性能,同時也是一個非常高效的反向代理、負載平衡。
Nginx 因為它的穩定性、豐富的模塊庫、靈活的配置和低系統資源的消耗而聞名。
nginx適合用來做mongrel clusters 的前端 HTTP 響應。
為什麼要用nginx,nginx有什麼特點?
nginx的特點(https://www.ctolib.com/topics-101000.html):
核心特點:高並發請求的同時保持高效的服務
熱部署
低內存消耗
處理響應請求很快
具有很高的可靠性
同時,nginx也可以實現高效的反向代理、負載均衡。
前端可以用nginx做些什麼?
搭建靜態資源伺服器
反向代理分發後端服務(可以和nodejs搭配實現前後端分離)和跨域問題
根據User Agent來重定向站點
開發環境或測試環境切換(切換host)
url重寫,使用rewrie規則本地映射
資源內容篡改
獲取cookie做分流
資源合併
gzip壓縮
壓縮圖片
sourceMap調試
如何安裝nginx?
mac安裝:
安裝brew之後,執行命令:
$ sudo brew install nginx
windows安裝
下載: nginx官網
解壓運行:解壓至
c
:
ginx
,運行
(即nginx
.
exe
),默認使用80埠,日誌見文件夾nginx
-
c conf ginx
.
conf
C
:
ginxlogs
關閉:
或nginx
-
s stop
taskkill
/
F
/
IM nginx
.
exe
>
nul
註:以下皆以mac為例。
nginx如何啟動、重啟、關閉?
查看nginx版本: nginx - v
啟動nginx服務:
方法一:運行命令:
sudo brew services start nginx
方法二:運行命令:
nginx
訪問http://localhost:8080,出現如下界面則表示安裝成功:
關閉nginx服務:
方法一:運行命令:
sudo brew services stop nginx
方法二:運行命令:
nginx
-
s stop
方法三:
運行命令:
,找到master對應的進程號。ps
-
ef
|
grep nginx
快速停止:
或kill
-
TERM nginx
進程號
kill
-
INT nginx
進程號
從容停止:
kill
-
QUIT nginx
進程號
強制停止所有nginx進程:
pkill
-
9
nginx
重啟nginx服務:
方法一:
nginx
-
s reload
方法二: 平滑重啟命令:
kill
-
HUP nginx
進程號
nginx信號控制:
快速關閉TERM
,
INT
從容關閉QUIT
平滑重啟,重新載入配置文件HUP
重新打開日誌文件,在切割日誌時用途較大USR1
平滑升級可執行程序USR2
從容關閉工作進程WINCH
如何查看nginx的配置文件nginx.conf的路徑和安裝路徑?
查看配置文件位置和測試配置文件語法:運行命令 nginx - t
:
查看nginx安裝路徑:因為是使用brew安裝的,所以使用brew命令: brew info nginx
nginx.conf基本配置有哪些?
nginx配置文件主要分成四個部分:
main,全局設置,影響其它部分所有設置
server,主機服務相關設置,主要用於指定虛擬主機域名、IP和埠
location,URL匹配特定位置後的設置,反向代理、內容篡改相關設置
upstream,上游伺服器設置,負載均衡相關配置
他們之間的關係式:server繼承main,location繼承server;upstream既不會繼承指令也不會被繼承。
如下是一份通用的配置和詳解:
#定義 Nginx 運行的用戶和用戶組,默認由 nobody 賬號運行, windows 下面可以注釋掉。
user nobody
;
#nginx進程數,建議設置為等於CPU總核心數。可以和worker_cpu_affinity配合
worker_processes
1
;
#全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#進程文件,window下可以注釋掉
#pid logs/nginx.pid;
# 一個nginx進程打開的最多文件描述符(句柄)數目,理論值應該是最多打開文件數(系統的值ulimit -n)與nginx進程數相除,
# 但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致。
worker_rlimit_nofile
65535
;
#工作模式與連接數上限
events
{
# 參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
# epoll模型是Linux 2.6以上版本內核中的高性能網路I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
#use epoll;
#connections 20000; # 每個進程允許的最多連接數
# 單個進程最大連接數(最大連接數=連接數*進程數)該值受系統進程最大打開文件數限制,需要使用命令ulimit -n 查看當前設置
worker_connections
65535
;
}
#設定http伺服器
http
{
#文件擴展名與文件類型映射表
#include
是個主模塊指令,可以將配置文件拆分並引用,可以減少主配置文件的複雜度
include mime
.
types
;
#默認文件類型
default_type application
/
octet
-
stream
;
#charset utf-8; #默認編碼
#定義虛擬主機日誌的格式
#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指令指定nginx是否調用sendfile函數來輸出文件,對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設置為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。注意:如果圖片顯示不正常把這個改成off。
sendfile on
;
#autoindex on; #開啟目錄列表訪問,合適下載伺服器,默認關閉。
#防止網路阻塞
#tcp_nopush on;
#長連接超時時間,單位是秒,默認為0
keepalive_timeout
65
;
# gzip壓縮功能設置
gzip on
;
#開啟gzip壓縮輸出
gzip_min_length
1k
;
#最小壓縮文件大小
gzip_buffers
4
16k
;
#壓縮緩衝區
gzip_http_version
1.0
;
#壓縮版本(默認1.1,前端如果是squid2.5請使用1.0)
gzip_comp_level
6
;
#壓縮等級
#壓縮類型,默認就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
gzip_types text
/
plain text
/
css text
/
javascript application
/
json application
/
javascript application
/
x
-
javascript application
/
xml
;
gzip_vary on
;
//和http頭有關係,加個vary頭,給代理伺服器用的,有的瀏覽器支持壓縮,有的不支持,所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮
#limit_zone crawler $binary_remote_addr 10m; #開啟限制IP連接數的時候需要使用
# http_proxy服務全局設置
client_max_body_size
10m
;
client_body_buffer_size
128k
;
proxy_connect_timeout
75
;
proxy_send_timeout
75
;
proxy_read_timeout
75
;
proxy_buffer_size
4k
;
proxy_buffers
4
32k
;
proxy_busy_buffers_size
64k
;
proxy_temp_file_write_size
64k
;
proxy_temp_path
/
usr
/
local
/
nginx
/
proxy_temp
1
2
;
# 設定負載均衡後台伺服器列表
upstream backend
.
com
{
#ip_hash; # 指定支持的調度演算法
# upstream 的負載均衡,weight 是權重,可以根據機器配置定義權重。weigth 參數表示權值,權值越高被分配到的幾率越大。
server
192.168
.
10.100
:
8080
max_fails
=
2
fail_timeout
=
30s
;
server
192.168
.
10.101
:
8080
max_fails
=
2
fail_timeout
=
30s
;
}
#虛擬主機的配置
server
{
#監聽埠
listen
80
;
#域名可以有多個,用空格隔開
server_name localhost fontend
.
com
;
# Server Side Include,通常稱為伺服器端嵌入
#ssi on;
#默認編碼
#charset utf-8;
#定義本虛擬主機的訪問日誌
#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
;
}
# 圖片緩存時間設置
location
~
.*.(
gif
|
jpg
|
jpeg
|
png
|
bmp
|
swf
)
$
{
expires
10d
;
}
# JS和CSS緩存時間設置
location
~
.*.(
js
|
css
)?
$
{
expires
1h
;
}
#代理配置
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location /proxy/ {
# 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;
# }
#}
}
location如何匹配?
示例:
location
=
/
{
# 精確匹配 / ,主機名後面不能帶任何字元串
[
configuration A
]
}
location
/
{
# 因為所有的地址都以 / 開頭,所以這條規則將匹配到所有請求
# 但是正則和最長字元串會優先匹配
[
configuration B
]
}
location
/
documents
/
{
# 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索
# 只有後面的正則表達式沒有匹配到時,這一條才會採用這一條
[
configuration C
]
}
location
~
/documents/
Abc
{
# 匹配任何以 /documents/ 開頭的地址,匹配符合以後,還要繼續往下搜索
# 只有後面的正則表達式沒有匹配到時,這一條才會採用這一條
[
configuration CC
]
}
location
^~
/
images
/
{
# 匹配任何以 /images/ 開頭的地址,匹配符合以後,停止往下搜索正則,採用這一條。
[
configuration D
]
}
location
~*
.
(
gif
|
jpg
|
jpeg
)
$
{
# 匹配所有以 gif,jpg或jpeg 結尾的請求
# 然而,所有請求 /images/ 下的圖片會被 config D 處理,因為 ^~ 到達不了這一條正則
[
configuration E
]
}
location
/
images
/
{
# 字元匹配到 /images/,繼續往下,會發現 ^~ 存在
[
configuration F
]
}
location
/
images
/
abc
{
# 最長字元匹配到 /images/abc,繼續往下,會發現 ^~ 存在
# F與G的放置順序是沒有關係的
[
configuration G
]
}
location
~
/images/
abc
/
{
# 只有去掉 config D 才有效:先最長匹配 config G 開頭的地址,繼續往下搜索,匹配到這一條正則,採用
[
configuration H
]
}
location
~*
/
js
/.*/
.js
說明:
以
開頭表示精確匹配=
開頭表示uri以某個常規字元串開頭,不是正則匹配^~
開頭表示區分大小寫的正則匹配;~
開頭表示不區分大小寫的正則匹配~*
通用匹配, 如果沒有其它匹配,任何請求都會匹配到/
優先順序:
(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ~,~* 正則順序) > (location 部分起始路徑) > (/)
如何配置反向代理?
詳解:
# 對 「/」 啟用反向代理
location
/
{
proxy_pass http
:
//127.0.0.1:3000; # 設置要代理的 uri,注意最後的 /。可以是 Unix 域套接字路徑,也可以是正則表達式。
proxy_redirect off
;
# 設置後端伺服器「Location」響應頭和「Refresh」響應頭的替換文本
proxy_set_header X
-
Real
-
IP $remote_addr
;
# 獲取用戶的真實 IP 地址
#後端的Web伺服器可以通過 X-Forwarded-For 獲取用戶真實IP,多個 nginx 反代的情況下,例如 CDN。參見:http://gong1208.iteye.com/blog/1559835 和 http://bbs.linuxtone.org/thread-9050-1-1.html
proxy_set_header X
-
Forwarded
-
For
$proxy_add_x_forwarded_for
;
#以下是一些反向代理的配置,可選。
proxy_set_header
Host
$host
;
# 允許重新定義或者添加發往後端伺服器的請求頭。
client_max_body_size
10m
;
#允許客戶端請求的最大單文件位元組數
client_body_buffer_size
128k
;
#緩衝區代理緩衝用戶端請求的最大位元組數,
proxy_connect_timeout
90
;
#nginx跟後端伺服器連接超時時間(代理連接超時)
proxy_send_timeout
90
;
#後端伺服器數據回傳時間(代理髮送超時)
proxy_read_timeout
90
;
#連接成功後,後端伺服器響應時間(代理接收超時)
proxy_buffer_size
4k
;
#設置代理伺服器(nginx)保存用戶頭信息的緩衝區大小
proxy_buffers
4
32k
;
#proxy_buffers緩衝區,網頁平均在32k以下的設置
proxy_busy_buffers_size
64k
;
#高負荷下緩衝大小(proxy_buffers*2)
proxy_temp_file_write_size
64k
;
#設定緩存文件夾大小,大於這個值,將從upstream伺服器傳
}
舉例:
location
^~
/
service
/
{
proxy_pass http
:
//192.168.60.245:8080/;
proxy_redirect
default
;
proxy_set_header
Host
$host
proxy_set_header X
-
Real
-
IP $remote_addr
;
proxy_set_header X
-
Forwarded
-
For
$proxy_add_x_forwarded_for
;
}
簡化:
location
/
proxy
/
{
proxy_pass http
:
//backend.com/;
proxy_redirect
default
;
}
如何配置rewrite?
rewrite功能就是集合正則表達式和標誌位實現url重寫和重定向。rewrite只能放在server{}、location{}、if(){}塊中,並且只能對域名後邊的出去傳遞參數外的字元串起作用。如URL: http : //microloan-sms-platform.yxapp.xyz/proxy/sms/task/querydeleted?page=1&pagesize=10
,只對/proxy/sms/task/querydeleted進行重寫。
如果相對域名或參數字元串起作用,可以使用全局變數匹配,也可以使用proxy_pass反向代理。
表明看rewrite和location功能有點像,都能實現跳轉,主要區別在於rewrite是在同一域名內更改獲取資源的路徑,而location是對一類路徑做控制訪問或反向代理,可以proxy_pass到其他機器。很多情況下rewrite也會寫在location里,它們的執行順序是:
執行server塊的rewrite指令
執行location匹配
執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件;循環超過10次,則返回500 Internal Server Error錯誤。
rewrite規則後邊,通常會帶有flag標誌位:
: 相當於Apache的[L]標記,表示完成rewritelast
: 停止執行當前虛擬主機的後續rewrite指令集break
: 返回redirect
臨時重定向,地址欄會顯示跳轉後的地址302
: 返回permanent
永久重定向,地址欄會顯示跳轉後的地址301
last break
和
區別:
一般寫在last
和server
中,而if
一般使用在break
中location
不終止重寫後的url匹配,即新的url會再從last
走一遍匹配流程,而server
終止重寫後的匹配break
和break
都能組織繼續執行後面的rewrite指令last
rewrite常用正則:
: 匹配除換行符以外的任意字元.
: 重複0次或1次?
: 重複1次或更多次+
: 重複0次或更多次*
:匹配數字d
: 匹配字元串的開始^
: 匹配字元串的介紹$
: 重複n次{
n
}
: 重複n次或更多次{
n
,}
: 匹配單個字元c[
c
]
: 匹配a-z小寫字母的任意一個[
a
-
z
]
可以使用 () $1
來進行分組,可以通過
的形式來引用。
示例:
location
/
proxy
/
{
proxy_pass http
:
//microloan-notification-web.yxapp.in;
rewrite
/
proxy
/(.*)
$
/
$1
break
;
}
如何配置負載均衡?
示例:
upstream test
.
net
{
ip_hash
;
server
192.168
.
11.1
:
80
;
server
192.168
.
11.11
:
80
down
;
server
192.168
.
11.123
:
8009
max_fails
=
3
fail_timeout
=
20s
;
server
192.168
.
11.1234
:
8080
;
}
upstream是Nginx的HTTP Upstream模塊,這個模塊通過一個簡單的調度演算法來實現客戶端IP到後端伺服器的負載均衡。
Nginx的負載均衡模塊目前支持4種調度演算法:
。每個請求按時間順序逐一分配到不同的後端伺服器,如果後端某台伺服器宕機,故障系統被自動剔除,使用戶訪問不受影響。Weight 指定輪詢權值,Weight值越大,分配到的訪問機率越高,主要用於後端每個伺服器性能不均的情況下。輪詢(默認)
。每個請求按訪問IP的hash結果分配,這樣來自同一個IP的訪客固定訪問一個後端伺服器,有效解決了動態網頁存在的session共享問題。ip_hash
。這是比上面兩個更加智能的負載均衡演算法。此種演算法可以依據頁面大小和載入時間長短智能地進行負載均衡,也就是根據後端伺服器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要使用這種調度演算法,必須下載Nginx的upstream_fair模塊。fair
。此方法按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,可以進一步提高後端緩存伺服器的效率。Nginx本身是不支持url_hash的,如果需要使用這種調度演算法,必須安裝Nginx 的hash軟體包。url_hash
upstream可以設定每個後端伺服器在負載均衡調度中的狀態,支持的狀態參數:
,表示當前的server暫時不參與負載均衡down
,預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,才會請求backup
機器,因此這台機器的壓力最輕。backup
,允許請求失敗的次數,默認為max_fails
。當超過最大次數時,返回1
模塊定義的錯誤。proxy_next_upstream
,在經歷了fail_timeout
次失敗後,暫停服務的時間。max_fails
可以和max_fails
一起使用。fail_timeout
注,當負載調度演算法為ip_hash時,後端伺服器在負載均衡調度中的狀態不能是weight和backup。
如何設置頁面緩存?
頁面緩存設置指令:
proxy_cache_path
:指定緩存的路徑和一些其他參數,緩存的數據存儲在文件中,並且使用代理url的哈希值作為關鍵字與文件名。
proxy_cache_path
/
data
/
nginx
/
cache
/
webserver levels
=
1
:
2
keys_zone
=
webserver
:
20m
max_size
=
1g
;
levels keys_zone inactive · max_size
參數指定緩存的子目錄數。
指定活動的key和元數據存儲在共享池(webserver為共享池名稱,20m位共享池大小),
參數指定的時間內緩存的數據沒有被請求則被刪除,默認inactive為10分鐘
指定緩存空間的大小。
: 設置一個緩存區域的名稱,一個相同的區域可以在不同的地方使用。proxy_cache
: 為不同的應答設置不同的緩存時間。proxy_cache_valid
如何設置讀寫分離?
server
{
listen
80
;
server_name localhost
;
#charset koi8-r;
#access_log logs/host.access.log main;
location
/
{
proxy_pass http
:
//192.128.133.202;
if
(
$request_method
=
"PUT"
){
proxy_pass http
:
//192.128.18.201;
}
}
}
參考
Nginx能為前端開發帶來什麼?
前端工程師應該知道的Nginx
前端 Nginx https SSL proxy + 後端 Nginx http 應用的布署教程
nginx配置location總結及rewrite規則寫法
nginx伺服器安裝及配置文件詳解
http://freeloda.blog.51cto.com/2033581/1288553
●編號
475
,輸入編號直達本文●輸入m獲取文章
目錄
推薦↓↓↓
Python編程
更多推薦
《
18個技術類微信公眾號
》
涵蓋:程序人生、演算法與數據結構、黑客技術與網路安全、大數據技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。
TAG:Linux學習 |