柚子快報(bào)激活碼778899分享:運(yùn)維 nginx全解
柚子快報(bào)激活碼778899分享:運(yùn)維 nginx全解
一、Nginx配置文件
1.1 主配置文件
主配置文件位置:nginx.conf
tip:安裝方式不同,路徑不同
#主配置文件格式
?
main block:主配置段,即全局配置段,對(duì)http,mail都有效
?
#配置Nginx服務(wù)器的事件模塊相關(guān)參數(shù)
events {
...
} ?
#http/https 協(xié)議相關(guān)配置段
http {
...
}
?
#默認(rèn)配置文件不包括下面兩個(gè)模塊
#mail 協(xié)議相關(guān)配置段
mail {
...
} ? ?
#stream 服務(wù)器相關(guān)配置段
stream {負(fù)載均衡
...
}
?
?
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
#編譯安裝nginx后,nginx.conf為例
1.2 子配置文件
子配置文件位置:conf.d/*.conf
tip:須在http模塊下添加include 子配置文件位置
http塊中可以包含多個(gè)子配置文件,常見(jiàn)的子配置文件
server塊:用于配置HTTP服務(wù)器的具體行為,包括監(jiān)聽(tīng)的端口、虛擬主機(jī)的配置、請(qǐng)求處理邏輯等。
location塊:用于指定不同URL請(qǐng)求的處理方式,例如靜態(tài)文件的服務(wù)、反向代理等。
upstream塊:用于配置反向代理的目標(biāo)服務(wù)器列表。
include指令:用于引入其他的子配置文件,可以將一些通用的配置項(xiàng)單獨(dú)放在一個(gè)文件中,然后通過(guò)include指令引入。
二、全局配置部分(調(diào)優(yōu))
2.1 修改啟動(dòng)的工作進(jìn)程數(shù)
通過(guò)使用 auto 參數(shù),Nginx 可以根據(jù)系統(tǒng)的負(fù)載情況智能地分配工作進(jìn)程,以提供更好的性能和資源利用率。
#修改主配置文件中的work_processes項(xiàng)
vim /apps/nginx/conf/nginx.conf
[root@localhost ~]# nginx -s reload
#重新加載配置文件
[root@localhost ~]# ps axo pid,cmd,psr,ni|grep nginx
13013 nginx: master process /apps ? 1 ? 0
13019 nginx: worker process ? ? ? ? 0 ? 0
13020 nginx: worker process ? ? ? ? 0 ? 0
13021 nginx: worker process ? ? ? ? 0 ? 0
13022 nginx: worker process ? ? ? ? 1 ? 0
13035 grep --color=auto nginx ? ? ? 0 ? 0
?
2.2 cpu與worker process綁定
在 Nginx 配置文件中,worker_cpu_affinity 指令用于控制 worker 進(jìn)程與 CPU 的親緣性(affinity)關(guān)系
?
[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
?
user nginx;
worker_processes auto;
worker_cpu_affinity 00000001 00000010;
#綁定到 第一 和 第二塊cpu上
error_log /var/log/nginx/error.log;
#指定錯(cuò)誤日志的路徑和文件名
?
[root@localhost ~]# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
?
2.3PID路徑修改
2.4 修改工作進(jìn)程的優(yōu)先級(jí)
工作進(jìn)程優(yōu)先級(jí),-20~19
[root@localhost ~]# nginx -s reload
[root@localhost ~]# ps axo pid,cmd,psr,ni|grep nginx|sort -n
13501 nginx: master process /apps ? 2 ? 0
14025 nginx: worker process ? ? ? ? 2 -20
14026 nginx: worker process ? ? ? ? 3 -20
14027 nginx: worker process ? ? ? ? 1 -20
14028 nginx: worker process ? ? ? ? 0 -20
14038 grep --color=auto nginx ? ? ? 3 ? 0
?
2.5 調(diào)試工作進(jìn)程打開(kāi)文件的數(shù)量
2.5.1 基本原理
所有worker進(jìn)程能打開(kāi)的文件數(shù)量上限,包括:Nginx的所有連接(例如與代理服務(wù)器的連接等),而不僅僅是與客戶端的連接,另一個(gè)考慮因素是實(shí)際的并發(fā)連接數(shù)不能超過(guò)系統(tǒng)級(jí)別的最大打開(kāi)文件數(shù)的限制.最好與ulimit -n 或者limits.conf的值保持一致,
2.5.2 配置過(guò)程
先修改主配置文件
vim /apps/nginx/conf/nginx.conf
#添加
worker_rlimit_nofile 65536
?
再修改系統(tǒng)默認(rèn)項(xiàng)
臨時(shí)修改:
ulimit -n 70000
#修改單個(gè)進(jìn)程能打開(kāi)的最大文件數(shù)為 70000
#僅應(yīng)用于當(dāng)前會(huì)話即不會(huì)永久修改限制
ulimit -a
#顯示當(dāng)前用戶的所有資源限制信息
[root@localhost ~]# ulimit -n 70000
[root@localhost ~]# ulimit -a
core file size ? ? ? ? (blocks, -c) 0
data seg size ? ? ? ? ? (kbytes, -d) unlimited
scheduling priority ? ? ? ? ? ? (-e) 0
file size ? ? ? ? ? ? ? (blocks, -f) unlimited
pending signals ? ? ? ? ? ? ? ? (-i) 7168
max locked memory ? ? ? (kbytes, -l) 64
max memory size ? ? ? ? (kbytes, -m) unlimited
open files ? ? ? ? ? ? ? ? ? ? (-n) 70000
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #默認(rèn)值為1024
pipe size ? ? ? ? ? (512 bytes, -p) 8
POSIX message queues ? ? (bytes, -q) 819200
real-time priority ? ? ? ? ? ? (-r) 0
stack size ? ? ? ? ? ? (kbytes, -s) 8192
cpu time ? ? ? ? ? ? ? (seconds, -t) unlimited
max user processes ? ? ? ? ? ? (-u) 7168
virtual memory ? ? ? ? (kbytes, -v) unlimited
file locks ? ? ? ? ? ? ? ? ? ? (-x) unlimited
?
永久修改:
vim /etc/security/limits.conf
#在最后加入
* ? ? ? ? ? ? ? soft ? core ? ? ? ? ? unlimited
* ? ? ? ? ? ? ? hard ? core ? ? ? ? ? unlimited
* ? ? ? ? ? ? ? soft ? nproc ? ? ? ? ? 1000000
* ? ? ? ? ? ? ? hard ? nproc ? ? ? ? ? 1000000
* ? ? ? ? ? ? ? soft ? nofile ? ? ? ? ?1000000
* ? ? ? ? ? ? ? hard ? nofile ? ? ? ? ?1000000
* ? ? ? ? ? ? ? soft ? memlock ? ? ? ? 32000
* ? ? ? ? ? ? ? hard ? memlock ? ? ? ? 32000
* ? ? ? ? ? ? ? soft ? msgqueue ? ? ? ?8192000
* ? ? ? ? ? ? ? hard ? msgqueue ? ? ? ?8192000
?
?
`nproc`(最大進(jìn)程數(shù)限制)的軟限制和硬限制都設(shè)置為 1000000,當(dāng)前用戶在單個(gè)會(huì)話中可以創(chuàng)建的最大進(jìn)程數(shù)為 1000000
?
`nofile`(打開(kāi)文件描述符限制)的軟限制和硬限制都設(shè)置為 1000000,這意味著當(dāng)前用戶在單個(gè)會(huì)話中可以使用的最大文件描述符數(shù)將被限制為 1000000。軟限制是軟性限制,用戶可以根據(jù)需要進(jìn)行調(diào)整,而硬限制是硬性限制,一旦設(shè)定,用戶無(wú)法超過(guò)該限制
?
`memlock`(鎖定內(nèi)存限制)的軟限制和硬限制都設(shè)置為 32000,這意味著當(dāng)前用戶在單個(gè)會(huì)話中可以鎖定的最大內(nèi)存量為 32000KB
?
`msgqueue`(消息隊(duì)列限制)的軟限制和硬限制都設(shè)置為 8192000,這意味著當(dāng)前用戶在單個(gè)會(huì)話中可以使用的最大消息隊(duì)列大小為 8192000字節(jié)
?
2.6 關(guān)閉master-worker工作模式(僅測(cè)試用)
master_process off|on;
#是否開(kāi)啟Nginx的master-worker工作模式,僅用于開(kāi)發(fā)調(diào)試場(chǎng)景,默認(rèn)為on
?
三、events部分
在Nginx的主配置文件中,events部分用于配置Nginx服務(wù)器的事件模塊相關(guān)參數(shù),控制Nginx服務(wù)器在處理連接請(qǐng)求時(shí)的行為。
常見(jiàn)的events配置參數(shù):
worker_connections:指定每個(gè)工作進(jìn)程可以同時(shí)處理的最大連接數(shù)。
multi_accept:指定是否一次接受多個(gè)連接。默認(rèn)情況下,Nginx在每個(gè)循環(huán)中只接受一個(gè)連接,但設(shè)置multi_accept為"on"后可以同時(shí)接受多個(gè)連接。
use:指定Nginx使用的事件模塊。常見(jiàn)的事件模塊有"epoll"、"kqueue"和"eventport"等。
#舉個(gè)例子
events {
? worker_connections 1024;
? multi_accept on;
? use epoll;
}
#指定了每個(gè)工作進(jìn)程可以處理的最大連接數(shù)為1024,啟用了多個(gè)連接同時(shí)接受,以及使用了epoll事件模塊
?
四、http設(shè)置 (重要)
4.1http部分詳解
include:引入其他配置文件,通常用于加載 MIME 類型配置文件。
default_type:指定默認(rèn)的 MIME 類型。
server:定義一個(gè)或多個(gè)虛擬主機(jī)。
listen:指定該虛擬主機(jī)監(jiān)聽(tīng)的端口。
server_name:指定域名,用于匹配請(qǐng)求的主機(jī)頭。
root:指定虛擬主機(jī)的根目錄。
location:用于匹配不同的 URL,并定義相關(guān)配置規(guī)則。
#基本格式
http {
...
... ?#各server的公共配置
server { ? ?#每個(gè)server用于定義一個(gè)虛擬主機(jī),第一個(gè)server為默認(rèn)虛擬服務(wù)器
...
}
server { ? ?
...
server_name ? #虛擬主機(jī)名
root ? ? #主目錄
alias ? ? #路徑別名
location [OPERATOR] URL { ? ? #指定URL的特性
...
if CONDITION {
...
}
}
}
}
?
#詳解
http {
? include ? ? ? mime.types; #導(dǎo)入支持的文件類型,是相對(duì)于/apps/nginx/conf的目錄
? default_type application/octet-stream; #除mime.types中文件類型外,設(shè)置其它文件默認(rèn)類型,訪問(wèn)其它類型時(shí)會(huì)提示下載不匹配的類型文件
#日志配置部分
? ?#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
? ?# ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" ' refer是跳轉(zhuǎn)的源地址,如果沒(méi)有跳轉(zhuǎn) 沒(méi)有refer
? ?# ? ? ? ? ? ? ? ? '"$http_user_agent" "$http_x_forwarded_for"';
? ?#access_log logs/access.log main;
#自定義優(yōu)化參數(shù)
? sendfile ? ? ? on;
? ?#tcp_nopush ? ? on; #在開(kāi)啟了sendfile的情況下,合并請(qǐng)求后統(tǒng)一發(fā)送給客戶端。
? ?#tcp_nodelay ? off; #在開(kāi)啟了keepalived模式下的連接是否啟用TCP_NODELAY選項(xiàng),當(dāng)為off時(shí),延遲0.2s發(fā)送,默認(rèn)On時(shí),不延遲發(fā)送,立即發(fā)送用戶響應(yīng)報(bào)文。
? ?#keepalive_timeout 0;
? keepalive_timeout ?65 65; #設(shè)置會(huì)話保持時(shí)間,第二個(gè)值為響應(yīng)首部:keepAlived:timeout=65,可以和第一個(gè)值不同
? ?#gzip on; #開(kāi)啟文件壓縮
? server {
? ? ? listen ? ? ? 80; #設(shè)置監(jiān)聽(tīng)地址和端口
? ? ? server_name localhost; #設(shè)置server name,可以以空格隔開(kāi)寫(xiě)多個(gè)并支持正則表達(dá)式,如:*.kgc.com www.kgc.* ~^www\d+\.kgc\.com$ default_server
? ? ? ?#charset koi8-r; #設(shè)置編碼格式,默認(rèn)是俄語(yǔ)格式,建議改為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; #定義錯(cuò)誤頁(yè)面
? ? ? location = /50x.html {
? ? ? ? ? root ? html;
? ? ? }
? ? ? ?# proxy the PHP scripts to Apache listening on 127.0.0.1:80
? ? ? ?#
? ? ? ?#location ~ \.php$ { #以http的方式轉(zhuǎn)發(fā)php請(qǐng)求到指定web服務(wù)器
? ? ? ?# ? proxy_pass ? http://127.0.0.1;
? ? ? ?#}
? ? ? ?# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
? ? ? ?#
? ? ? ?#location ~ \.php$ { #以fastcgi的方式轉(zhuǎn)發(fā)php請(qǐng)求到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 { #拒絕web形式訪問(wèn)指定文件,如很多的網(wǎng)站都是通過(guò).htaccess文件
來(lái)改變自己的重定向等功能。
? ? ? ?# ? deny all;
? ? ? ?#}
? ? ? location ~ /passwd.html {
? ? ? ? ? deny all;
? ? ? }
? }
? ?# another virtual host using mix of IP-, name-, and port-based configuration
? ?#
? ?#server { #自定義虛擬server
?
4.2 mime
在Nginx中,“mime” 是一種配置指令,用于設(shè)置 MIME 類型與文件擴(kuò)展名的映射關(guān)系。
vim /apps/nginx/conf/mime.types
#查看當(dāng)前Nginx服務(wù)器配置的MIME類型列表
?
4.3 server 下的 root指令
在Nginx配置中,"root"指令用于設(shè)置服務(wù)器塊(server block)的根目錄,即指明軟件的根目錄。
通常,"root"指令位于Nginx配置文件中的服務(wù)器塊(server block)中。
server {
? listen 80;
? server_name example.com;
?
? root /var/www/html;
?
? location / {
? ? ? ...
? }
?
? ...
}
#指定了服務(wù)器塊的根目錄為"/var/www/html"
#訪問(wèn)該服務(wù)器的網(wǎng)站時(shí),Nginx會(huì)在"/var/www/html"文件夾中查找并提供相應(yīng)的靜態(tài)文件
?
4.4 構(gòu)建虛擬主機(jī)
4.4.1 基于域名的虛擬主機(jī)
以手機(jī)端和電腦端為例
mkdir -p /apps/nginx/conf.d/#建立虛擬主機(jī)配置文件目錄
?
cd /apps/nginx/conf #主配置文件所在目錄
?
#添加到http模塊中
vim nginx.conf
?
include ? ? ? ? ? ? /apps/nginx/conf.d/*.conf;
#聲明子配置文件的位置,需要寫(xiě)在最上面
?
nginx -t #保存后檢查語(yǔ)法
?
cd /apps/nginx/conf.d/
?
#編寫(xiě)電腦端的配置文件
vim computer.conf
?
server{
? ? ? listen ? 192.168.10.10:80;
? ? ? server_name www.computer.com;
? ? location / {
? ? ? root /data/nginx/html/pc;
? }
}
#編寫(xiě)手機(jī)端的配置文件
vim mobile.conf
?
server {
? listen 192.168.10.10:80;
? server_name www.mobile.com;
? root /data/nginx/html/mobile/;
}
[root@localhost logs]# nginx -t
nginx: the configuration file /apps/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /apps/nginx/conf/nginx.conf test is successful
[root@localhost logs]# nginx -s reload
?
#構(gòu)建數(shù)據(jù)文件夾
mkdir /apps/nginx/html/pc -pv
mkdir /apps/nginx/html/mobile -pv
?
#構(gòu)建數(shù)據(jù)文件
echo This is computer > /apps/nginx/html/pc/index.html
echo This is mobile > /apps/nginx/html/mobile/index.html
?
#切換到測(cè)試機(jī)
#修改本地hosts文件 添加對(duì)應(yīng)映射
vim /etc/hosts
192.168.10.10 www.computer.com
192.168.10.10 www.mobile.com
?
#測(cè)試
curl www.mobile.com
This is mobile
curl www.computer.com
This is computer
?
?
4.4.2 基于端口
服務(wù)端
#編輯子配置文件 mobile.conf,修改端口號(hào)
server{
? ? ? ?listen 192.168.10.10:8080;
? ? ? ?server_name www.mobile.com;
? ? ? ?root /data/nginx/html/moblie;
?
}
?
#computer.conf 不變
server{
? ? ? ?listen ? 192.168.10.10:80;
? ? ? ?server_name www.computer.com;
? ? ? ?root /data/nginx/html/pc;
}
?
?
?
切換到客戶端
curl 192.168.10.10:8080
This is mobile
curl 192.168.10.10:80
This is computer
?
4.4.3 基于ip地址
服務(wù)端
添加新網(wǎng)卡并配置
?
#編輯子配置文件mobile.conf,修改IP地址
cd /apps/nginx/conf.d/
vim mobile.conf
?
server{
? ? ? listen 192.168.10.11:80;
? ? ? server_name www.mobile.com;
? ? ? root /data/nginx/html/mobile;
?
}
?
#computer.conf不變
server{
? ? ? listen ? 192.168.10.10:80;
? ? ? server_name www.computer.com;
? ? ? root /data/nginx/html/pc;
}
?
?
修改客戶端hosts文件
?
vim /etc/hosts
192.168.10.10 www.computer.com
192.168.10.11 www.mobile.com
?
curl 192.168.10.11
This is mobile
curl 192.168.10.10
This is computer
4.5 路徑別名-----alias
在 Nginx 中,alias 用于創(chuàng)建一個(gè)路徑別名的指令。
別名可以用于將文件或目錄從一個(gè)位置映射到另一個(gè)位置,提供更靈活的訪問(wèn)控制。
服務(wù)端
#編輯子配置文件cxk.conf,使用alias
server {
listen 80;
? location /test{
? ? ?alias /apps/nginx/html/pc;
#相當(dāng)于替換,訪問(wèn)/test/就是訪問(wèn)/apps/nginx/html/pc;
?
}
}
?
?
?
4.6 location模塊
在Nginx中,location 是一個(gè)用于匹配請(qǐng)求 URL 路徑的指令。它在 Nginx 配置文件中使用,在不同的 location 塊中定義不同的行為或處理規(guī)則。
#官方幫助文檔
http://nginx.org/en/docs/http/ngx_http_core_module.html#location
?
#基本語(yǔ)法
location [修飾符] 匹配的路徑 {
? ... 配置指令 ...
}
```
?
修飾符功能=精確字符串匹配^~前綴匹配,如果URL路徑以指定的字符串開(kāi)始,則停止查找其他匹配。~使用正則表達(dá)式進(jìn)行匹配,區(qū)分大小寫(xiě)~*使用正則表達(dá)式進(jìn)行匹配,不區(qū)分大小寫(xiě)不帶符號(hào)匹配起始于此uri的所有的uri\表示包含正則表達(dá)式并且轉(zhuǎn)義字符
優(yōu)先級(jí)
4.7 基于四層的訪問(wèn)控制-----access模塊
Nginx的access模塊允許用戶定義基于IP地址、請(qǐng)求方法、URI等條件的訪問(wèn)規(guī)則,以控制客戶端對(duì)NGINX服務(wù)器上特定資源的訪問(wèn)。
1)IP地址訪問(wèn)控制:允許或拒絕特定IP地址或IP地址范圍的訪問(wèn)。
拒絕特定IP地址的訪問(wèn)
?
location / {
? ?deny 192.168.10.10;
? ?#默認(rèn)允許所有
}
?
?
允許特定IP地址段的訪問(wèn)
?
location / {
? ?allow 192.168.2.0/24;
? ?deny all;
}
?
?
2)請(qǐng)求方法訪問(wèn)控制:允許或拒絕特定HTTP請(qǐng)求方法(如GET、POST等)的訪問(wèn)。
僅允許GET請(qǐng)求
?
if ($request_method != GET) {
? ?return 403;
}
?
3)URI訪問(wèn)控制:允許或拒絕特定URI或URI模式的訪問(wèn)。
拒絕特定URI的訪問(wèn)
?
location /cxk {
? ?deny all;
}
允許特定URI模式的訪問(wèn)
?
location ~ ^/api/ {
? ?allow all;
}
?
4)條件組合訪問(wèn)控制:根據(jù)多個(gè)條件的組合來(lái)實(shí)施訪問(wèn)控制策略。
僅允許特定IP地址段的GET請(qǐng)求訪問(wèn)特定URI模式
?
#舉個(gè)例子
location ~ ^/api/ {
? ?if ($request_method != GET) {
? ? ? ?return 403;
? }
? ?allow 192.168.1.0/24;
? ?deny all;
}
?
4.8 驗(yàn)證模塊
4.8.1 htpasswd命令
安裝
yum install httpd-tools -y
?
常用命令
?
#第一次生成文件
htpasswd -c 文件路徑 姓名 ? ? ? 交互式生成密碼
htpasswd -bc 文件路徑 姓名 密碼 ? 直接將密碼跟在
?
-c 代表新建用戶名和密碼對(duì)應(yīng)的文件
-b 將密碼跟在用戶名后
?
#非第一次生成文件
htpasswd ? ? 文件路徑 姓名 ? ? ? 交互式生成密碼
htpasswd -b 文件路徑 姓名 密碼 ? 直接將密碼跟在后面
?
4.8.2 配置驗(yàn)證模塊
#編輯配置文件
vim cxk.conf
?
server {
listen 80;
? location /test{
? ? ?alias /apps/nginx/html/pc;
}
location /admin{
? ? ? ?root /data/nginx/html/pc;
? ? ? ?auth_basic ? ?"admin site";
? ? ? ?#提示信息,不是所有瀏覽器都有用
? ? ? ?auth_basic_user_file /apps/nginx/conf.d/.httpuser;
? ? ? ?#密碼文件存放位置
}
}
?
使用 Basic 認(rèn)證(基本認(rèn)證)對(duì)用戶進(jìn)行身份驗(yàn)證
htpasswd -bc /apps/nginx/conf.d/.httpuser byyd 123456
#創(chuàng)建一個(gè).htpasswd文件,并添加一個(gè)使用Basic認(rèn)證的用戶名和密碼
使用主機(jī)瀏覽器
訪問(wèn)192.168.10.10/admin
4.9 關(guān)閉或修改版本信息
4.9.1 關(guān)閉版本信息顯示
Syntax: server_tokens on | off | build | string;
Default:
server_tokens on;
Context: http, server, location
?
#修改配置文件 放在 ? http語(yǔ)句中
http {
? server_tokens off;
? ?
?
?
[root@localhost nginx]#nginx -s reload
#重新加載
?
驗(yàn)證
[root@localhost sbin]#curl -I http://192.168.10.10/
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Thu, 21 Apr 2022 03:34:51 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytes
?
[root@localhost sbin]#curl -I http://192.168.10.10/
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 21 Apr 2022 04:04:23 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 19 Apr 2022 02:43:17 GMT
Connection: keep-alive
ETag: "625e21c5-264"
Accept-Ranges: bytes
?
4.9.2 修改nginx 版本信息 優(yōu)化
思路: 修改安裝包里源碼, 再重新編譯
?
源碼路徑
/nginx-1.18.0/src/core/nginx.h
?
cd /opt
vim./nginx-1.18.0/src/core/nginx.h
?
#修改前
#define nginx_version ? ? 1018000
#define NGINX_VERSION ? ? "1.18.0"
#define NGINX_VER ? ? ? ? "nginx/" NGINX_VERSION
?
#修改后
#define nginx_version ? ? 1018000
#define NGINX_VERSION ? ? "cxk"
#define NGINX_VER ? ? ? ? "nginx/" NGINX_VERSION
?
vim ./nginx-1.18.0/src/http/ngx_http_header_filter_module.c
#修改模塊的源代碼文件
?
#修改前
static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
?
#修改后
static u_char ngx_http_server_string[] = "Server: cxk" CRLF;
static u_char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;
static u_char ngx_http_server_build_string[] = "Server: " NGINX_VER_BUILD CRLF;
?
?
##然后重新編譯安裝
./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
?
make -j2 && make install
?
?
編譯安裝完成后,重啟
nginx -v #查看版本信息
curl -I 192.168.2.100
?
4.10 自定義 錯(cuò)誤頁(yè)面
#error_page 404 ? ? ? ? ? ? /404.html;
#默認(rèn)錯(cuò)誤頁(yè)面
?
修改錯(cuò)誤頁(yè)面的主要目的是為了提供更友好的用戶體驗(yàn)和品牌一致性。
也可以用指定的響應(yīng)狀態(tài)碼進(jìn)行響應(yīng)。
#部分響應(yīng)狀態(tài)碼
400 Bad Request:請(qǐng)求不正確或無(wú)效的錯(cuò)誤頁(yè)面。
401 Unauthorized:未授權(quán)訪問(wèn)的錯(cuò)誤頁(yè)面。
403 Forbidden:禁止訪問(wèn)的錯(cuò)誤頁(yè)面。
404 Not Found:頁(yè)面未找到的錯(cuò)誤頁(yè)面。
500 Internal Server Error:服務(wù)器內(nèi)部錯(cuò)誤的錯(cuò)誤頁(yè)面。
502 Bad Gateway:錯(cuò)誤的網(wǎng)關(guān)請(qǐng)求的錯(cuò)誤頁(yè)面。
503 Service Unavailable:服務(wù)不可用的錯(cuò)誤頁(yè)面
?
配置文件中的可用位置:http, server, location, if in location。
#基本格式
error_page code ... [=[response]] uri;
?
#構(gòu)成詳解
error_page ? 固定寫(xiě)法
code ? ? ? ? 響應(yīng)碼
= ? ? ? ? ? ? 可以將響應(yīng)碼轉(zhuǎn)換
uri ? ? ? ? ? 訪問(wèn)連接
?
新建錯(cuò)誤頁(yè)面和錯(cuò)誤頁(yè)面目錄
?
mkdir /apps/nginx/html/pc/error/
cd /appsnginx/html/pc/error/
?
vim 40x.html #錯(cuò)誤頁(yè)面
在子配置文件的sever語(yǔ)塊下
error_page 404 =302 /40x.html;
location = /40x.html {
? ? root /apps/nginx/html/pc/error/;
}
?
?
4.11 修改日志的位置
通過(guò)修改日志的路徑,可以實(shí)現(xiàn)日志分離,即不同網(wǎng)站的日志單獨(dú)存放。
mkdir /data/logs #新建存放日志的目錄
?
?
#編輯子配置文件,指定日志存放位置
在server語(yǔ)塊下添加
error_log ? /data/logs/m_error.log;
? ? ? access_log /data/logs/m_access.log;
? ? ? ?
nginx -t
nginx -s reload #語(yǔ)法檢查無(wú)誤后重載
?
4.13 長(zhǎng)連接相關(guān)-----keepalive指令
4.13.1 原理
HTTP Keep-Alive 功能用于實(shí)現(xiàn)長(zhǎng)連接,允許客戶端和服務(wù)器之間的 TCP 連接在發(fā)送完一個(gè)請(qǐng)求后保持打開(kāi)狀態(tài),以便在同一連接上發(fā)送多個(gè)請(qǐng)求和響應(yīng)。
可以加在全局或者 server 。
keepalive 配置指令僅對(duì) HTTP/1.0 和 HTTP/1.1 版本的連接有效。
對(duì)于 HTTP/2 連接,keepalive 功能是默認(rèn)啟用的,并且無(wú)需額外配置。
4.13.2 keepalive_timeout
keepalive_timeout timeout [header_timeout];
#設(shè)定保持連接超時(shí)時(shí)長(zhǎng)
?
keepalive_timeout 用于定義長(zhǎng)連接超時(shí)時(shí)間。
當(dāng)一個(gè)客戶端與服務(wù)器之間的連接完成一個(gè)請(qǐng)求后的等待時(shí)間。 如果在這個(gè)時(shí)間內(nèi)沒(méi)有收到新的請(qǐng)求,服務(wù)器會(huì)關(guān)閉連接。 這個(gè)時(shí)間是以秒為單位的,默認(rèn)值是 75 秒。
4.13.3 keepalive_requests
keepalive_requests number; ?
#在一次長(zhǎng)連接上所允許請(qǐng)求的資源的最大數(shù)量
?
keepalive_requests 用于設(shè)置一個(gè)連接上可以處理的最大請(qǐng)求數(shù)量。
當(dāng)達(dá)到指定數(shù)量后,服務(wù)器會(huì)關(guān)閉該連接并且客戶端需要重新建立新連接。
默認(rèn)情況下,keepalive_requests 的值是 100。
如果將 keepalive_requests 設(shè)置為 0,則表示在完成每個(gè)請(qǐng)求后立即關(guān)閉連接,禁用了 Keep-Alive 功能。
4.14 用戶上傳資料
client_max_body_size 1m;
#設(shè)置允許客戶端上傳單個(gè)文件的最大值,默認(rèn)值為1m,上傳文件超過(guò)此值會(huì)出413錯(cuò)誤
client_body_buffer_size size;
#用于接收每個(gè)客戶端請(qǐng)求報(bào)文的body部分的緩沖區(qū)大小;默認(rèn)16k;超出此大小時(shí),其將被暫存到磁盤上的由下面client_body_temp_path指令所定義的位置
client_body_temp_path path [level1 [level2 [level3]]];
#設(shè)定存儲(chǔ)客戶端請(qǐng)求報(bào)文的body部分的臨時(shí)存儲(chǔ)路徑及子目錄結(jié)構(gòu)和數(shù)量,目錄名為16進(jìn)制的數(shù)字,使用hash之后的值從后往前截取1位、2位、2位作為目錄名
?
上傳文件大于限制 ?錯(cuò)誤代碼413
?
4.15 其他設(shè)置
directio size | off;
#操作完全和aio相反,aio是讀取文件而directio是寫(xiě)文件到磁盤,啟用直接I/O,默認(rèn)為關(guān)閉,當(dāng)文件大于等于給定大小時(shí),例如:directio 4m;同步(直接)寫(xiě)磁盤,而非寫(xiě)緩存。
?
直接 寫(xiě)入 磁盤 ? ? 還是等待一定數(shù)據(jù)量寫(xiě)入磁盤
?
open_file_cache off; ?#是否緩存打開(kāi)過(guò)的文件信息
open_file_cache max=N [inactive=time];
#nginx可以緩存以下三種信息:
(1) 文件元數(shù)據(jù):文件的描述符、文件大小和最近一次的修改時(shí)間
(2) 打開(kāi)的目錄結(jié)構(gòu)
(3) 沒(méi)有找到的或者沒(méi)有權(quán)限訪問(wèn)的文件的相關(guān)信息
max=N:#可緩存的緩存項(xiàng)上限數(shù)量;達(dá)到上限后會(huì)使用LRU(Least recently used,最近最少使用)算法實(shí)現(xiàn)管理
inactive=time:#緩存項(xiàng)的非活動(dòng)時(shí)長(zhǎng),在此處指定的時(shí)長(zhǎng)內(nèi)未被命中的或命中的次數(shù)少于
?
?
?
open_file_cache_min_uses ? ?
#指令所指定的次數(shù)的緩存項(xiàng)即為非活動(dòng)項(xiàng),將被刪除
open_file_cache_valid time;
#緩存項(xiàng)有效性的檢查驗(yàn)證頻率,默認(rèn)值為60s
open_file_cache_errors on | off;
#是否緩存查找時(shí)發(fā)生錯(cuò)誤的文件一類的信息,默認(rèn)值為off
open_file_cache_min_uses number;
#open_file_cache指令的inactive參數(shù)指定的時(shí)長(zhǎng)內(nèi),至少被命中此處指定的次數(shù)方可被歸類為活動(dòng)項(xiàng),默認(rèn)值為1
?
范例:
open_file_cache max=10000 inactive=60s;
#最大緩存10000個(gè)文件,非活動(dòng)數(shù)據(jù)超時(shí)時(shí)長(zhǎng)60s
open_file_cache_valid ? 60s; ?
#每間隔60s檢查一下緩存數(shù)據(jù)有效性
open_file_cache_min_uses 5;
#60秒內(nèi)至少被命中訪問(wèn)5次才被標(biāo)記為活動(dòng)數(shù)據(jù)
open_file_cache_errors ? on;
#緩存錯(cuò)誤信息
?
?
?
limit_except method ... { ... },僅用于location
#限制客戶端使用除了指定的請(qǐng)求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE, OPTIONS, PROPFIND,
PROPPATCH, LOCK, UNLOCK, PATCH
limit_except GET {
allow 192.168.91.101;
deny all;
}
#除了GET和HEAD 之外其它方法僅允許192.168.1.0/24網(wǎng)段主機(jī)使用
?
五、變量
在NGINX中,變量是一種用于存儲(chǔ)和檢索HTTP請(qǐng)求和響應(yīng)中的數(shù)據(jù)的機(jī)制。
變量可以包含請(qǐng)求頭、請(qǐng)求方法、請(qǐng)求參數(shù)、時(shí)間戳等信息。
http://nginx.org/en/docs/varindex.html
官方文檔
?
5.1 內(nèi)置變量
5.1.1 常用內(nèi)置變量
當(dāng)NGINX作為反向代理服務(wù)器時(shí),它將接收到的客戶端請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器。為了保持請(qǐng)求的來(lái)源信息,NGINX可以在轉(zhuǎn)發(fā)請(qǐng)求時(shí)設(shè)置X-Forwarded-For頭部,以便后端服務(wù)器知道真實(shí)的客戶端IP地址。
內(nèi)置變量功能$remote_addr客戶端的地址,注意是客戶端的公網(wǎng)IP$proxy_add_x_forwarded_for在反向代理服務(wù)器中設(shè)置X-Forwarded-For請(qǐng)求頭$args請(qǐng)求的查詢參數(shù)$arg_輸出名為的查詢參數(shù)的值$document_root當(dāng)前請(qǐng)求的根目錄路徑$document_uri當(dāng)前請(qǐng)求的URI,不包括查詢字符串部分$host存放了請(qǐng)求的主機(jī)名limit_rate如果nginx服務(wù)器使用limit_rate配置了顯示網(wǎng)絡(luò)速率,則會(huì)顯示,如果沒(méi)有設(shè)置, 則顯示0$remote_port客戶端請(qǐng)求Nginx服務(wù)器時(shí)隨機(jī)打開(kāi)的端口,這是每個(gè)客戶端自己的端口$remote_user已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶名$request_body_file做反向代理時(shí)發(fā)給后端服務(wù)器的本地資源的名稱$request_method請(qǐng)求資源的方式,GET/PUT/DELETE等$request_filename當(dāng)前請(qǐng)求的文件路徑$request_uri包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名$scheme請(qǐng)求使用的協(xié)議(http或https)$server_protocol保存了客戶端請(qǐng)求資源使用的協(xié)議的版本$server_addr保存了服務(wù)器的IP地址$server_name請(qǐng)求的服務(wù)器的主機(jī)名$server_port請(qǐng)求的服務(wù)器的端口號(hào)$http_記錄請(qǐng)求報(bào)文的首部字段$http_user_agent客戶端使用的用戶代理$http_cookie請(qǐng)求中的Cookie$cookie_name為任意請(qǐng)求報(bào)文首部字部cookie的key名$sent_http_name為響應(yīng)報(bào)文的首部字段
5.1.2自定義變量
假如需要自定義變量名稱和值,使用指令set $variable value;
語(yǔ)法格式:
Syntax: set $variable value;
Default: —
Context: server, location, if
范例:
set $name kgc;
echo $name;
set $my_port $server_port;
echo $my_port;
echo "$server_name:$server_port"; #輸出信息如下
[root@centos6 ~]#curl www.kgc.org/main
kgc
80
www.kgc.org:80
?
######################################################
實(shí)際例子:
location /test {
? ? ? ?set $name kgc;
? ? ? ?echo $name;
? ? ? ?set $my_port $server_port;
? ? ? ?echo $my_port;
? ? ? }
?
六、自定義訪問(wèn)日志 (優(yōu)化)
自定義訪問(wèn)日志可以提供更靈活和定制化的日志記錄方式。
1.滿足特定需求:通過(guò)自定義訪問(wèn)日志,你可以選擇記錄特定的訪問(wèn)信息,如客戶端IP地址、訪問(wèn)時(shí)間、請(qǐng)求內(nèi)容、狀態(tài)碼、傳輸字節(jié)數(shù)、引用頁(yè)面、用戶代理等。這些信息可以根據(jù)你的需求進(jìn)行自定義,以滿足特定的分析、監(jiān)控或統(tǒng)計(jì)需求。
2.減少日志量:默認(rèn)情況下,Nginx 記錄的訪問(wèn)日志較為詳細(xì),包含了大量的信息。而自定義訪問(wèn)日志可以讓你只記錄感興趣的信息,避免產(chǎn)生過(guò)多的日志數(shù)據(jù),減少磁盤空間和讀寫(xiě)開(kāi)銷。
3.提高性能:自定義訪問(wèn)日志可以減少磁盤的寫(xiě)入操作,從而減小對(duì)系統(tǒng)性能的影響。尤其在高訪問(wèn)量的情況下,減少日志量可以提高系統(tǒng)的處理能力和響應(yīng)速度。
4.日志分析與監(jiān)控:自定義訪問(wèn)日志可以使日志數(shù)據(jù)更易于分析和監(jiān)控。你可以根據(jù)自定義的格式,使用各種日志分析工具或腳本,提取有用的信息,進(jìn)行訪問(wèn)分析、安全審計(jì)、性能優(yōu)化等工作。
6.1自定義訪問(wèn)日志的格式
要自定義 Nginx 的訪問(wèn)日志,你需要編輯 Nginx 的配置文件,并修改 http 部分的日志格式。
以下是一個(gè)簡(jiǎn)單的例子,展示了如何在 Nginx 配置文件中定義一個(gè)自定義的訪問(wèn)日志格式:
http {
? ?# 定義自定義訪問(wèn)日志格式
? ?log_format my_custom_log '$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? ? ? ? '$status $body_bytes_sent "$http_referer" '
? ? ? ? ? ? ? ? ? ? ? ? ? '"$http_user_agent"';
?
? ?# 配置使用自定義訪問(wèn)日志格式的訪問(wèn)日志文件
? ?access_log /path/to/custom_access.log my_custom_log;
?
? ?# 其他配置項(xiàng)...
}
?
在上述例子中,我們使用 `log_format` 指令定義了一個(gè)名為 `my_custom_log` 的自定義日志格式,該格式包含了 IP 地址、用戶名、訪問(wèn)時(shí)間、請(qǐng)求內(nèi)容、狀態(tài)碼、傳輸字節(jié)數(shù)、引用頁(yè)面和用戶代理等信息。
?
然后,在 `access_log` 指令中指定了一個(gè)自定義訪問(wèn)日志文件的路徑 `/path/to/custom_access.log`,并且將之前定義的 `my_custom_log` 格式應(yīng)用于該日志文件。
?
請(qǐng)注意,修改完配置文件之后,記得重新加載 Nginx 配置使改動(dòng)生效,使用命令 `nginx -s reload` 可以實(shí)現(xiàn)配置文件的熱重載。
?
6.2 自定義json 格式日志
log_format access_json '{"@timestamp":"$time_iso8601",'
? ? ? ?'"host":"$server_addr",'
? ? ? ?'"clientip":"$remote_addr",'
? ? ? ?'"size":$body_bytes_sent,'
? ? ? ?'"responsetime":$request_time,'
? ? ? ?'"upstreamtime":"$upstream_response_time",'
? ? ? ?'"upstreamhost":"$upstream_addr",' ?
? ? ? ?'"http_host":"$host",'
? ? ? ?'"uri":"$uri",'
? ? ? ?'"xff":"$http_x_forwarded_for",'
? ? ? ?'"referer":"$http_referer",'
? ? ? ?'"tcp_xff":"$proxy_protocol_addr",'
? ? ? ?'"http_user_agent":"$http_user_agent",'
? ? ? ?'"status":"$status"}';
?
?
location / {
?root /data/nginx/pc/;
?access_log logs/access.log access_json;
}
'"http_user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTMLe/101.0.4951.54 Safari/537.36",' ? ?'"status":"304"}'
?
?
七、Nginx壓縮功能(重要)
Nginx通過(guò)在服務(wù)器上啟用gzip模塊來(lái)提供壓縮功能。
啟用gzip后,Nginx會(huì)自動(dòng)檢測(cè)客戶端的瀏覽器支持情況,然后在服務(wù)器和客戶端之間壓縮和解壓縮文件。
太小的文件沒(méi)必要壓縮,壓縮說(shuō)不定變大了。
官方文檔: Module ngx_http_gzip_module
參數(shù)項(xiàng)釋義參數(shù)值gzip開(kāi)啟或關(guān)閉壓縮機(jī)制on/off;gzip_types根據(jù)文件類型選擇性開(kāi)啟壓縮機(jī)制image/png、text/css…gzip_comp_level用于設(shè)置壓縮級(jí)別,級(jí)別越高越耗時(shí)1~9(越高壓縮效果越好)gzip_vary設(shè)置是否攜帶Vary:Accept-Encoding頭域的響應(yīng)頭部on/offgzip_buffers設(shè)置處理壓縮請(qǐng)求的緩沖區(qū)數(shù)量和大小 數(shù)量 大小如16 8kgzip_disable針對(duì)不同客戶端的請(qǐng)求來(lái)設(shè)置是否開(kāi)啟壓縮如 .Chrome.gzip_http_version指定壓縮響應(yīng)所需要的最低HTTP請(qǐng)求版本如1.1gzip_min_length設(shè)置觸發(fā)壓縮的文件最低大小如512kgzip_proxied對(duì)于后端服務(wù)器的響應(yīng)結(jié)果是否開(kāi)啟壓縮off、expired、no-cache…
http{
? ?# 開(kāi)啟壓縮機(jī)制
? ?gzip on;
? ?# 指定會(huì)被壓縮的文件類型(也可自己配置其他類型)
? ?gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png;
? ?# 設(shè)置壓縮級(jí)別,越高資源消耗越大,但壓縮效果越好
? ?gzip_comp_level 5;
? ?# 在頭部中添加Vary: Accept-Encoding(建議開(kāi)啟)
? ?gzip_vary on;
? ?# 處理壓縮請(qǐng)求的緩沖區(qū)數(shù)量和大小
? ?gzip_buffers 16 8k;
? ?# 對(duì)于不支持壓縮功能的客戶端請(qǐng)求不開(kāi)啟壓縮機(jī)制
? ?gzip_disable "MSIE [1-6]\."; # 低版本的IE瀏覽器不支持壓縮
? ?# 設(shè)置壓縮響應(yīng)所支持的HTTP最低版本
? ?gzip_http_version 1.1;
? ?# 設(shè)置觸發(fā)壓縮的最小閾值
? ?gzip_min_length 2k;
? ?# 關(guān)閉對(duì)后端服務(wù)器的響應(yīng)結(jié)果進(jìn)行壓縮
? ?gzip_proxied off;
}
?
八、HTTPS 功能
8.1 Nginx的HTTPS工作原理的詳解
1)客戶端發(fā)送HTTPS請(qǐng)求:客戶端(例如Web瀏覽器)通過(guò)HTTPS協(xié)議向Nginx服務(wù)器發(fā)送加密的HTTP請(qǐng)求。默認(rèn)情況下,HTTPS使用443端口進(jìn)行通信。
2)服務(wù)器證書(shū)握手:Nginx服務(wù)器接收到HTTPS請(qǐng)求后,會(huì)向客戶端發(fā)送已經(jīng)配置好的SSL證書(shū)。該證書(shū)包含了服務(wù)器的公鑰以及其他相關(guān)信息,例如服務(wù)器的域名。
3)客戶端驗(yàn)證證書(shū):客戶端接收到服務(wù)器發(fā)送的證書(shū)后,會(huì)使用預(yù)置的受信任證書(shū)頒發(fā)機(jī)構(gòu)(CA)根證書(shū)列表來(lái)驗(yàn)證詳細(xì)的服務(wù)器證書(shū)鏈。客戶端會(huì)檢查證書(shū)是否由受信任的CA簽發(fā),并驗(yàn)證證書(shū)的有效性和真實(shí)性。如果證書(shū)通過(guò)驗(yàn)證,客戶端可以確認(rèn)服務(wù)器的身份。
4)密鑰交換:如果服務(wù)器的證書(shū)被成功驗(yàn)證,客戶端會(huì)生成一個(gè)隨機(jī)的對(duì)稱密鑰,稱為“會(huì)話密鑰”。然后,客戶端使用服務(wù)器的公鑰來(lái)加密該會(huì)話密鑰,并將其發(fā)送給服務(wù)器。
5)數(shù)據(jù)加密:Nginx服務(wù)器接收到客戶端發(fā)送的加密的會(huì)話密鑰后,使用服務(wù)器的私鑰解密該會(huì)話密鑰。此后,Nginx服務(wù)器和客戶端使用會(huì)話密鑰來(lái)進(jìn)行對(duì)稱加密和解密,以加密和解密數(shù)據(jù)的傳輸。
6)安全數(shù)據(jù)傳輸:一旦會(huì)話密鑰被交換并使用,Nginx服務(wù)器和客戶端之間的通信將通過(guò)使用會(huì)話密鑰進(jìn)行加密和解密來(lái)保證安全性。所有通過(guò)HTTPS協(xié)議傳輸?shù)臄?shù)據(jù),包括HTTP請(qǐng)求和響應(yīng)內(nèi)容,都將被加密。
客戶端和服務(wù)器之間的加密通道建立后,數(shù)據(jù)在傳輸過(guò)程中將經(jīng)過(guò)加密,從而提供了更高的安全性。
8.2 啟用功能模塊的配置過(guò)程
Nginx的HTTPS功能通過(guò)ngx_http_ssl_module模塊來(lái)實(shí)現(xiàn)的。
ngx_http_ssl_module模塊為Nginx添加了對(duì)SSL/TLS協(xié)議的支持,使其能夠提供HTTPS服務(wù)。
ngx_http_ssl_module模塊提供了一組配置項(xiàng),用于指定SSL證書(shū)、私鑰、加密算法、協(xié)議版本以及其他與SSL/TLS相關(guān)的設(shè)置。
配置步驟:
1)獲取SSL證書(shū)和私鑰:從證書(shū)頒發(fā)機(jī)構(gòu)(CA)或自簽名證書(shū)頒發(fā)機(jī)構(gòu)獲取有效的SSL證書(shū)和對(duì)應(yīng)的私鑰文件。證書(shū)用于驗(yàn)證服務(wù)器的身份,私鑰用于解密SSL連接。
2)配置Nginx:編輯主配置文件nginx.conf
ssl_certificate:指定SSL證書(shū)文件的路徑。
?
ssl_certificate_key:指定SSL私鑰文件的路徑。
?
ssl_protocols:指定支持的TLS協(xié)議版本,例如TLSv1.2、TLSv1.3。
?
ssl_ciphers:指定加密算法套件,例如AES128-GCM-SHA256、ECDHE-RSA-AES256-GCM-SHA384。
?
其他可選的SSL配置項(xiàng):ssl_prefer_server_ciphers、ssl_session_timeout等。
#舉例子
server {
? ?listen 443 ssl;
? ?server_name example.com;
?
? ?ssl_certificate /path/to/certificate.crt;
? ?ssl_certificate_key /path/to/private/key.key;
?
? ?# SSL配置項(xiàng)
? ?ssl_protocols TLSv1.2 TLSv1.3;
? ?ssl_prefer_server_ciphers on;
? ?ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
}
?
3)重啟Nginx:保存配置文件,并重新加載或重啟Nginx服務(wù)。
nginx -s reload
?
九、自定義圖標(biāo)
favicon.ico 文件是瀏覽器收藏網(wǎng)址時(shí)顯示的圖標(biāo)。
當(dāng)客戶端使用瀏覽器問(wèn)頁(yè)面時(shí),瀏覽器會(huì)自己主動(dòng)發(fā)起請(qǐng)求獲取頁(yè)面的favicon.ico文件。 當(dāng)瀏覽器請(qǐng)求的favicon.ico文件不存在時(shí),服務(wù)器會(huì)記錄404日志,而瀏覽器會(huì)顯示404報(bào)錯(cuò)。
#方法一:服務(wù)器不記錄訪問(wèn)日志:
location = /favicon.ico {
? log_not_found off;
? access_log off;
}
#方法二:將圖標(biāo)保存到指定目錄訪問(wèn):
#location ~ ^/favicon\.ico$ {
location = /favicon.ico {
? ? root ? /data/nginx/html/pc/images;
? ? expires 365d; ?#設(shè)置文件過(guò)期時(shí)間
}
?
十、重寫(xiě)功能 rewrite
Nginx服務(wù)器利用 ngx_http_rewrite_module 模塊解析和處理rewrite請(qǐng)求。
Nginx 的重寫(xiě)功能是指通過(guò)修改請(qǐng)求 URL 的方式來(lái)實(shí)現(xiàn)URL重定向或者路由轉(zhuǎn)發(fā)的功能。
通過(guò)使用重寫(xiě)規(guī)則,可以對(duì)訪問(wèn)的URL進(jìn)行匹配和替換,以達(dá)到用戶期望的效果。
#舉個(gè)例子
location /old-url {
?rewrite ^/old-url/(.*)$ /new-url/$1 permanent;
}
?
匹配以 "/old-url/" 開(kāi)頭的請(qǐng)求,并將其重定向到 "/new-url/"。
?
10.1 if指令
基本原理
官方文檔 Module ngx_http_rewrite_module
if指令用于條件匹配判斷,并根據(jù)條件判斷結(jié)果選擇不同的Nginx配置,可以配置在server或location塊中。
Nginx的if語(yǔ)法僅能使用if做單次判斷,不支持使用if else或者if elif這樣的多重判斷。
基本語(yǔ)法
if (條件匹配) {
action
}
?
使用正則表達(dá)式對(duì)變量進(jìn)行匹配,匹配成功時(shí)if指令認(rèn)為條件為true,否則認(rèn)為false。
變量與表達(dá)式之間使用以下符號(hào)鏈接
= ? #比較變量和字符串是否相等,相等時(shí)if指令認(rèn)為該條件為true,反之為false
!= #比較變量和字符串是否不相等,不相等時(shí)if指令認(rèn)為條件為true,反之為false
~ ? #區(qū)分大小寫(xiě)字符,可以通過(guò)正則表達(dá)式匹配,滿足匹配條件為真,不滿足匹配條件為假
!~ #區(qū)分大小寫(xiě)字符,判斷是否匹配,不滿足匹配條件為真,滿足匹配條件為假
?
~* #不區(qū)分大小寫(xiě)字符,可以通過(guò)正則表達(dá)式匹配,滿足匹配條件為真,不滿足匹配條件為假
!~* #不區(qū)分大小字符,判斷是否匹配,滿足匹配條件為假,不滿足匹配條件為真
?
-f 和 !-f #判斷請(qǐng)求的文件是否存在和是否不存在
-d 和 !-d #判斷請(qǐng)求的目錄是否存在和是否不存在
-x 和 !-x #判斷文件是否可執(zhí)行和是否不可執(zhí)行
-e 和 !-e #判斷請(qǐng)求的文件或目錄是否存在和是否不存在(包括文件,目錄,軟鏈接)
?
如果$ 變量的值為空字符串或0,則if指令認(rèn)為該條件為false,其他條件為true。
$變量的值如果以0開(kāi)頭的任意字符串會(huì)返回false
location /main {
? ? index index.html;
? ? default_type text/html;
? ? if ( $scheme = http ){
? ? ? echo "if-----> $scheme";
? ? }
? ? if ( $scheme = https ){
? ? ?echo "if ----> $scheme";
? }
? ?
? ? #if (-f $request_filename) {
? ? # ? echo "$request_filename is exist";
? ? #}
? ? if (!-e $request_filename) {
? ? ? ?echo "$request_filename is not exist";
? ? ? ?#return ;
? }
}
?
?
【用戶訪問(wèn)的文件不存在 直接返回主頁(yè)】
server {
? ?listen 80;
? ?server_name www.kgc.com;
? ?root /data/nginx/pc/;
? ?location / {
? ?root /data/nginx/pc/;
}
? ?location /test {
? ?default_type text/plain;
? ?return ?301 http://www.baidu.com;
}
? ?location /main {
? ?index index.html;
? ?default_type text/html;
? ?if ( $scheme = http ){
? ?return 666 "if-----> $scheme";
? }
? ?if (!-e $request_filename){
? ?return 302 /index.html; ? ? ? ? ?#如果用戶不存在直接跳轉(zhuǎn)到主頁(yè)面
?
}
}
}
www.kgc.com/main/xxxxx ? ?
#注意訪問(wèn)的main下的不存在 目錄 ?
#注意前面的if語(yǔ)句執(zhí)行后會(huì) 停止匹配
【想控制所有網(wǎng)站可以 ?放到前面】
server {
? ?listen 80;
? ?server_name www.kgc.com;
? ?root /data/nginx/pc/;
? ?if (!-e $request_filename){
? ?return 302 /index.html; ? ? ? ? ?#如果用戶不存在直接跳轉(zhuǎn)到主頁(yè)面
}
location / {
? ?root /data/nginx/pc/;
}
? ?location /test {
? ?default_type text/plain;
? ?return ?301 http://www.baidu.com;
}
? ?location /main {
? ?index index.html;
? ?default_type text/html;
? ?if ( $scheme = http ){
? ?return 666 "if-----> $scheme";
? }
? ?
}
}
?
10.2 return指令
return用于完成對(duì)請(qǐng)求的處理,并直接向客戶端返回響應(yīng)狀態(tài)碼,比如:可以指定重定向URL(對(duì)于特殊重定向狀態(tài)碼,301/302等) 或者是指定提示文本內(nèi)容(對(duì)于特殊狀態(tài)碼403/500等),處于此指令后的所有配置都將不被執(zhí)行,return可以在server、if 和 location塊進(jìn)行配置
語(yǔ)法格式:
www.kgc.com/test/
404
return code; #返回給客戶端指定的HTTP狀態(tài)碼
return code [text]; #返回給客戶端的狀態(tài)碼及響應(yīng)報(bào)文的實(shí)體內(nèi)容,可以調(diào)用變量,其中text如果有空格,需要用單或雙引號(hào)
return code url; #返回給客戶端的URL地址 ? ?
范例:
location / {
? root /data/nginx/html/pc;
? ?default_type text/html;
? index index.html;
? ? ?if ( $scheme = http ){
? ? ? ?#return 666;
? ? ? ?#return 666 "not allow http";
? ? ? ?#return 301 http://www.baidu.com;
? ? ? return 500 "service error";
? ? ? ?echo "if-----> $scheme"; #return后面的將不再執(zhí)行
? ? }
? ? if ( $scheme = https ){
? ? ?echo "if ----> $scheme";
? }
}
##############################################################
例子1:
server {
? ?listen 80;
? ?server_name www.kgc.com;
? ?root /data/nginx/pc/;
location /{
? ? ? ?root /data/nginx/pc/;
?
}
?location /test { ? ? ?#訪問(wèn)test 直接返回403
return 403; ? ? ? ? #可以改成666 ? ?
}
?
}
?
例子2:
location /test { ? ? ? ? ? ? ? ?#訪問(wèn)test 直接返回403
return 666 "hello"; ? ? ? ? #可以改成666自定義,hello是描述 文字可以 圖形瀏覽器不可以 ? ?
}
?
?
例子3:
?location /test {
?default_type text/plain; ? ? #定義文本格式后圖形瀏覽器可以看見(jiàn)
?return 666 "hello";
}
?
?
例子4:
location /test {
? ? ? ?default_type text/plain;
? ? ? ?return 302 http://www.baidu.com; ? ?
}
?
location /test {
? ? ? ?default_type text/plain;
? ? ? ?return 301 /index.html; ? ?
}
301 緩存在磁盤上,有些
302 沒(méi)有緩存 , 服務(wù)器斷開(kāi)無(wú)法重定向 ? jd
?
永久重定向
10.3 set 指令
指定key并給其定義一個(gè)變量,變量可以調(diào)用Nginx內(nèi)置變量賦值給key,另外set定義格式為set $key value,value可以是text, variables和兩者的組合。
location /main {
? root /data/nginx/html/pc;
? index index.html;
? default_type text/html;
? ?set $name kgc;
? ?echo $name;
? ?set $my_port $server_port(nginx ?自帶的變量 ?服務(wù)端口 一般80);
? ?echo $my_port;
}
10.4 break指令
用于中斷當(dāng)前相同作用域(location)中的其他Nginx配置,與該指令處于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模塊中指令就不再執(zhí)行,Nginx服務(wù)器在根據(jù)配置處理請(qǐng)求的過(guò)程中遇到該指令的時(shí)候,回到上一層作用域繼續(xù)向下讀取配置,該指令可以在server塊和locationif塊中使用
注意: 如果break指令在location塊中后續(xù)指令還會(huì)繼續(xù)執(zhí)行,只是不執(zhí)行 ngx_http_rewrite_module 模塊的指令,其它指令還會(huì)執(zhí)行
使用語(yǔ)法如下:
if ($slow) {
? limit_rate 10k;
? break;
}
location /main {
? root /data/nginx/html/pc;
? index index.html;
? default_type text/html;
? ?set $name kgc;
? ?echo $name;
? break; ?#location塊中break后面指令還會(huì)執(zhí)行
? ?set $my_port $server_port;
? ?echo $my_port;
}
10.5 rewrite 指令
通過(guò)正則表達(dá)式的匹配來(lái)改變URI,可以同時(shí)存在一個(gè)或多個(gè)指令,按照順序依次對(duì)URI進(jìn)行匹配,rewrite主要是針對(duì)用戶請(qǐng)求的URL或者是URI做具體處理
官方文檔:
https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
?
?
% s/舊的/新的/
rewrite可以配置在 server、location、if
語(yǔ)法格式 :
rewrite可以配置在 server、location、if
語(yǔ)法格式 :
rewrite regex ? ? ? ? ? ? ? replacement(www.baidu.com) ? ? ? [flag];
? ? ? 正則匹配原始訪問(wèn)url ? 替代你想讓客戶訪問(wèn)的 ? ? ? ? ? ? ? ? ? 標(biāo)志 ()premanent301 ? redirect302 break last
rewrite將用戶請(qǐng)求的URI基于regex所描述的模式進(jìn)行檢查,匹配到時(shí)將其替換為表達(dá)式指定的新的URI
注意:如果在同一級(jí)配置塊中存在多個(gè)rewrite規(guī)則,那么會(huì)自下而下逐個(gè)檢查;被某條件規(guī)則替換完成后,會(huì)重新一輪的替換檢查,隱含有循環(huán)機(jī)制,但不超過(guò)10次;如果超過(guò),提示500響應(yīng)碼,[flag]所表示的標(biāo)志位用于控制此循環(huán)機(jī)制如果替換后的URL是以http://或https://開(kāi)頭,則替換結(jié)果會(huì)直接以重定向返回給客戶端, 即永久重定向 301
正則表達(dá)式格式
. #匹配除換行符以外的任意字符
\w #匹配字母或數(shù)字或下劃線或漢字
\s #匹配任意的空白符
\d #匹配數(shù)字 ? [0-9] ?
\b #匹配單詞的開(kāi)始或結(jié)束
^ #匹配字付串的開(kāi)始
$ #匹配字符串的結(jié)束
* #匹配重復(fù)零次或更多次
+ #匹配重復(fù)一次或更多次
? #匹配重復(fù)零次或一次
(n) #匹配重復(fù)n次
{n,} #匹配重復(fù)n次或更多次
{n,m} #匹配重復(fù)n到m次
*? #匹配重復(fù)任意次,但盡可能少重復(fù)
+? #匹配重復(fù)1次或更多次,但盡可能少重復(fù)
?? #匹配重復(fù)0次或1次,但盡可能少重復(fù)
{n,m}? #匹配重復(fù)n到m次,但盡可能少重復(fù)
{n,}? #匹配重復(fù)n次以上,但盡可能少重復(fù)
\W ?#匹配任意不是字母,數(shù)字,下劃線,漢字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非數(shù)字的字符
\B #匹配不是單詞開(kāi)頭或結(jié)束的位置
[^x] #匹配除了x以外的任意字符
[^kgc] #匹配除了kgc 這幾個(gè)字母以外的任意字符
rewrite flag 使用介紹
利用nginx的rewrite的指令,可以實(shí)現(xiàn)url的重新跳轉(zhuǎn),rewrtie有四種不同的flag,分別是redirect(臨時(shí)重定向302)、permanent(永久重定向301)、break和last。其中前兩種是跳轉(zhuǎn)型的flag,后兩種是代理型
跳轉(zhuǎn)型指由客戶端瀏覽器重新對(duì)新地址進(jìn)行請(qǐng)求 代理型是在WEB服務(wù)器內(nèi)部實(shí)現(xiàn)跳轉(zhuǎn)
rewrite 格式
Syntax: rewrite regex replacement [flag]; #通過(guò)正則表達(dá)式處理用戶請(qǐng)求并返回替換后的數(shù)據(jù)包。
Default: —
Context: server, location, if
?
?
hn ? 湖南 ? 海南 ? 河南
?
?
hn ? hainan
flag 說(shuō)明
redirect;302
#臨時(shí)重定向,重寫(xiě)完成后以臨時(shí)重定向方式直接返回重寫(xiě)后生成的新URL給客戶端,由客戶端重新發(fā)起請(qǐng)求;使用相對(duì)路徑,或者h(yuǎn)ttp://或https://開(kāi)頭,狀態(tài)碼:302
?
permanent;301 ? ? ? www.bj.com ? ? www.beijing.com
#重寫(xiě)完成后以永久重定向方式直接返回重寫(xiě)后生成的新URL給客戶端,由客戶端重新發(fā)起請(qǐng)求,狀態(tài)碼:301
?
?
?
break; ? ? ? www.bj.com
#重寫(xiě)完成后,停止對(duì)當(dāng)前URL在當(dāng)前l(fā)ocation中后續(xù)的其它重寫(xiě)操作,而后直接跳轉(zhuǎn)至重寫(xiě)規(guī)則配置塊之后的其它配置;結(jié)束循環(huán),建議在location中使用
#適用于一個(gè)URL一次重寫(xiě)
?
?
?
last;
#重寫(xiě)完成后,停止對(duì)當(dāng)前URI在當(dāng)前l(fā)ocation中后續(xù)的其它重寫(xiě)操作,而后對(duì)新的URL啟動(dòng)新一輪重寫(xiě)檢查,不建議在location中使用
#適用于一個(gè)URL多次重寫(xiě),要注意避免出現(xiàn)超過(guò)十次以及URL重寫(xiě)后返回錯(cuò)誤的給用戶301
例子:
www.haishi.com www.hs.com
#訪問(wèn) bj ? 跳轉(zhuǎn)到 beijing ?
location /bj {
? root /data/nginx/pc; ?
? rewrite ^/bj/(.*) ? /beijing/$1 ? permanent;
?
}
?
此處的$1代表后項(xiàng)引用
?
?
?
?
location / {
? root /data/nginx/html/pc;
? index index.html;
? rewrite / http://www.kgc.com permanent;
? ?#rewrite / http://www.kgc.com redirect;
}
#重啟Nginx并訪問(wèn)域名 http://www.kgc.org 進(jìn)行測(cè)試
?
?
?
【rewrite】
rewrite regex replacement [flag];
指令 ? ? 正則 ? 替換 ? ? ? ? 標(biāo)志
?
?
【訪問(wèn)bj ?等于 訪問(wèn)beijing】
location /bj {
? rewrite ^/bj/(.*) /beijing/$1 permanent;
}
mkdir beijing
echo beijing > beijing/index.html
?
?
整個(gè)網(wǎng)頁(yè)跳轉(zhuǎn) ?老域名跳轉(zhuǎn)到新域名
location / {
? ? ? ? root /data/nginx/pc/;
? ? ? ?rewrite / ?http://www.accp.com permanent;
}
server {
?
listen 80;
server_name www.accp.com;
root /data/nginx/pc/accp/;
}
~ ? ? ? ? ? ? ?
cd /data/nginx/pc/
mkdir accp
echo accp > accp/index.html
?
?
【break】
server {
? ?listen 80;
? ?server_name www.kgc.com;
? ?root /data/nginx/pc/;
? ?if (!-e $request_filename){
? ?return 302 /index.html;
}
? ?location /test {
? ?default_type text/plain;
? ?set $name kgc;
? ?return ?666 $name;
}
? ?location /main {
? ?index index.html;
? ?default_type text/html;
? ?if ( $scheme = http ){
? ?return 666 "if-----> $scheme";
? }
}
location /bj {
? rewrite ^/bj/(.*) /beijing/$1 ?break;
}
}
?
mkdir beijing
echo beijing > beijing/index.html
?
mkdir bj
echo bj > bj/index.html
?
?
301 302 ? 請(qǐng)求后 ?告訴你重定向的域名, 讓你重新發(fā)起請(qǐng)求
break ? ? 服務(wù)器緩存好網(wǎng)頁(yè)直接讓你訪問(wèn),直接給你結(jié)果
?
實(shí)戰(zhàn)案例 http 轉(zhuǎn)https
server {
listen 443 ssl;
listen 80;
ssl_certificate /apps/nginx/certs/www.kgc.org.crt;
ssl_certificate_key /apps/nginx/certs/www.kgc.org.key;
ssl_session_cache shared:sslcache:20m;
ssl_session_timeout 10m;
server_name www.kgc.org;
location / { ? ?#針對(duì)全站跳轉(zhuǎn)
? root /data/nginx/html/pc;
? index index.html;
? ?if ($scheme = http ){ ?#如果沒(méi)有加條件判斷,會(huì)導(dǎo)致死循環(huán)
? rewrite / https://$host redirect;
? } ? ? http://www.kgc.com ? ? https://www.kgc.com ?
}
location /login { ? ? #針對(duì)特定的URL進(jìn)行跳轉(zhuǎn)https
if ($scheme = http ){ ?#如果沒(méi)有加條件判斷,會(huì)導(dǎo)致死循環(huán)
? rewrite / https://$host/login redirect;
? }
? }
}
10.6 防盜鏈
10.6.1什么是盜鏈?
盜鏈(Hotlinking)是指在一個(gè)網(wǎng)站上使用或顯示其他網(wǎng)站的資源(如圖片、視頻、音頻等)的行為,而不是通過(guò)將資源保存到本地服務(wù)器來(lái)引用這些資源。
盜鏈者直接鏈接到原始資源的URL,使得資源消耗原始網(wǎng)站的帶寬和服務(wù)器資源,會(huì)給原始網(wǎng)站帶來(lái)額外的負(fù)擔(dān),并且可能導(dǎo)致資源被濫用或不當(dāng)使用。
10.6.2 防盜鏈簡(jiǎn)介
Nginx的防盜鏈機(jī)制實(shí)現(xiàn),跟一個(gè)頭部字段:Referer有關(guān),該字段主要描述了當(dāng)前請(qǐng)求是從哪兒發(fā)出的,那么在Nginx中就可獲取該值,然后判斷是否為本站的資源引用請(qǐng)求,如果不是則不允許訪問(wèn)。
基本語(yǔ)法
valid_referers none | blocked | server_names | string ...;
?
none:表示接受沒(méi)有Referer字段的HTTP請(qǐng)求訪問(wèn)。
blocked:表示允許http://或https//以外的請(qǐng)求訪問(wèn)。
server_names:資源的白名單,這里可以指定允許訪問(wèn)的域名。
string:可自定義字符串,支配通配符、正則表達(dá)式寫(xiě)法。
實(shí)現(xiàn)防盜鏈
在第二臺(tái)機(jī)器上:
systemctl ? stop firewalld
setenforce ?0
yum install epel-release.noarch -y
yum install nginx
cd /usr/share/nginx/html
vim ?index.html
this is yunjisuan ?
systemctl start nginx ?
?
vim ? /etc/nginx/nginx.conf
41 ? ? ? ? server_name www.accp.com;
修改41行如上
?
真機(jī)上 添加dns ?解析
C:\Windows\System32\drivers\etc ?
打開(kāi) ?hosts ?文件 ?
第二臺(tái)機(jī)器的IP地址 ? ? ? www.accp.com
真機(jī)上測(cè)試
www.accp.com ?是否可以打開(kāi)圖片
?
第一臺(tái)服務(wù)器
vim ? /apps/nginx/conf.d/pc.conf
server{
? ? ? ?listen 80;
? ? ? ?server_name www.pc.com;
? ? ? ?root ? /data/nginx/pc;
? ? ? ?location / {
? ? ? ?root /data/nginx/pc;
}
? ? ? ?location ~* \.(jpg|gif|swf|jpeg|bmp)$ {
? ? ? ? root /data/nginx/pc;
? ? ? ? valid_referers none blocked *.pc.com pc.com;
? ? ? ? if ( $invalid_referer ) {
? ? ? ? ? #rewrite ^/ http://www.pc.com/error.png;
? ? ? ? ? return ? 403;
? ? ? }
? ? ? }
}
}
?
cd /data/nginx/pc/
拖入兩張圖片 ? a.jpg ? ? error.png
再次測(cè)試www.accp.com ?是否可以打開(kāi)圖片
?
?
?
?
?
?
?
?
www.kgc.com
www.accp.com
?
80
/data/nginx/kgc
/data/nginx/accp
?
server {
? listen 80;
server_name ? www.kgc.com;
root /data/nginx/kgc;
}
?
server {
? listen 80;
server_name ? www.accp.com;
root /data/nginx/accp;
}
?
location ~* \.(jpg|gif|swf)$ { ? ? ? ? ? ?
? ? ? ? root /data/nginx/pc;
? ? ? ? valid_referers none blocked *.pc.com pc.com; ?
? ? ? ? if ( $invalid_referer ) {
? ? ? ? ? rewrite ^/ http://www.pc.com/error.png;
? ? ? ? ? #return 403
? ? ? ? ? }
? ? ? }
? ? ? ?
? ? ? ?
? ? ? ?
~* \.(jpg|gif|swf)$:這段正則表達(dá)式表示匹配不區(qū)分大小寫(xiě),以.jpg 或.gif 或.swf 結(jié)尾的文件
Valid_referers:設(shè)置信任的網(wǎng)站,可以正常使用圖片。
None :瀏覽器中 referer 為空的情況,就是直接在瀏覽器訪問(wèn)圖片。
Blocked :referer 不為空的情況 ,但是值被代理或防火墻刪除了,這些值不以 http://或https://開(kāi)頭。后面的網(wǎng)址或者域名:referer 中包含相關(guān)字符串的網(wǎng)址。
If 語(yǔ)句:如果鏈接的來(lái)源域名不在 valid_referers 所列出的列表中,$invalid_referer 為1,則執(zhí)行后面的操作,即進(jìn)行重寫(xiě)或返回 403 頁(yè)面。
十一、正向代理與反向代理
11.1 正向代理簡(jiǎn)介
正向代理代理的是客戶端。
客戶端設(shè)備要訪問(wèn)局域網(wǎng)以外的 Internet 時(shí),需在客戶端瀏覽器中配置代理服務(wù)器,然后通過(guò)代理服 務(wù)器來(lái)進(jìn)行訪問(wèn),將訪問(wèn)到的局域網(wǎng)以外的 Internet 網(wǎng)站內(nèi)容返回給客戶端,而不是通過(guò)局域網(wǎng)中的客 戶端設(shè)備直接訪問(wèn)。
正向代理的用途:
訪問(wèn)原來(lái)無(wú)法訪問(wèn)的資源;
可做緩存,加速訪問(wèn)資源;
對(duì)客戶端訪問(wèn)授權(quán),上網(wǎng)進(jìn)行認(rèn)證;
代理可以記錄用戶訪問(wèn)記錄等,且對(duì)外隱藏用戶信息。
簡(jiǎn)單配置:
server {
? ?listen 80;
? ?server_name ....;#客戶端訪問(wèn)的域名或IP地址
?
? ?location / {
? ? ?proxy_pass http://目標(biāo)服務(wù)器地址;
? }
}
?
11.2 反向代理簡(jiǎn)介
反向代理代理的是服務(wù)端。
在使用反向代理時(shí),客戶端向一個(gè)服務(wù)器發(fā)送請(qǐng)求,而實(shí)際上該請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到后端的多個(gè)真實(shí)服務(wù)器(也稱為上游服務(wù)器),然后由反向代理服務(wù)器來(lái)處理請(qǐng)求并將結(jié)果返回給客戶端。
客戶端不直接與后端服務(wù)器進(jìn)行通信,而是與反向代理服務(wù)器進(jìn)行通信,隱藏了后端服務(wù)器的 IP 地址。
反向代理能實(shí)現(xiàn)的功能
反向代理的主要作用是提供負(fù)載均衡和高可用性。
負(fù)載均衡:Nginx可以將傳入的請(qǐng)求分發(fā)給多個(gè)后端服務(wù)器,以平衡服務(wù)器的負(fù)載,提高系統(tǒng)性能和可靠性。
緩存功能:Nginx可以緩存靜態(tài)文件或動(dòng)態(tài)頁(yè)面,減輕服務(wù)器的負(fù)載,提高響應(yīng)速度。
動(dòng)靜分離:將動(dòng)態(tài)生成的內(nèi)容(如 PHP、Python、Node.js 等)和靜態(tài)資源(如 HTML、CSS、JavaScript、圖片、視頻等)分別存放在不同的服務(wù)器或路徑上。
多站點(diǎn)代理:Nginx可以代理多個(gè)域名或虛擬主機(jī),將不同的請(qǐng)求轉(zhuǎn)發(fā)到不同的后端服務(wù)器上,實(shí)現(xiàn)多個(gè)站點(diǎn)的共享端口。
反向代理的可用模塊
ngx_http_proxy_module ? ?
#將客戶端的請(qǐng)求以http協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器進(jìn)行處理
ngx_http_upstream_module
#用于定義為proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服務(wù)器分組
ngx_stream_proxy_module ?
#將客戶端的請(qǐng)求以tcp協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器處理
ngx_http_fastcgi_module ?
#將客戶端對(duì)php的請(qǐng)求以fastcgi協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器助理
ngx_http_uwsgi_module ? ?
#將客戶端對(duì)Python的請(qǐng)求以u(píng)wsgi協(xié)議轉(zhuǎn)發(fā)至指定服務(wù)器處理
?
十二、配置反向代理
12.1 反向代理配置參數(shù)
12.1.1 proxy_pass
proxy_pass 地址:端口的方式 ; ?
#用來(lái)設(shè)置將客戶端請(qǐng)求轉(zhuǎn)發(fā)給的后端服務(wù)器的主機(jī),可以是主機(jī)名(將轉(zhuǎn)發(fā)至后端服務(wù)做為主機(jī)頭首部)、IP
#也可以代理到預(yù)先設(shè)置的主機(jī)群組,需要模塊ngx_http_upstream_module支持
#如果location定義其uri時(shí)使用了正則表達(dá)式模式(包括~,~*,但不包括^~),則proxy_pass之后必須不能使用uri; 即不能有/ ,用戶請(qǐng)求時(shí)傳遞的uri將直接附加至后端服務(wù)器之后
?
?
proxy_pass http://10.0.0.18:8080; 和
proxy_pass http://10.0.0.18:8080/;主要有以下區(qū)別:
?
1. 尾部斜杠的處理:在 `proxy_pass` 指令中,尾部斜杠的有無(wú)會(huì)影響代理的行為。當(dāng) `proxy_pass` 后跟一個(gè)斜杠 `/` 時(shí),表示將請(qǐng)求的 URI 附加到代理服務(wù)器的地址后面。而當(dāng) `proxy_pass` 后沒(méi)有斜杠時(shí),請(qǐng)求的 URI 將被完全忽略,并將直接轉(zhuǎn)發(fā)到指定的代理服務(wù)器。
?
? - `proxy_pass http://10.0.0.18:8080;`:請(qǐng)求將直接轉(zhuǎn)發(fā)到 `http://10.0.0.18:8080`,不附加任何 URI。
? - `proxy_pass http://10.0.0.18:8080/;`:請(qǐng)求將被附加上原始 URI,并轉(zhuǎn)發(fā)到 `http://10.0.0.18:8080`。
?
2. 請(qǐng)求路徑的保留:當(dāng)使用 `proxy_pass` 指令時(shí),代理服務(wù)器會(huì)保留原始請(qǐng)求的路徑信息。這意味著,無(wú)論使用哪種形式,原始請(qǐng)求的路徑將被傳遞到目標(biāo)服務(wù)器。只是在轉(zhuǎn)發(fā)時(shí)是否附加原始路徑的處理不同。
?
12.1.2 其余參數(shù)
proxy_hide_header field;
#用于nginx作為反向代理的時(shí)候,在返回給客戶端http響應(yīng)時(shí),隱藏后端服務(wù)器相應(yīng)頭部的信息,可以設(shè)置
?
proxy_pass_header field;
#默認(rèn)nginx在響應(yīng)報(bào)文中不傳遞后端服務(wù)器的首部字段Date, Server, X-Pad, X-Accel等參數(shù),如果
要傳遞的話則要使用 proxy_pass_header field聲明將后端服務(wù)器返回的值傳遞給客戶端
#field 首部字段大小不敏感
#示例:透?jìng)骱蠖朔?wù)器的Server和Date首部給客戶端,同時(shí)不再響應(yīng)報(bào)中顯示前端服務(wù)器的Server字段`
proxy_pass_header Server;
proxy_pass_header Date;
?
?
proxy_pass_request_body on | off;
#是否向后端服務(wù)器發(fā)送HTTP實(shí)體部分,可以設(shè)置在http,server或location塊,默認(rèn)即為開(kāi)啟
?
proxy_pass_request_headers on | off;
#是否將客戶端的請(qǐng)求頭部轉(zhuǎn)發(fā)給后端服務(wù)器,可以設(shè)置在http,server或location塊,默認(rèn)即為開(kāi)啟
2.2 配置實(shí)例:反向代理單臺(tái)web服務(wù)器
配置部分
7-1 ? 代理服務(wù)器
?
vim /apps/nginx/conf.d/computer.conf
#添加
location / {
? ?proxy_pass http://192.168.2.102;
}
?
7-2 ? 真實(shí)服務(wù)器
?
yum ?install ? httpd ?-y #安裝服務(wù)
?
cd /var/www/html
echo ? "Hello World" > index.html #主頁(yè)內(nèi)容
?
systemctl start httpd #開(kāi)啟服務(wù)
7-3 ? 客戶機(jī)
?
vim /etc/hosts
192.168.2.100 www.byyb.com
?
測(cè)試
7-3(客戶端)訪問(wèn) 7-2(代理服務(wù)器)
curl 192.168.2.100
Hello World
?
十三、反向代理實(shí)現(xiàn)動(dòng)靜分離
server {
listen 80;
server_name www.kgc.org;
location / {
? index index.html index.php;
? root /data/nginx/html/pc;
? }
location /api {
? #proxy_pass http://10.0.0.18:80/; #注意有后面的/, 表示置換
? proxy_pass http://192.168.91.101; ?#后面沒(méi)有 / , 表示追加
}
}
?
?
?
server {
......
location ~* \.(jpe?g|png|bmp|gif)$ {
? proxy_pass http://192.168.91.103; ? ? #如果加/ 語(yǔ)法出錯(cuò) ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
}
}
?
#如果 http://10.0.0.18/ 有 / 語(yǔ)法出錯(cuò)
?
?
?
server{
? ? ? ?listen 80;
? ? ? ?server_name www.pc.com;
? ? ? ?root ? /data/nginx/pc;
? ? location / {
? ? ? ?root /data/nginx/pc;
}
? ? location /api {
? ? ? ?root /data/nginx/pc;
? ? ? ?proxy_pass http://192.168.91.101:8080;
?
? ? ? }
? ? location ~* \.(jpg|jpeg|png|gif|bmp)$ {
? ? ? ?root /data/nginx/pc;
? ? ? ?proxy_pass http://192.168.91.102;
? ? ? }
?
}
十四、緩存功能
反向代理可以緩存靜態(tài)資源,如圖片、CSS和JavaScript文件等。
當(dāng)客戶端再次請(qǐng)求相同資源時(shí),反向代理可以直接返回緩存中的響應(yīng),減少對(duì)后端服務(wù)器的請(qǐng)求壓力,并加快響應(yīng)速度。
proxy_cache zone_name | off; 默認(rèn)off
#指明調(diào)用的緩存,或關(guān)閉緩存機(jī)制;Context:http, server, location
#zone_name 表示緩存的名稱.需要由proxy_cache_path事先定義
?
proxy_cache_key string;
#緩存中用于“鍵”的內(nèi)容,默認(rèn)值:proxy_cache_key $scheme$proxy_host$request_uri;
?
?
?
proxy_cache_valid [code ...] time;
#定義對(duì)特定響應(yīng)碼的響應(yīng)內(nèi)容的緩存時(shí)長(zhǎng),定義在http{...}中
示例:
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_path;
#定義可用于proxy功能的緩存;Context:http
proxy_cache_path path [levels=levels] [use_temp_path=on|off]
keys_zone=zone_name:size [inactive=time] [max_size=size] [manager_files=number]
[manager_sleep=time] [manager_threshold=time] [loader_files=number]
[loader_sleep=time] [loader_threshold=time] [purger=on|off]
[purger_files=number] [purger_sleep=time] [purger_threshold=time];
?
?
#示例:在http配置定義緩存信息
? proxy_cache_path /var/cache/nginx/proxy_cache #定義緩存保存路徑,proxy_cache會(huì)自動(dòng)創(chuàng)建
? levels=1:2:2 #定義緩存目錄結(jié)構(gòu)層次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576個(gè)目錄
? keys_zone=proxycache:20m #指內(nèi)存中緩存的大小,主要用于存放key和metadata(如:使用次數(shù)),一般1M可存放8000個(gè)左右的key
? inactive=120s ?#緩存有效時(shí)間 ?
? max_size=10g; #最大磁盤占用空間,磁盤存入文件內(nèi)容的緩存空間最大值
?
?
#調(diào)用緩存功能,需要定義在相應(yīng)的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #對(duì)指定的數(shù)據(jù)進(jìn)行MD5的運(yùn)算做為緩存的key
proxy_cache_valid 200 302 301 10m; #指定的狀態(tài)碼返回的數(shù)據(jù)緩存多長(zhǎng)時(shí)間
proxy_cache_valid any 1m; ? #除指定的狀態(tài)碼返回的數(shù)據(jù)以外的緩存多長(zhǎng)時(shí)間,必須設(shè)置,否則不會(huì)緩存
?
?
proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 |
http_502 | http_503 | http_504 | http_403 | http_404 | off ; #默認(rèn)是off
#在被代理的后端服務(wù)器出現(xiàn)哪種情況下,可直接使用過(guò)期的緩存響應(yīng)客戶端
#示例
proxy_cache_use_stale error http_502 http_503;
?
?
proxy_cache_methods GET | HEAD | POST ...;
#對(duì)哪些客戶端請(qǐng)求方法對(duì)應(yīng)的響應(yīng)進(jìn)行緩存,GET和HEAD方法總是被緩存
?
proxy_cache_path /data/nginx/proyxcache ? levels=1:1:1 keys_zone=proxycache:20m inactive=120s max_size=1g;
?
#上面那段寫(xiě)在 http語(yǔ)句
?
:1:1 ?16個(gè)二進(jìn)制
?
?
server {
? listen 80;
? proxy_cache proxycache;
? proxy_cache_key $request_uri;
? #proxy_cache_key $host$uri$is_args$args;
? proxy_cache_valid 200 302 301 10m;
? proxy_cache_valid any 5m;
? server_name www.kgc.com;
? root /data/nginx/pc;
?location / {
?root /data/nginx/pc;
}
?location /api {
?proxy_pass http://192.168.91.101:9527;
}
?location ~* \.(jpg|png|gif|html)$ {
?proxy_pass http://192.168.91.102;
}
?
}
?
?
十五、反向代理客戶端的IP透?jìng)?/p>
15.1 原理概述
反向代理客戶端IP透?jìng)魇侵冈谑褂梅聪虼矸?wù)器時(shí),將客戶端的真實(shí)IP地址傳遞給后端服務(wù)器。
這可以通過(guò)一些特定的 HTTP 頭字段來(lái)實(shí)現(xiàn),比如 X-Forwarded-For (XFF) 頭字段。
當(dāng)請(qǐng)求經(jīng)過(guò)反向代理服務(wù)器時(shí),代理服務(wù)器會(huì)將客戶端的真實(shí)IP地址添加到 XFF 頭字段中,然后轉(zhuǎn)發(fā)給后端服務(wù)器。
15.2 一級(jí)代理
配置部分
7-1 代理服務(wù)器
?
#編輯子配置文件
vim /apps/nginx/conf.d/computer.conf
#修改location部分
location / {
? index index.html index.php;
? root /data/nginx/html/pc;
? proxy_pass http://192.168.2.102;
? proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
#####
`$proxy_add_x_forwarded_for` 是一個(gè) nginx 變量,用于獲取客戶端的真實(shí) IP 地址并將其添加到請(qǐng)求中的 `X-Forwarded-For` 頭字段中,后端服務(wù)器可以通過(guò)檢查該頭字段來(lái)獲取請(qǐng)求的真實(shí)客戶端 IP 地址。
?
`X-Forwarded-For` 頭字段是一個(gè)常用的 HTTP 請(qǐng)求頭,用于指示請(qǐng)求的真實(shí)客戶端 IP 地址。
?
7-2 后端服務(wù)器
?
#關(guān)閉防火墻和selinux
systemctl stop firewalld
setenforce 0
?
#安裝服務(wù)
yum install -y epel-release #依賴
yum install nginx -y
systemctl start nginx
?
?
?
測(cè)試部分
7-3客戶端,訪問(wèn)代理服務(wù)器
curl 192.168.2.100
?
7-2 后端服務(wù)器,查看日志
cat /var/log/nginx/access.log | tail -n -2
#后端服務(wù)器可以看到客戶端的真實(shí)地址
?
?
十六、反向代理負(fù)載均衡
Nginx 可以基于ngx_http_upstream_module模塊提供服務(wù)器分組轉(zhuǎn)發(fā)、權(quán)重分配、狀態(tài)監(jiān)測(cè)、調(diào)度算法等高級(jí)功能。
16.1 工作原理
Nginx負(fù)載均衡通過(guò)將傳入的請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器來(lái)實(shí)現(xiàn)負(fù)載均衡。
它可以根據(jù)不同的調(diào)度算法(如輪詢、IP哈希、最小連接數(shù)等)將請(qǐng)求分發(fā)到后端服務(wù)器。
16.2 部分配置參數(shù)
s
erver address [parameters];
#配置一個(gè)后端web服務(wù)器,配置在upstream內(nèi),至少要有一個(gè)server服務(wù)器配置。
#server支持的parameters如下:
?
weight=number #設(shè)置權(quán)重,默認(rèn)為1,實(shí)現(xiàn)類似于LVS中的WRR,WLC等
?
max_conns=number ?#給當(dāng)前后端server設(shè)置最大活動(dòng)鏈接數(shù),默認(rèn)為0表示沒(méi)有限制
max_fails=number ?#后端服務(wù)器的下線條件,當(dāng)客戶端訪問(wèn)時(shí),對(duì)本次調(diào)度選中的后端服務(wù)器連續(xù)進(jìn)行檢測(cè)多少次,如果都失敗就標(biāo)記為不可用,默認(rèn)為1次,當(dāng)客戶端訪問(wèn)時(shí),才會(huì)利用TCP觸發(fā)對(duì)探測(cè)后端服務(wù)器健康性檢查,而非周期性的探測(cè)
?
fail_timeout=time #后端服務(wù)器的上線條件,對(duì)已經(jīng)檢測(cè)到處于不可用的后端服務(wù)器,每隔此時(shí)間間隔再次進(jìn)行檢測(cè)是否恢復(fù)可用,如果發(fā)現(xiàn)可用,則將后端服務(wù)器參與調(diào)度,默認(rèn)為10秒
?
?
?
sorry server ? 自己不能轉(zhuǎn)自己
?
down ? ?#標(biāo)記為down狀態(tài)
?
resolve #當(dāng)server定義的是主機(jī)名的時(shí)候,當(dāng)A記錄發(fā)生變化會(huì)自動(dòng)應(yīng)用新IP而不用重啟Nginx
backup ?#設(shè)置為備份服務(wù)器,當(dāng)所有后端服務(wù)器不可用時(shí),才會(huì)啟用此備用服務(wù)器
?
upstream backend {
? ?server backend1.example.com;
? ?server backend2.example.com backup;
? ?server backend3.example.com;
}
?
16.3 調(diào)度算法
1)輪詢(Round Robin):這是默認(rèn)的調(diào)度算法,Nginx依次分配每個(gè)請(qǐng)求給后端服務(wù)器,實(shí)現(xiàn)簡(jiǎn)單且公平的請(qǐng)求分發(fā)。
http {
? ?upstream backend {
? ? ? ?server backend1.example.com;
? ? ? ?server backend2.example.com;
? }
? ?
? ?server {
? ? ? ?listen 80;
? ? ? ?location / {
? ? ? ? ? ?proxy_pass http://backend;
? ? ? }
? }
}
?
2)加權(quán)輪詢(Weighted Round Robin):通過(guò)為每個(gè)后端服務(wù)器指定一個(gè)權(quán)重,根據(jù)權(quán)重比例來(lái)分配請(qǐng)求。具有更高權(quán)重的服務(wù)器將獲得更多的請(qǐng)求。
http {
? ?upstream backend {
? ? ? ?server backend1.example.com weight=3;
? ? ? ?server backend2.example.com weight=1;
? }
? ?
? ?server {
? ? ? ?listen 80;
? ? ? ?location / {
? ? ? ? ? ?proxy_pass http://backend;
? ? ? }
? }
?
}
?
3)IP Hash:根據(jù)客戶端的IP地址進(jìn)行散列,將同一IP的請(qǐng)求分配給同一臺(tái)后端服務(wù)器,實(shí)現(xiàn)會(huì)話保持。
http {
? ?upstream backend {
? ? ? ?ip_hash;
? ? ? ?server backend1.example.com;
? ? ? ?server backend2.example.com;
? }
? ?
? ?server {
? ? ? ?listen 80;
? ? ? ?location / {
? ? ? ? ? ?proxy_pass http://backend;
? ? ? }
? }
}
?
4)URL哈希(URL Hash):基于請(qǐng)求的URL進(jìn)行散列計(jì)算,將相同URL的請(qǐng)求分發(fā)到同一臺(tái)后端服務(wù)器,用于緩存或會(huì)話的需要。
http {
? ?upstream backend {
? ? ? ?hash $request_uri;
? ? ? ?server backend1.example.com;
? ? ? ?server backend2.example.com;
? }
? ?
? ?server {
? ? ? ?listen 80;
? ? ? ?location / {
? ? ? ? ? ?proxy_pass http://backend;
? ? ? }
? }
}
?
5)參數(shù)哈希(Parameter Hash):基于請(qǐng)求的特定參數(shù)進(jìn)行散列計(jì)算,將具有相同參數(shù)值的請(qǐng)求分發(fā)到同一臺(tái)后端服務(wù)器。
6)最小連接數(shù)(Least Connections):將請(qǐng)求分發(fā)給連接數(shù)最少的服務(wù)器,以確保服務(wù)器的負(fù)載盡可能均衡。
http {
? ?upstream backend {
? ? ? least_conn;
? ? ? ?server backend1.example.com;
? ? ? ?server backend2.example.com;
? }
? ?
? ?server {
? ? ? ?listen 80;
? ? ? ?location / {
? ? ? ? ? ?proxy_pass http://backend;
? ? ? }
? }
}
?
7)最少響應(yīng)時(shí)間(Least Time):根據(jù)服務(wù)器的響應(yīng)時(shí)間進(jìn)行選擇,將請(qǐng)求分配給響應(yīng)時(shí)間最短的服務(wù)器。
柚子快報(bào)激活碼778899分享:運(yùn)維 nginx全解
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。