Nginx安裝配置詳解
Nginx簡介
Nginx(“engine x”)是一款高性能的Web服務(wù)器和反向代理服務(wù)器,它采用事件驅(qū)動(dòng)的異步結(jié)構(gòu),具有內(nèi)存占用少、穩(wěn)定性高、能夠處理大量的并發(fā)請求,具有高效和低資源消耗等特點(diǎn)。 Nginx常常被用作Web服務(wù)器、負(fù)載均衡器、反向代理和緩存服務(wù)器等。
Nginx安裝
在Ubuntu中,安裝Nginx步驟如下:
- 更新軟件源
可以通過運(yùn)行以下命令更新軟件源:
sudo apt-get update
# 在CentOS中
# sudo yum install epel-release
- 安裝Nginx
安裝Nginx服務(wù)器可以通過以下命令:
sudo apt-get install nginx
# 在CentOS中
# sudo yum install nginx
- 檢查Nginx是否正確安裝
運(yùn)行以下命令可以檢查Nginx是否正確安裝:
# 查看nginx版本號
nginx -v
# 查看nginx版本號以及其他配置參數(shù),包含安裝、配置文件路徑以及內(nèi)置模塊等信息
nginx -V
如果能夠輸出Nginx的版本號,則表示Nginx已經(jīng)正確安裝。
默認(rèn)情況下,Nginx的安裝路徑為/usr/share/nginx
,Nginx的配置文件路徑為/etc/nginx/nginx.conf
。
- nginx幫助手冊命令以及常用命令
# 查看nginx幫助文檔
nginx -h
# 在Linux系統(tǒng)中,可以使用man命令查看nginx詳細(xì)幫助文檔
man nginx
# 檢測nginx配置文件語法是否正確
nginx -t
# 檢測nginx配置文件語法是否正確,并把nginx配置文件信息輸出到屏幕
nginx -T
# 設(shè)置nginx使用的配置文件(默認(rèn)使用:/usr/local/etc/nginx/nginx.conf)
nginx -c nginx_file.conf
# 向nginx主進(jìn)程發(fā)送信號,stop, quit, reopen, reload
nginx -s stop # 停止Nginx進(jìn)程
nginx -s quit # 快速停止Nginx進(jìn)程,但允許完成已經(jīng)接受的連接請求
nginx -s reopen # 重新打開日志文件
# 與stop不同,reload不會(huì)完全停止Nginx進(jìn)程,而是平滑地重新加載配置文件,并在新的工作進(jìn)程中對已有的連接進(jìn)行服務(wù),可在不停止服務(wù)的情況下實(shí)現(xiàn)動(dòng)態(tài)更新配置
nginx -s reload
區(qū)別:
stop和quit都是停止Nginx進(jìn)程,但quit允許之前接受的連接繼續(xù)完成,而stop則會(huì)強(qiáng)制終止所有連接。
reload會(huì)重載Nginx的配置文件,并啟動(dòng)新的worker進(jìn)程,新的worker進(jìn)程會(huì)用新的配置重新跑,舊的worker進(jìn)程會(huì)繼續(xù)處理舊有的連接,新配置生效后,新的連接會(huì)從新的worker進(jìn)程處理,而reopen是重新打開日志文件,在日志文件較大的時(shí)候,方便日志切割。
全局內(nèi)置指令和變量
Nginx常用的全局指令
- user:指定Nginx所使用的系統(tǒng)用戶和用戶組,默認(rèn)為nobody;
- worker_processes:指定Nginx工作進(jìn)程的數(shù)量,默認(rèn)為1;
- worker_cpu_affinity:指定每個(gè)worker進(jìn)程綁定的CPU核心;
- worker_rlimit_nofile:指定每個(gè)worker進(jìn)程允許打開的最大文件數(shù);
- pid:指定Nginx進(jìn)程號存放的位置,默認(rèn)為/var/run/nginx.pid;
- access_log:指定Nginx訪問日志存放的位置和格式;
- error_log:指定Nginx錯(cuò)誤日志存放的位置和格式,常用的格式有
debug
,info
,notice
,warn
,error
和crit
; - events:指定Nginx事件模塊的配置,常見的配置包括
worker_connections
(最大連接數(shù))和use
,epoll
和kqueue
,以及其他一些事件模塊配置; - http:指定Nginx HTTP模塊的配置,包括
server_names_hash_max_size
(域名哈希表的最大尺寸)、server_names_hash_bucket_size
(每個(gè)哈希桶的大小)、client_max_body_size
(前端客戶端傳輸?shù)淖畲笳埱篌w大小)等等; - server:指定Nginx所有server塊的配置,包括
listen
(服務(wù)器監(jiān)聽端口)、server_name
(服務(wù)器域名)、access_log
(訪問日志路徑和格式)等等。 - keepalive_timeout:指定HTTP keep-alive連接超時(shí)時(shí)間。
- multi_accept:一個(gè)請求是否能夠被多個(gè) worker 處理。
- gzip:是否啟用gzip壓縮傳輸;
- ssl:開啟SSL支持;
- use:添加 nginx 模塊;
更多配置信息詳見官方文檔:https://nginx.org/en/docs/
更多指令詳見官方文檔:https://nginx.org/en/docs/dirindex.html
nginx常用的內(nèi)置變量
- $request_method:所使用的 HTTP 請求方法,如 GET、POST、PUT、DELETE、HEAD 等。
- $host: 請求的主機(jī)名。
- $http_referer: 請求的 HTTP referer 頭部字段。
- $http_user_agent: 請求的 User-Agent 頭部字段。
- $remote_addr: 客戶端的 IP 地址。
- $request_body: 請求主體的內(nèi)容。
- $request_uri: 請求的 URI 包括參數(shù)部分。
-
$args
: 請求中的參數(shù)部分,同$query_string
。 - $scheme: 請求使用的協(xié)議,比如 http 或 https。
- $server_name: Nginx 配置中當(dāng)前虛擬主機(jī)的名稱。
- $server_port: Nginx 監(jiān)聽的端口號。
通過使用這些內(nèi)置變量,可以方便地在Nginx配置中進(jìn)行動(dòng)態(tài)參數(shù)配置、請求頭部字段獲取等操作。同時(shí),還可以像使用任何其他Nginx變量一樣,將它們與各種指令(如if、set、map)結(jié)合使用。
以下是Nginx中常用的一些內(nèi)置變量及其說明:
- $request_method:所使用的 HTTP 請求方法,如 GET、POST、PUT、DELETE、HEAD 等。
示例:
if ($request_method = POST) {
return 405;
}
- $host:請求頭中的主機(jī)名,通常用于虛擬主機(jī)配置。
示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
- $scheme:請求使用的協(xié)議,如 http 或 https。
示例:
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
- $request_uri:請求的完整 URI,包括參數(shù)。
示例:
location ~ \.php$ {
fastcgi_pass backend;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
}
- $remote_addr:客戶端的IP地址。
示例:
geo $blocked_country {
default no;
include /etc/nginx/conf.d/blocked_country.txt;
}
server {
if ($blocked_country) {
return 403;
}
}
- $args:請求參數(shù)部分的字符串。
示例:
location /search/ {
if ($args ~* "q=(.*)") {
set $query $1;
}
proxy_pass http://backend/search?q=$query;
}
- $http_referer:HTTP 請求頭中的 referer 字段,表示從哪個(gè)網(wǎng)頁鏈接過來。
示例:
if ($http_referer ~* (spamdomain.com|adsite.com)) {
return 403;
}
- $http_user_agent:HTTP 請求頭中的 User-Agent 字段,表示發(fā)起請求的客戶端使用的瀏覽器。
示例:
if ($http_user_agent ~* "MSIE [1-6]\.") {
return 403;
}
- $server_name:配置文件中定義的當(dāng)前虛擬主機(jī)名稱。
示例:
server {
listen 80;
server_name example.com;
location / {
root /var/www/example.com;
}
}
- $server_addr:Nginx 監(jiān)聽的 IP 地址。
示例:
server {
listen 127.0.0.1:8080;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
這些內(nèi)置變量的詳細(xì)說明和使用方法可以在官網(wǎng)文檔中找到。
更多內(nèi)置變量詳見官方文檔:https://nginx.org/en/docs/varindex.html
set詳細(xì)用法
下面是nginx配置自定義變量的詳細(xì)用法和代碼示例:
它的語法為:
set $variable value;
其中,$variable為變量名,value為變量值,可以是文本、數(shù)字、表達(dá)式等等。set指令可以在http、server、location、if等塊中使用。
需要注意的是,set
指令只在當(dāng)前上下文中應(yīng)用。如果在 http 上下文中設(shè)置變量,則它將在整個(gè) Nginx 配置中使用。但是,在 server 和 location 上下文等細(xì)分上下文中設(shè)置的變量僅在該上下文中使用。變量值的計(jì)算是在每個(gè)請求中進(jìn)行的,因此可以在 Nginx 配置中動(dòng)態(tài)地設(shè)置變量。此外,您還可以使用nginx的內(nèi)置變量,例如$uri
、$request_method
等,將它們與自定義變量一起使用來構(gòu)建更復(fù)雜的變量。
- 定義參數(shù)變量:
使用set關(guān)鍵字定義參數(shù)變量,例如:
http {
#定義全局參數(shù)變量
set $var "/path/to/some/file.txt";
...
}
- 使用參數(shù)變量:
在配置文件中可以使用$符號引用參數(shù)變量,例如:
location / {
...
#使用參數(shù)變量
rewrite ^(.*)$ $var;
...
}
- 參數(shù)變量與字符串拼接:
可以使用concat
函數(shù)將參數(shù)變量和字符串拼接起來,例如:
http {
#定義全局參數(shù)變量
set $base_url "https://example.com/";
...
}
location / {
...
#將參數(shù)變量和字符串拼接起來
set $img_url "/img/";
set $full_path "${base_url}$(uri)${img_url}";
...
}
- 參數(shù)變量與正則表達(dá)式:
可以使用參數(shù)變量與正則表達(dá)式一起使用,例如:
location ~* \.(jpeg|jpg|png)$ {
...
#將匹配的文件類型保存到參數(shù)變量中
set $img_type $1;
...
}
- 從請求中提取變量值:
set $my_var $arg_var;
這樣就從請求的參數(shù)中提取了名為arg_var的變量,并將其值賦給$my_var。
- 使用表達(dá)式計(jì)算變量值:
set $my_var 10;
set $my_var2 20;
set $my_var3 $my_var+$my_var2;
這樣就定義了三個(gè)變量,$my_var
的值為10,$my_var2
的值為20,$my_var3
的值為它們的和30。
- 使用map模塊設(shè)置匹配規(guī)則:
map $uri $my_var {
/page1.html "This is page 1.";
/page2.html "This is page 2.";
default "This page does not exist.";
}
set $my_var2 $my_var;
這樣就使用map模塊給$uri
變量匹配規(guī)則,如果匹配到了/page1.html
,則$my_var
的值為"This is page 1.",否則如果匹配到了/page2.html
,則$my_var
的值為"This is page 2.",否則如果沒有匹配到任何規(guī)則,則$my_var
的值為"This page does not exist."。在set指令中,我們可以使用$my_var
來引用這個(gè)變量。
通過使用參數(shù)變量的方式,我們可以大大簡化和優(yōu)化配置文件中的重復(fù)代碼和硬編碼。下面是一個(gè)例子:
http {
#定義全局參數(shù)變量
set $base_url "https://example.com/";
set $img_url "/img/";
...
}
server {
listen 80;
server_name example.com;
#將請求重定向到默認(rèn)的ssl端口
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
...
location / {
#將請求代理到指定的upstream服務(wù)器,并使用參數(shù)變量
proxy_pass ${base_url}upstream;
...
}
location ~* \.(jpeg|jpg|png)$ {
#將匹配的文件類型保存到參數(shù)變量中,并使用參數(shù)變量
set $img_type $1;
...
add_header Content-Disposition "attachment; filename=${img_type}";
...
}
}
需要注意的是,由于使用set指令會(huì)增加Nginx的計(jì)算負(fù)擔(dān),因此在配置中不應(yīng)濫用。若使用過度,可能會(huì)導(dǎo)致性能下降或引用其他問題。
總的來說,Nginx的set指令可以用于創(chuàng)建自定義變量,將多個(gè)變量組合到一起生成一個(gè)新的變量,從而簡化配置文件。使用時(shí)應(yīng)當(dāng)根據(jù)具體情況謹(jǐn)慎使用。
map詳細(xì)用法
Nginx map指令用于根據(jù)一個(gè)或多個(gè)變量的值生成映射關(guān)系。它可以將一組固定的鍵值對組合為一個(gè)映射表,并在請求到達(dá)時(shí)使用當(dāng)前請求的變量值來查找相應(yīng)的映射值,并將其賦予一個(gè)新的變量。通過使用map指令,可以在處理請求之前將復(fù)雜的信息邏輯轉(zhuǎn)換為簡單的鍵值對。
map指令的語法如下:
map $variable {
key value;
key value;
...
default value;
}
其中,$variable是用于查找對應(yīng)映射值的變量名。{}內(nèi)用于定義鍵值對,每個(gè)鍵值對占一行,其中key為要匹配的值,value為匹配成功后要賦予變量的值。最后必須定義一個(gè)default值,當(dāng)所有key檢查完畢后,如果沒有匹配到任何值,則會(huì)使用default值。
下面是一個(gè)map指令的例子:
map $request_uri $my_variable {
"/foo" "foo";
"/bar" "bar";
"/baz" "baz";
default "nothing";
}
在這個(gè)例子中,由$request_uri
指定要匹配的變量名,當(dāng)$request_uri
的值為"/foo"、"/bar"、"/baz"時(shí),它們的值將被映射為相應(yīng)的"foo"、"bar"、"baz"字符串,并賦予$my_variable
變量。在所有匹配失敗的情況下,$my_variable
的默認(rèn)值為"nothing"。
map指令支持一些高級特性,例如可以使用正則表達(dá)式匹配變量值,使用命名分組;還可以使用include語句包含外部文件,從而方便地組織映射表內(nèi)容。
需要注意的是,由于map指令會(huì)增加Nginx的計(jì)算負(fù)擔(dān),因此在實(shí)際使用中,應(yīng)注意盡量優(yōu)化映射表和避免使用過度。此外,map指令只能在http、server和location塊內(nèi)使用,并且只有第一次使用時(shí)才能定義映射表。
總的來說,Nginx的map指令可以根據(jù)一個(gè)或多個(gè)變量的值生成映射關(guān)系,將復(fù)雜信息邏輯轉(zhuǎn)換為簡單的鍵值對。使用時(shí)應(yīng)當(dāng)注意優(yōu)化映射表和避免使用過度。
events模塊詳解
nginx中的events塊是一個(gè)必須的塊,用于配置全局的事件模型和一些系統(tǒng)相關(guān)的參數(shù)。下面是一個(gè)events塊的示例代碼和注解:
events {
# 設(shè)置worker進(jìn)程數(shù),建議設(shè)置為CPU個(gè)數(shù)的倍數(shù)
worker_processes 4;
# 每個(gè)worker進(jìn)程連接的最大數(shù)
worker_connections 1024;
# 使用epoll事件模型,也可以使用kqueue、eventport等
use epoll;
# 每個(gè)epoll調(diào)用可處理的最大連接數(shù),設(shè)為on可以提高性能
multi_accept on;
}
其中,注釋部分為對應(yīng)的配置項(xiàng)和解釋。需要注意的是,events塊中的參數(shù)并不是可選的,必須設(shè)置。下面是一些需要注意的要點(diǎn):
- worker_processes
該參數(shù)表示nginx要開啟多少個(gè)worker進(jìn)程。建議將其設(shè)置為CPU個(gè)數(shù)的倍數(shù),以充分利用系統(tǒng)的多核性能。
- worker_connections
該參數(shù)表示每個(gè)worker進(jìn)程可以同時(shí)處理的最大連接數(shù)。一般建議將其設(shè)置為最大并發(fā)請求數(shù)。
- use
該參數(shù)表示要使用哪種事件模型。常用的包括epoll、kqueue、eventport等。默認(rèn)為select。
epoll是Linux系統(tǒng)中的一個(gè)事件驅(qū)動(dòng)機(jī)制,當(dāng)有IO事件發(fā)生時(shí),它會(huì)通知應(yīng)用程序,從而減少了不必要的輪詢,并提高了性能。
而eventport是Solaris中的一種事件機(jī)制。無論是epoll還是eventport,它們都是異步I/O的核心組成部分。
- multi_accept
該參數(shù)表示每個(gè)epoll調(diào)用可以同時(shí)處理的最大連接數(shù)。如果設(shè)為on,可以提高性能。
總之,正確地配置events塊對于保證nginx的穩(wěn)定、高性能運(yùn)行非常重要。
http模塊詳解
在nginx的配置文件中,http塊是最頂層的塊,用于配置HTTP協(xié)議相關(guān)的選項(xiàng)和指令。下面是http塊的用法、示例代碼和注解:
用法:
http {
// 基本配置指令
...
server { // server塊配置
// server塊內(nèi)部配置指令
...
}
}
示例代碼:
http {
# 配置HTTP服務(wù)器
# 定義日志格式
log_format access '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
# 配置HTTP請求頭和HTTP響應(yīng)頭
include mime.types;
default_type application/octet-stream;
server_tokens off;
# 開啟gzip壓縮
gzip on;
# 配置HTTP請求限制
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
# 配置HTTP緩存
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
proxy_cache_key "$scheme$request_method$host$request_uri";
# 配置HTTP反向代理
upstream backend {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
limit_req zone=one burst=10 nodelay;
}
}
# 配置HTTP服務(wù)器的其他選項(xiàng)
keepalive_timeout 65;
}
注解:
-
include
用來引入其他配置文件,此處引入了mimetypes.types文件,用于設(shè)置HTTP請求頭和HTTP響應(yīng)頭。 -
default_type
用來設(shè)置默認(rèn)的mime類型,如果在mimetypes.types文件中找不到對應(yīng)的類型,則會(huì)使用此處設(shè)置的類型。 -
server_tokens
用來控制是否將nginx的版本信息在HTTP響應(yīng)頭中顯示,此處為關(guān)閉。 -
gzip
:開啟gzip壓縮,減小傳輸文件大小,提高文件傳輸速度。 -
limit_req_zone
用來設(shè)置請求限制,該例子中設(shè)置了一個(gè)一秒鐘只能有一次請求的限制。 -
proxy_cache_path
用于配置緩存目錄和相關(guān)參數(shù)。 -
upstream
定義了一個(gè)upstream的集群,用于反向代理。 -
server
定義了一個(gè)HTTP服務(wù)器,監(jiān)聽80端口,并將指定的域名與upstream集群關(guān)聯(lián)起來。 -
proxy_pass
配置反向代理,將請求轉(zhuǎn)發(fā)到指定服務(wù)器。 -
proxy_cache
用于指定使用的緩存zone。 -
proxy_set_header
用于設(shè)置HTTP請求頭。 -
limit_req
用于限制請求頻率,該例子中設(shè)置了限制為一秒鐘最多處理10個(gè)請求,超過則拒絕處理。 -
root
:指定網(wǎng)站的根目錄。 -
index
:指定默認(rèn)訪問的頁面。 -
location
:針對特定的URI,可以配置子句,如try_files、proxy_set_header、proxy_pass等。其中用/表示網(wǎng)站的根路徑,默認(rèn)不需要配置。
除了以上配置選項(xiàng),http塊還支持其他選項(xiàng),如ssl等。配置http塊后,需要通過nginx -t命令檢查配置文件是否正確,并通過nginx -s reload命令重新加載配置文件。
server模塊詳解
在Nginx的配置文件中,server塊用于定義一個(gè)虛擬主機(jī)(Virtual Host),它包含了該虛擬主機(jī)所需要的所有配置信息,例如監(jiān)聽的端口、域名、TLS證書、反向代理等等。
示例代碼:
server {
listen 80; # 監(jiān)聽端口
server_name example.com; # 域名
root /var/www/example.com; # 網(wǎng)站根目錄
index index.html index.htm; # 默認(rèn)文檔
location / {
try_files $uri $uri/ /index.html; # 請求的資源不存在時(shí),返回index.html頁面
}
location /images/ {
deny all; # 禁止外部直接訪問該目錄下的文件
}
location /api/ {
proxy_pass http://127.0.0.1:8000; # 將/api/請求反向代理到本地的8000端口
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.(gif|jpg|png)$ {
expires 1d; # 圖片緩存時(shí)間為1天
}
}
注解:
listen
:定義該虛擬主機(jī)監(jiān)聽的端口,多個(gè)端口可以用空格分隔。例如listen 80;
表示該虛擬主機(jī)監(jiān)聽端口為80。server_name
:定義該虛擬主機(jī)對應(yīng)的域名。例如server_name example.com;
表示該虛擬主機(jī)應(yīng)對請求的域名為example.com。root
:定義該虛擬主機(jī)的網(wǎng)站根目錄。例如root /var/www/example.com;
表示該虛擬主機(jī)對應(yīng)的站點(diǎn)根目錄為/var/www/example.com。index
:定義該虛擬主機(jī)的默認(rèn)文檔。例如index index.html index.htm;
表示該虛擬主機(jī)默認(rèn)顯示index.html或index.htm頁面。location
:定義該虛擬主機(jī)對請求的URL路徑匹配規(guī)則和配置信息。try_files
:在當(dāng)前l(fā)ocation中匹配的所有URI都無法找到時(shí),Nginx會(huì)一次嘗試它們,處理第一個(gè)匹配并未在文件系統(tǒng)上找到的 URI。deny all
:禁止外部直接訪問該目錄下的文件。proxy_pass
:將請求反向代理到本地的具體端口。例如proxy_pass http://127.0.0.1:8000;
表示該虛擬主機(jī)對/api/請求的反向代理到本機(jī)的8000端口。error_page
:定義錯(cuò)誤頁面,例如404.html和50x.html。location = /50x.html
:匹配URL路徑為/50x.html的請求,返回/usr/share/nginx/html目錄下的50x.html頁面。expires
:定義該虛擬主機(jī)的緩存時(shí)間。例如expires 1d;
表示該虛擬主機(jī)對圖片的緩存時(shí)間為1天。
在Nginx的配置文件中,可以有多個(gè)server塊,每個(gè)塊都對應(yīng)一個(gè)虛擬主機(jī)。當(dāng)有請求到達(dá)Nginx時(shí),Nginx會(huì)根據(jù)請求所指定的域名,找到對應(yīng)的server塊,并將請求轉(zhuǎn)發(fā)到該虛擬主機(jī)配置所指定的處理方式。
root和alias的區(qū)別
root
和 alias
都是 Nginx 中用來指定靜態(tài)文件根目錄的指令,但它們的用法和效果是不同的。
root
root
指令用于指定 Nginx 服務(wù)器的主機(jī)根目錄,即靜態(tài)文件存放的根目錄,例如:
server {
listen 80;
server_name example.com;
root /var/www/html;
...
}
上面的配置中,訪問 example.com 的請求會(huì)被映射到 /var/www/html
目錄,Nginx 會(huì)在該目錄下尋找網(wǎng)站需要的靜態(tài)資源。
如果 URL 中包含路徑,Nginx 會(huì)將路徑追加到 root
指定的根目錄后面。例如,請求 http://example.com/static/img/logo.png
會(huì)被映射到 /var/www/html/static/img/logo.png
文件。
alias
alias
指令用于指定某個(gè) URI 映射到服務(wù)器本地的一個(gè)實(shí)際路徑,例如:
location /static/ {
alias /var/www/static/;
...
}
上面的規(guī)則將所有以 /static/
開頭的請求映射到 /var/www/static/
目錄下,例如請求 http://example.com/static/img/logo.png
會(huì)被映射到 /var/www/static/img/logo.png
文件。
注意事項(xiàng)
使用 root
指令時(shí),URI 中的路徑會(huì)被添加到指定的根目錄后面,并作為訪問文件的完整路徑。因此,你需要確保每個(gè)目錄都存在于正確的位置,否則會(huì)出現(xiàn)404錯(cuò)誤。
使用 alias
指令時(shí),URI 中的部分路徑會(huì)被替換成實(shí)際的文件路徑,因此你需要確保別名路徑的設(shè)置是正確的,否則會(huì)出現(xiàn)404錯(cuò)誤。此外,在使用 alias
指令時(shí),還需要注意下面一些事項(xiàng):
-
alias
路徑末尾一定要加上/
,否則可能出現(xiàn)404錯(cuò)誤。 - 需要修改
location
塊內(nèi)的try_files
指令,指定正確的文件訪問路徑。 - 使用
alias
指令時(shí),相對路徑和絕對路徑的行為是不同的。如果 alias 路徑是到上級目錄或者相對路徑,那么就需要在指令末尾加上斜杠(/)。
與 root
不同的是,使用 alias
指令可以將 URI 指向任意目錄,而不僅僅是指向 root
指定的根目錄。同時(shí),使用 alias
指令也可以避免 URI 路徑與服務(wù)器路徑的混淆問題。
總之,root
和 alias
都是用于指定靜態(tài)文件根目錄的指令,但它們的區(qū)別在于 root
只有一個(gè)根目錄,而 alias
可以為不同 URI 指向不同的目錄,并且在處理帶有路徑的 URI 時(shí),兩者的行為也是不同的。通過使用 alias
指令,可以輕松為不同的 URI 指向不同的目錄,提高 Nginx 的靈活性和擴(kuò)展性。
location模塊詳解
Nginx中的location指令用于匹配URI,以便能夠在不同的配置塊中應(yīng)用不同的指令集。在location中使用不同的匹配規(guī)則能夠達(dá)到不同的目的,比如反向代理、負(fù)載均衡、靜態(tài)資源處理等。
以下是location指令的語法格式:
location [區(qū)分大小寫][ = | ~ | ~* | ^~ ] uri {
...
}
其中:
- 精確匹配:在location指令的URI前面使用“=”,表示精確匹配:
location = /login {
...
}
- 前綴匹配:在location指令的URI前面使用“^~”,表示前綴匹配:
location ^~ /images/ {
...
}
- 區(qū)分大小寫:在location指令的URI前面使用“~”,表示區(qū)分大小寫:
location ~ /blog {
...
}
- 不區(qū)分大小寫:在location指令的URI前面使用“~*”,表示不區(qū)分大小寫:
location ~* \.(gif|jpg|jpeg)$ {
...
}
下面分別給出這些不同匹配規(guī)則的說明注釋、示例代碼以及優(yōu)先級。
精確匹配
精確匹配使用“=”符號,表示只有URI完全匹配時(shí)才會(huì)執(zhí)行指定的location塊中的指令,這種方式的匹配優(yōu)先級最高。
示例代碼:
location = /login {
proxy_pass http://127.0.0.1:8080/login;
}
此時(shí),只有URI為“/login”的請求才會(huì)被匹配到這個(gè)location塊中。
前綴匹配
前綴匹配使用“^~”符號,表示只有當(dāng)URI以指定的前綴開頭時(shí)才會(huì)執(zhí)行指定的location塊中的指令,這種方式的匹配優(yōu)先級比正則匹配高。
示例代碼:
location ^~ /static/ {
root /var/www;
}
此時(shí),所有以“/static/”開頭的URI都將被匹配到這個(gè)location塊中。
正則匹配(區(qū)分大小寫)
區(qū)分大小寫的正則匹配使用“~”符號,表示只有符合正則表達(dá)式的URI才會(huì)被匹配到這個(gè)location塊中。
示例代碼:
location ~ /blog/post/\d+ {
root /var/www/blog/;
}
此時(shí),所有形如“/blog/post/”+一個(gè)或多個(gè)數(shù)字的URI都將被匹配到這個(gè)location塊中。
正則匹配(不區(qū)分大小寫)
不區(qū)分大小寫的正則匹配使用“~*”符號,表示只有符合正則表達(dá)式的URI才會(huì)被匹配到這個(gè)location塊中,這種方式的匹配優(yōu)先級最低。
示例代碼:
location ~* \.(gif|jpg|jpeg)$ {
root /var/www/images/;
}
此時(shí),所有以“gif”、“jpg”或“jpeg”結(jié)尾的URI都將被匹配到這個(gè)location塊中。
最優(yōu)匹配
location / {
# 此處為默認(rèn)匹配規(guī)則,將所有無法匹配到以上 URI 的請求均指向 index.html
try_files $uri $uri/ /index.html;
}
總結(jié):
location模塊是Nginx用來匹配URL路徑的模塊之一,其匹配規(guī)則和優(yōu)先級如下:
精確匹配:當(dāng)location模塊的模式為一個(gè)完整的URI時(shí),只有完全匹配該URI時(shí)才會(huì)執(zhí)行該location塊中的指令,其優(yōu)先級最高。
前綴匹配:如果location塊的模式?jīng)]有以“= ”開始,而是以"^~"或者“/”開始,則表示該location塊的模式為一個(gè)前綴字符串。當(dāng)請求的URI與該前綴字符串匹配時(shí),將會(huì)執(zhí)行該location塊中的指令,如果URI匹配多個(gè)前綴字符串,則選擇最長匹配的前綴字符串,其優(yōu)先級次于精確匹配。
正則匹配:當(dāng)location塊的模式為一個(gè)正則表達(dá)式時(shí),如果請求的URI與該正則表達(dá)式匹配,則會(huì)執(zhí)行該location塊中的指令。如果多個(gè)location塊的正則表達(dá)式都能匹配請求的URI,則選擇第一個(gè)匹配成功的location塊,其優(yōu)先級低于前綴匹配。
最優(yōu)匹配:當(dāng)location塊的模式為“/”時(shí),表示匹配所有請求,但是其優(yōu)先級最低,只有當(dāng)前面的三種匹配方式都無法匹配該請求時(shí),才會(huì)執(zhí)行該location塊中的指令。
需要注意的是,如果多個(gè)location塊都匹配當(dāng)前請求的URI,那么只會(huì)執(zhí)行其中優(yōu)先級最高的那個(gè)location塊中的指令;如果兩個(gè)location塊的優(yōu)先級相等,則選擇前面的location塊。
可以看出,Nginx的location指令可以通過不同的匹配規(guī)則,實(shí)現(xiàn)對不同URI的處理。匹配規(guī)則之間的優(yōu)先級是從高到低的精確匹配 > 前綴匹配 > 正則匹配(區(qū)分大小寫)> 正則匹配(不區(qū)分大小寫)> 最優(yōu)匹配最后。根據(jù)不同的需求進(jìn)行選擇,可以最大限度地提高Nginx的性能和效率。
proxy模塊
在Nginx中使用proxy模塊可以實(shí)現(xiàn)反向代理的功能,即將客戶端的請求轉(zhuǎn)發(fā)到后端服務(wù)器進(jìn)行處理,并將后端服務(wù)器返回的響應(yīng)返回給客戶端。
proxy模塊提供了以下常用的指令:
- proxy_pass:設(shè)置反向代理的目標(biāo)服務(wù)器地址,可以是IP地址或域名,支持http、https、fastcgi、uwsgi、scgi等協(xié)議。實(shí)現(xiàn)反向代理的核心指令。
- proxy_set_header:設(shè)置向后端服務(wù)器發(fā)送的HTTP請求頭信息。可以設(shè)置多個(gè)header信息,如Host、User-Agent、Referer等。
- proxy_connect_timeout:設(shè)置連接后端服務(wù)器的超時(shí)時(shí)間。
- proxy_read_timeout:設(shè)置從后端服務(wù)器讀取響應(yīng)數(shù)據(jù)的超時(shí)時(shí)間。
- proxy_send_timeout:設(shè)置向后端服務(wù)器發(fā)送請求的超時(shí)時(shí)間。
- proxy_buffering:開啟或關(guān)閉代理服務(wù)器對后端服務(wù)器的響應(yīng)緩存。如果開啟,則需要配合proxy_buffer_size和proxy_buffers指令來控制緩存大小。
- proxy_cache:開啟或關(guān)閉代理服務(wù)器對后端服務(wù)器響應(yīng)的緩存。如果開啟,則需要配合proxy_cache_path指令來設(shè)置緩存路徑和緩存參數(shù)。
- proxy_redirect:配置代理服務(wù)器對后端服務(wù)器響應(yīng)的重定向規(guī)則。
下面是一個(gè)簡單的反向代理示例,將客戶端請求轉(zhuǎn)發(fā)到后端服務(wù)器進(jìn)行處理,然后將后端服務(wù)器返回的響應(yīng)返回給客戶端:
server {
listen 80;
server_name example.com;
location /api {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- 通過listen指令設(shè)置端口號為80。
- 通過server_name指令設(shè)置主機(jī)名為example.com。
- 通過location指令匹配請求的uri為
/api
,并將這個(gè)uri轉(zhuǎn)發(fā)到后端服務(wù)器http://backend_server
進(jìn)行處理。 - 通過proxy_set_header指令,將客戶端的Host、X-Real-IP、X-Forwarded-For信息發(fā)送給后端服務(wù)器。
- 注意:如果你的代理服務(wù)器沒有權(quán)限訪問到后端服務(wù)器,nginx將返回502 Bad Gateway 或者504 Gateway Timeout 錯(cuò)誤。此時(shí)需要檢查代理服務(wù)器是否與后端服務(wù)器的網(wǎng)絡(luò)環(huán)境通暢。
upstream模塊
在 Nginx 配置文件中,upstream 模塊用于定義一組后端服務(wù)或服務(wù)器的列表,可以用來負(fù)載均衡和故障轉(zhuǎn)移。以下是upstream配置塊的示例代碼以及注解:
upstream backend {
# 定義一組名為backend的后端服務(wù)器列表
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
# 默認(rèn)的算法為輪詢,其他算法包括ip_hash、random、least_conn和hash等
# ip_hash:根據(jù)客戶端IP地址進(jìn)行哈希的負(fù)載均衡算法;
# keepalive:啟用長連接,提高傳輸效率;
# max_fails:表示最大失敗次數(shù);
# fail_timeout:表示斷開連接的時(shí)間間隔;
# backup:表示備用服務(wù)器。
# 關(guān)于各個(gè)算法的詳細(xì)說明可以參考官方文檔:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
# 也可以在server配置中單獨(dú)指定,如:server backend1 weight=5 max_fails=3 fail_timeout=10s;
# 其中weight表示權(quán)重,max_fails和fail_timeout用于故障轉(zhuǎn)移的判斷,weight越大的后端服務(wù)器,獲取的請求越多
# max_fails表示在fail_timeout時(shí)間內(nèi)出現(xiàn)的最大失敗次數(shù)
# fail_timeout表示在被標(biāo)記為失敗之前的時(shí)間,出現(xiàn)的最大失敗次數(shù),當(dāng)一個(gè)后端服務(wù)器被標(biāo)記為失敗時(shí),不再把請求負(fù)載給它,直到過了fail_timeout時(shí)間,如果一個(gè)后端服務(wù)器被標(biāo)記為失敗,但是在fail_timeout時(shí)間內(nèi)又恢復(fù)了正常那么它將重新參與負(fù)載均衡
# 如果所用的算法是ip_hash,則會(huì)根據(jù)客戶端IP地址的HASH值來選擇后端服務(wù)器,這樣可以保證同一客戶端的請求會(huì)被轉(zhuǎn)發(fā)到同一臺(tái)后端服務(wù)器上
# 自動(dòng)發(fā)現(xiàn)的機(jī)制:添加了一個(gè)新的后端服務(wù)器或失去聯(lián)系的服務(wù)器在指定時(shí)間內(nèi)自動(dòng)被刪除,默認(rèn)值:10秒
# 還有一個(gè)keepalive機(jī)制,用于復(fù)用后端連接,減少建立連接的開銷
# 可以在http塊中定義默認(rèn)的參數(shù)
# keepalive 8;
# keepalive_timeout表示保持連接時(shí)間(默認(rèn)75秒)
# keepalive_requests表示單個(gè)連接最大請求數(shù)(默認(rèn)100)
# 這些參數(shù)可以通過nginx -V命令查看
# 可以為每個(gè)upstream塊單獨(dú)指定一組參數(shù)
# 如:upstream backend {
# keepalive 64;
# keepalive_timeout 65s;
# keepalive_requests 100;
# }
# 如果沒有指定,則沿用http塊中的參數(shù)
}
在實(shí)際應(yīng)用中,我們可以通過在 server 配置中引用 upstream 名稱來使用上面定義的后端服務(wù)器列表,實(shí)現(xiàn)負(fù)載均衡和故障轉(zhuǎn)移。
示例代碼:
http {
upstream backend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend;
# 將客戶端的請求轉(zhuǎn)發(fā)到backend定義的一組后端服務(wù)器中的一個(gè)
# 如果其中某個(gè)后端服務(wù)器標(biāo)記為失敗,則會(huì)選擇其他可用的后端服務(wù)器
}
}
}
rewrite指令詳解
在Nginx中,rewrite塊是一種用于重寫URL的指令。它可以讓URL匹配一個(gè)正則表達(dá)式,并按照一定規(guī)則重寫URL。下面是rewrite塊的詳細(xì)用法、示例代碼和注解。
語法
rewrite regex replacement [flag];
regex
:正則表達(dá)式,用于匹配需要被重寫的URL。
replacement
:重寫規(guī)則,在匹配成功后,將被替換的URL。
flag
:可選的標(biāo)志,用于指定rewrite行為的不同方面。
示例代碼
location /new-location/ {
rewrite ^/new-location/(.*)$ /old-location/$1 break;
}
這段代碼中,定義了一個(gè)名為 /new-location/
的 location 塊,用于對該頁面的請求進(jìn)行處理。其中,使用了 rewrite 指令對請求的 URI 進(jìn)行了修改。
^/new-location/(.*)$
表示使用正則表達(dá)式匹配 URI,其中 ^
和 $
表示匹配起始和結(jié)束位置,/new-location/
表示匹配 URI 的開頭部分,(.*)
表示匹配 URI 的其余部分,并將匹配結(jié)果存儲(chǔ)在變量 $1 中。
/old-location/$1
表示將匹配到的 URI 的其余部分添加在 /old-location/
后,結(jié)果作為修改后的 URI。
break 參數(shù)表示在重寫 URI 之后停止處理當(dāng)前請求,不再繼續(xù)執(zhí)行下面的 location 指令。
因此,對于請求 /new-location/path/to/resource
,會(huì)被重寫為 /old-location/path/to/resource
。
需要注意的是,rewrite 指令可以出現(xiàn)在 server、location 等塊中,也可以使用 flag 參數(shù)來控制重寫行為,如 last、redirect 等。其中,last 表示在進(jìn)行 URI 重寫之后,重新開始新一輪的 URI 處理,而 redirect 表示將這個(gè)請求重定向到另一個(gè) URL。
rewrite可選參數(shù)詳解
在nginx的rewrite模塊中,有幾個(gè)常用的參數(shù),包括:
-
break
:停止執(zhí)行當(dāng)前的rewrite指令集,然后開始執(zhí)行下一個(gè)指令集; -
last
:停止執(zhí)行當(dāng)前的rewrite指令集,然后重新執(zhí)行nginx的location匹配; -
redirect
:發(fā)送302臨時(shí)重定向狀態(tài)碼; -
permanent
:發(fā)送301永久重定向狀態(tài)碼。
下面我們解釋一下它們之間的區(qū)別:
-
break
:停止執(zhí)行當(dāng)前的rewrite指令集,但是不對uri進(jìn)行重定向,nginx將繼續(xù)執(zhí)行下一條指令。使用這個(gè)指令通常是為了防止uri被重寫多次。
示例代碼:
location /admin/ {
rewrite ^(/admin)(.*)$ $1/index.html break;
proxy_pass http://backend/;
}
在這個(gè)例子中,如果uri匹配到/admin/,則將/admin/重寫為/admin/index.html,然后繼續(xù)執(zhí)行proxy_pass指令。
-
last
:停止執(zhí)行當(dāng)前的rewrite指令集,重新執(zhí)行nginx的location匹配,即再次進(jìn)入location塊中查找匹配的uri,并將uri放入到新的指令集中執(zhí)行。使用這個(gè)指令可以實(shí)現(xiàn)在rewrite過程中動(dòng)態(tài)改變uri或指定新的location處理請求。
示例代碼:
location /old/ {
rewrite ^/old/(.*)$ /new/$1 last;
}
location /new/ {
proxy_pass http://backend/;
}
在這個(gè)例子中,如果uri匹配到/old/
,則將/old/
后的內(nèi)容重寫為/new/
后的內(nèi)容,然后重新匹配uri,進(jìn)入到/new/
的location塊中繼續(xù)處理請求。
-
redirect
:發(fā)送302臨時(shí)重定向狀態(tài)碼,將客戶端的請求重定向到新的uri,客戶端會(huì)發(fā)送新的請求。使用這個(gè)指令可以實(shí)現(xiàn)uri重定向,但不會(huì)改變?yōu)g覽器的地址欄。
示例代碼:
rewrite ^/login$ /user/login.html redirect;
在這個(gè)例子中,如果uri匹配到/login
,將發(fā)送302臨時(shí)重定向狀態(tài)碼,將客戶端重定向到/user/login.html
。
-
permanent
:發(fā)送301永久重定向狀態(tài)碼,將客戶端的請求永久重定向到新的uri,客戶端會(huì)發(fā)送新的請求。使用這個(gè)指令可以實(shí)現(xiàn)uri重定向,并且會(huì)改變?yōu)g覽器的地址欄。
示例代碼:
rewrite ^/old/(.*)$ /new/$1 permanent;
在這個(gè)例子中,如果uri匹配到/old/
后面跟著任意字符,將發(fā)送301永久重定向狀態(tài)碼,將客戶端重定向到/new/
后面跟著同樣的任意字符。
access模塊
nginx access模塊用于控制客戶端請求的訪問權(quán)限。通過配置,可以限制只有指定的IP地址或CIDR的請求才能夠被處理,而其它請求則會(huì)被拒絕。
該模塊的用法非常靈活,可以在全局作用域、server作用域或location作用域下使用。以下是詳細(xì)的用法說明:
全局作用域
在nginx配置文件的全局作用域中使用access模塊,會(huì)將其作用于所有server模塊和location模塊。示例代碼如下:
http {
...
# 訪問控制配置
include /path/to/access.conf;
...
}
其中,access.conf是一個(gè)單獨(dú)的配置文件,該文件中包含了一些access模塊的具體配置。在這個(gè)文件中,可以使用allow和deny指令來進(jìn)行IP地址的訪問控制。
server作用域
在server作用域中使用access模塊,可以針對指定的server塊進(jìn)行訪問控制。示例代碼如下:
server {
listen 80;
server_name example.com;
...
# 訪問控制配置
allow 192.168.1.0/24;
deny all;
...
}
在這個(gè)配置中,只有192.168.1.0/24網(wǎng)段的IP地址可以訪問example.com域名下的資源,其它IP地址則會(huì)被拒絕。
location作用域
在location作用域中使用access模塊,可以針對特定的URL路徑進(jìn)行訪問控制。示例代碼如下:
location /admin/ {
# 訪問控制配置
allow 192.168.1.100;
deny all;
...
}
在這個(gè)配置中,只有192.168.1.100的IP地址可以訪問/admin/路徑下的資源,其它IP地址則會(huì)被拒絕。
基于以上示例代碼,下面詳細(xì)解釋access模塊中各個(gè)指令的含義和用法:
allow指令
allow指令表示允許指定的IP地址或CIDR進(jìn)行訪問。該指令可以配置多個(gè)IP地址或CIDR,用空格隔開。示例代碼如下:
allow 192.168.1.100;
allow 10.0.0.0/24;
以上配置表示允許192.168.1.100和10.0.0.0/24網(wǎng)段下的IP地址進(jìn)行訪問。
需要注意的是,如果同時(shí)配置了多個(gè)allow指令,那么所有指令的效果會(huì)疊加。也就是說,如果有任意一個(gè)allow指令允許了該IP訪問,那么該IP就可以訪問資源。
deny指令
deny指令表示禁止指定的IP地址或CIDR進(jìn)行訪問。該指令的用法和allow指令類似,示例代碼如下:
deny 192.168.1.0/24;
deny 10.0.0.100;
以上配置表示禁止192.168.1.0/24網(wǎng)段下的IP地址和10.0.0.100的IP地址進(jìn)行訪問。
需要注意的是,deny指令的優(yōu)先級高于allow指令。也就是說,如果一個(gè)IP地址既符合allow指令的配置,又符合deny指令的配置,那么該IP地址將被拒絕訪問。
all指令
all指令表示允許或禁止所有IP地址進(jìn)行訪問。該指令和allow和deny指令搭配使用,示例代碼如下:
allow all;
den all;
以上配置分別表示允許或禁止所有IP地址進(jìn)行訪問。
需要注意的是,all指令在deny指令中的優(yōu)先級高于allow指令。也就是說,如果同時(shí)配置了allow all和deny all指令,那么所有IP地址都會(huì)被拒絕訪問。
綜上所述,access模塊是nginx中非常常用的一個(gè)模塊,可以幫助管理員實(shí)現(xiàn)靈活的訪問控制策略。需要根據(jù)實(shí)際場景進(jìn)行配置,具體使用時(shí)請參考以上示例代碼。
include模塊
在Nginx的配置文件中,include模塊可以讓我們將多個(gè)配置文件分開管理,便于閱讀和維護(hù)。下面是include模塊的詳細(xì)用法、示例代碼以及注解:
- 用法:包含指定的文件,實(shí)現(xiàn)配置文件的模塊化管理。
#示例配置代碼
http {
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
}
使用 include 引入的文件格式要求和 nginx 配置文件格式一致,即每條指令以分號結(jié)尾,每段配置以大括號包圍。同時(shí),需要注意避免在 included 文件中重復(fù)定義已有的指令,以免引起配置不一致的問題。
- 示例代碼:
我們的Nginx服務(wù)器可能需要配置多個(gè)虛擬主機(jī),并且每個(gè)虛擬主機(jī)都有一些共同的配置,同時(shí)還有針對不同虛擬主機(jī)的獨(dú)特的配置。這時(shí)可以使用include模塊來將共同的配置和不同的配置分開管理。
例如,我們可以將共同的配置放在一個(gè)文件中,比如common.conf:
# common.conf
listen 80;
location / {
try_files $uri $uri/ =404;
}
接著,在每個(gè)虛擬主機(jī)的配置文件中,我們可以使用include指令來引入common.conf,然后再進(jìn)行獨(dú)特的配置:
# site1.conf
server {
server_name site1.com;
include common.conf;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
# site2.conf
server {
server_name site2.com;
include common.conf;
root /var/www/site2;
index index.html;
}
在這個(gè)配置中,我們通過include指令將common.conf引入到每個(gè)虛擬主機(jī)的配置文件中,從而避免了重復(fù)的配置。同時(shí),我們還可以在不同的配置文件中添加獨(dú)特的配置,確保不同的虛擬主機(jī)能夠按照自己的需求工作。
- 注解:
在上面的例子中,我們可以發(fā)現(xiàn)include指令同樣可以用來引入Nginx的其他配置文件,比如mime.types(定義MIME類型)、fastcgi.conf(定義FastCGI參數(shù))等。使用include模塊可以讓我們更方便地管理Nginx的配置文件,而不需要將所有的配置都寫在同一個(gè)文件中,從而大大提高了可讀性和可維護(hù)性。
ssl模塊
nginx的ssl模塊用于啟用HTTPS協(xié)議,配置SSL/TLS加密,以保護(hù)網(wǎng)站的安全性。以下是ssl模塊的詳細(xì)用法、示例代碼和注解:
# 配置nginx使用的SSL證書和私鑰
ssl_certificate /path/to/ssl.crt;
ssl_certificate_key /path/to/ssl.key;
# 配置ssl協(xié)議和加密算法
ssl_protocols TLSv1.2 TLSv1.3; # 指定支持的TLS/SSL協(xié)議版本
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; # 配置加密算法
ssl_prefer_server_ciphers on; # 指定使用服務(wù)器端選擇的加密算法
# 配置SSL會(huì)話緩存
ssl_session_cache shared:SSL:10m; # 指定緩存大小和名稱
ssl_session_timeout 5m; # 指定緩存過期時(shí)間
# 配置ssl安全相關(guān)選項(xiàng)
ssl_stapling on; # 開啟OCSP狀態(tài)響應(yīng)
ssl_stapling_verify on; # 驗(yàn)證OCSP響應(yīng)的有效性
ssl_trusted_certificate /path/to/trust.crt; # 配置CA證書用于驗(yàn)證客戶端證書
# 配置ssl代理相關(guān)選項(xiàng)
proxy_ssl_server_name on; # 開啟SSL Server Name Indication
proxy_ssl_session_reuse on; # 開啟SSL會(huì)話重用
proxy_ssl_protocols TLSv1.2 TLSv1.3; # 配置支持的協(xié)議版本
# 配置ssl客戶端證書認(rèn)證
ssl_client_certificate /path/to/ca.crt; # 配置CA證書
ssl_verify_client on; # 開啟客戶端證書認(rèn)證
ssl_verify_depth 2; # 配置驗(yàn)證鏈最大深度
# 配置ssl限速
limit_rate 100k; # 指定限速速率
limit_rate_after 5m; # 指定限速開始時(shí)間
注解:
- ssl_certificate和ssl_certificate_key分別配置SSL證書和私鑰。
- ssl_protocols和ssl_ciphers:分別配置支持的SSL/TLS協(xié)議版本和加密算法。
- ssl_prefer_server_ciphers指定是否使用服務(wù)器端選擇的加密算法。
- ssl_session_cache和ssl_session_timeout分別配置SSL會(huì)話緩存大小和過期時(shí)間。
- ssl_stapling開啟OCSP狀態(tài)響應(yīng),ssl_stapling_verify驗(yàn)證OCSP響應(yīng)的有效性。
- ssl_trusted_certificate配置CA證書用于驗(yàn)證客戶端證書。
- proxy_ssl_server_name開啟SSL Server Name Indication(SNI),proxy_ssl_session_reuse開啟SSL會(huì)話重用,proxy_ssl_protocols配置支持的協(xié)議版本。
- ssl_client_certificate配置CA證書,ssl_verify_client開啟客戶端證書認(rèn)證,ssl_verify_depth配置驗(yàn)證鏈的最大深度。
- limit_rate和limit_rate_after配置SSL限速。
gzip模塊
在nginx的配置文件中,可以使用gzip模塊來開啟gzip壓縮功能,從而減少傳輸數(shù)據(jù)的大小,提升網(wǎng)站的性能和響應(yīng)速度。
以下是幾個(gè)gzip參數(shù)的說明
- gzip_types:指定需要使用gzip算法壓縮的MIME類型,默認(rèn)是"text/html"。
- gzip_vary:告訴代理服務(wù)器使用gzip壓縮之后,要添加Vary: Accept-Encoding頭信息。
- gzip_proxied:指定啟用gzip壓縮的請求類型。
- gzip_comp_level:指定gzip壓縮的級別,壓縮級別越高,壓縮比例越高,耗時(shí)也會(huì)相應(yīng)變長,范圍是1-9(9最高)。
- gzip_buffers:設(shè)置壓縮緩沖區(qū)數(shù)量和大小。
- gzip_http_version:指定響應(yīng)的最小HTTP版本,如果比該版本低則不啟用壓縮。
- gzip_disable:禁用用戶代理,如某些舊版Internet Explorer瀏覽器,不支持gzip壓縮。
具體的用法如下
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;
其中,gzip指令開啟gzip壓縮功能,gzip_types指令指定需要壓縮的文件類型,gzip_min_length指令指定了最小壓縮文件大小。需要注意的是,gzip_types指令中指定的文件類型必須是MIME類型,格式為type/subtype,多個(gè)文件類型之間用空格分隔。
下面是一個(gè)具體的示例代碼:
http {
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_min_length 1024;
...
}
上述代碼中,我們開啟了gzip壓縮,并指定了需要壓縮的文件類型。對于大小小于1024字節(jié)的文件,nginx不會(huì)進(jìn)行g(shù)zip壓縮。
測試gzip模塊
可以使用curl命令來測試gzip模塊是否生效。具體命令是:
curl -I -H "Accept-Encoding: gzip" http://example.com
該命令將顯示HTTP響應(yīng)頭信息,包括Content-Encoding:gzip頭,表示已經(jīng)經(jīng)過gzip壓縮。
需要注意的是,開啟gzip壓縮功能需要消耗一定的CPU資源。因此,一般情況下建議只針對一些體積較大的靜態(tài)資源進(jìn)行g(shù)zip壓縮,以提升性能和響應(yīng)速度。同時(shí),也需要注意gzip壓縮并不是適用于所有情況,例如圖片、音視頻等二進(jìn)制文件可能并不適合壓縮。因此,在使用gzip壓縮時(shí),需要根據(jù)具體情況進(jìn)行調(diào)整和優(yōu)化。
geo模塊
NGINX Geo模塊是用于處理IP地址和地理位置信息的模塊,該模塊能夠根據(jù)IP地址的地理位置進(jìn)行條件分支控制,以便實(shí)現(xiàn)不同的請求轉(zhuǎn)發(fā)、限制訪問等功能。下面是一些示例代碼:
- 根據(jù)地理位置進(jìn)行請求轉(zhuǎn)發(fā)
# 定義一個(gè)geo變量,用來匹配地址對應(yīng)的地理位置,并分配一個(gè)默認(rèn)值
geo $region {
default unknown;
192.168.1.0/24 local;
172.16.0.0/12 internal;
10.0.0.0/8 internal;
180.169.0.0/16 china;
192.168.0.0/16 lan;
}
server {
listen 80;
server_name example.com;
location / {
# 根據(jù)$region匹配成功的值,進(jìn)行條件判斷并進(jìn)行相應(yīng)的請求轉(zhuǎn)發(fā)
if ($region = china) {
proxy_pass http://china_servers;
}
if ($region = internal) {
proxy_pass http://internal_servers;
}
if ($region = local) {
proxy_pass http://local_servers;
}
proxy_pass http://default_servers;
}
}
- 根據(jù)地理位置限制訪問
# 定義一個(gè)geo變量,用來匹配白名單的IP地址,分配一個(gè)默認(rèn)值為0
geo $white_list {
default 0;
180.169.0.0/16 1;
}
server {
listen 80;
server_name example.com;
# 如果$white_list匹配成功,則返回403錯(cuò)誤信息,否則正常進(jìn)行請求處理
if ($white_list) {
return 403;
}
}
以上示例代碼均是簡單的示例,實(shí)際應(yīng)用中還需要結(jié)合具體場景靈活運(yùn)用。
總結(jié)
本文詳細(xì)的介紹了nginx的安裝、常用模塊的配置以及用法,希望各位小伙伴看完這篇文章以后都能熟練使用nginx配置,如這篇文章對你有幫助,歡迎點(diǎn)贊收藏關(guān)注三連,以資鼓勵(lì),謝謝!
本文由mdnice多平臺(tái)發(fā)布