全面了解 Nginx

作者:Lion
https://juejin.cn/post/6942607113118023710


高并發(fā)、高性能;
模塊化架構(gòu)使得它的擴展性非常好;
異步非阻塞的事件驅(qū)動模型這點和 Node.js 相似;
相對于其它服務(wù)器來說它可以連續(xù)幾個月甚至更長而不需要重啟服務(wù)器使得它具有高可靠性;
熱部署、平滑升級;
完全開源,生態(tài)繁榮。

靜態(tài)資源服務(wù),通過本地文件系統(tǒng)提供服務(wù);
反向代理服務(wù),延伸出包括緩存、負(fù)載均衡等;
API 服務(wù),OpenResty;


yum install nginx -y
# Nginx 配置文件
/etc/nginx/nginx.conf # Nginx 主配置文件
/etc/nginx/nginx.conf.default
# 可執(zhí)行程序文件
/usr/bin/nginx-upgrade
/usr/sbin/nginx
# Nginx 庫文件
/usr/lib/systemd/system/nginx.service # 用于配置系統(tǒng)守護進程
/usr/lib64/nginx/modules # Nginx 模塊目錄
# 幫助文檔
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/CHANGES
/usr/share/doc/nginx-1.16.1/README
/usr/share/doc/nginx-1.16.1/README.dynamic
/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10
# 靜態(tài)資源目錄
/usr/share/nginx/html/404.html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
# 存放 Nginx 日志文件
/var/log/nginx
/etc/nginx/conf.d/ 是子配置項存放處,/etc/nginx/nginx.conf 主配置文件會默認(rèn)把這個文件夾中所有子配置項都引入;
/usr/share/nginx/html/ 靜態(tài)文件都放在這個文件夾,也可以根據(jù)你自己的習(xí)慣放在其他地方。

# 開機配置
systemctl enable nginx # 開機自動啟動
systemctl disable nginx # 關(guān)閉開機自動啟動
# 啟動 Nginx
systemctl start nginx # 啟動Nginx成功后,可以直接訪問主機IP,此時會展示Nginx默認(rèn)頁面
# 停止 Nginx
systemctl stop nginx
# 重啟 Nginx
systemctl restart nginx
# 重新加載 Nginx
systemctl reload nginx
# 查看 Nginx 運行狀態(tài)
systemctl status nginx
# 查看 Nginx 進程
ps -ef | grep nginx
# 殺死 Nginx 進程
kill -9 pid # 根據(jù)上面查看到的 Nginx 進程號,殺死 Nginx 進程,-9 表示強制結(jié)束進程
nginx -s reload # 向主進程發(fā)送信號,重新加載配置文件,熱重啟
nginx -s reopen # 重啟 Nginx
nginx -s stop # 快速關(guān)閉
nginx -s quit # 等待工作進程處理完成后關(guān)閉
nginx -T # 查看當(dāng)前 Nginx 最終的配置
nginx -t # 檢查配置是否有問題

# main 段配置信息
user nginx; # 運行用戶,默認(rèn)即是 Nginx,可以不進行設(shè)置
worker_processes auto; # Nginx 進程數(shù),一般設(shè)置為和 CPU 核數(shù)一樣
error_log /var/log/nginx/error.log warn; # Nginx 的錯誤日志存放目錄
pid /var/run/nginx.pid; # Nginx 服務(wù)啟動時的 pid 存放位置
# events 段配置信息
events {
use epoll; # 使用 epoll 的 I/O 模型(如果你不知道 Nginx 該使用哪種輪詢方法,會自動選擇一個最適合你操作系統(tǒng)的)
worker_connections 1024; # 每個進程允許最大并發(fā)數(shù)
}
# http 段配置信息
# 配置使用最頻繁的部分,代理、緩存、日志定義等絕大多數(shù)功能和第三方模塊的配置都在這里設(shè)置
http {
# 設(shè)置日志模式
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 /var/log/nginx/access.log main; # Nginx 訪問日志存放位置
sendfile on; # 開啟高效傳輸模式
tcp_nopush on; # 減少網(wǎng)絡(luò)報文段的數(shù)量
tcp_nodelay on;
keepalive_timeout 65; # 保持連接的時間,也叫超時時間,單位秒
types_hash_max_size 2048;
include /etc/nginx/mime.types; # 文件擴展名與類型映射表
default_type application/octet-stream; # 默認(rèn)文件類型
include /etc/nginx/conf.d/*.conf; # 加載子配置項
# server段配置信息
server {
listen 80; # 配置監(jiān)聽的端口
server_name localhost; # 配置的域名
# location段配置信息
location / {
root /usr/share/nginx/html; # 網(wǎng)站根目錄
index index.html index.htm; # 默認(rèn)首頁文件
deny 172.168.22.11; # 禁止訪問的 ip 地址,可以為 all
allow 172.168.33.44;# 允許訪問的 ip 地址,可以為 all
}
error_page 500 502 503 504 /50x.html; # 默認(rèn) 50x 對應(yīng)的訪問頁面
error_page 400 404 error.html; # 同上
}
}
main 全局配置,對全局生效;
events 配置影響 Nginx 服務(wù)器與用戶的網(wǎng)絡(luò)連接;
http 配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置;
server 配置虛擬主機的相關(guān)參數(shù),一個 http 塊中可以有多個 server 塊;
location 用于配置匹配的 uri ;
upstream 配置后端服務(wù)器具體地址,負(fù)載均衡配置不可或缺的部分。

user USERNAME [GROUP]
user nginx lion; # 用戶是 Nginx;組是 lion
pid /opt/nginx/logs/nginx.pid # master主進程的的 pid 存放在 nginx.pid 的文件
worker_rlimit_nofile 20480; # 可以理解成每個 worker 子進程的最大連接數(shù)量。
worker_rlimit_core 50M; # 存放大小限制
working_directory /opt/nginx/tmp; # 存放目錄
worker_processes 4; # 指定具體子進程數(shù)量
worker_processes auto; # 與當(dāng)前 CPU 物理核心數(shù)一致
worker_cpu_affinity 0001 0010 0100 1000; # 4個物理核心,4個 worker 子進程

worker_priority -10; # 120-10=110,110 就是最終的優(yōu)先級
worker_shutdown_timeout 5s;
timer_resolution 100ms;
daemon off; # 默認(rèn)是 on,后臺運行模式
use method; # 不推薦配置它,讓 Nginx 自己選擇
method 可選值為:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections 1024 # 每個子進程的最大連接數(shù)為 1024
accept_mutex on # 默認(rèn)是 off 關(guān)閉的,這里推薦打開
server_name name1 name2 name3
# 示例:
server_name www.nginx.com;
精確匹配:server_name www.nginx.com ;
左側(cè)通配:server_name *.nginx.com ;
右側(cè)統(tǒng)配:server_name www.nginx.* ;
正則匹配:server_name ~^www\.nginx\.*$ ;
# 添加如下內(nèi)容,其中 121.42.11.34 是阿里云服務(wù)器 IP 地址
121.42.11.34 www.nginx-test.com
121.42.11.34 mail.nginx-test.com
121.42.11.34 www.nginx-test.org
121.42.11.34 doc.nginx-test.com
121.42.11.34 www.nginx-test.cn
121.42.11.34 fe.nginx-test.club
# 這里只列舉了 http 端中的 sever 端配置
# 左匹配
server {
listen 80;
server_name *.nginx-test.com;
root /usr/share/nginx/html/nginx-test/left-match/;
location / {
index index.html;
}
}
# 正則匹配
server {
listen 80;
server_name ~^.*\.nginx-test\..*$;
root /usr/share/nginx/html/nginx-test/reg-match/;
location / {
index index.html;
}
}
# 右匹配
server {
listen 80;
server_name www.nginx-test.*;
root /usr/share/nginx/html/nginx-test/right-match/;
location / {
index index.html;
}
}
# 完全匹配
server {
listen 80;
server_name www.nginx-test.com;
root /usr/share/nginx/html/nginx-test/all-match/;
location / {
index index.html;
}
}
當(dāng)訪問 www.nginx-test.com 時,都可以被匹配上,因此選擇優(yōu)先級最高的“完全匹配”;
當(dāng)訪問 mail.nginx-test.com 時,會進行“左匹配”;
當(dāng)訪問 www.nginx-test.org 時,會進行“右匹配”;
當(dāng)訪問 doc.nginx-test.com 時,會進行“左匹配”;
當(dāng)訪問 www.nginx-test.cn 時,會進行“右匹配”;
當(dāng)訪問 fe.nginx-test.club 時,會進行“正則匹配”;
root path
例如:
location /image {
root /opt/nginx/static;
}
當(dāng)用戶訪問 www.test.com/image/1.png 時,實際在服務(wù)器找的路徑是 /opt/nginx/static/image/1.png
location /image {
alias /opt/nginx/static/image/;
}
當(dāng)用戶訪問 www.test.com/image/1.png 時,實際在服務(wù)器找的路徑是 /opt/nginx/static/image/1.png
location [ = | ~ | ~* | ^~ ] uri {
...
}
= 精確匹配;
~ 正則匹配,區(qū)分大小寫;
~* 正則匹配,不區(qū)分大小寫;
^~ 匹配到即停止搜索;
server {
listen 80;
server_name www.nginx-test.com;
# 只有當(dāng)訪問 www.nginx-test.com/match_all/ 時才會匹配到/usr/share/nginx/html/match_all/index.html
location = /match_all/ {
root /usr/share/nginx/html
index index.html
}
# 當(dāng)訪問 www.nginx-test.com/1.jpg 等路徑時會去 /usr/share/nginx/images/1.jpg 找對應(yīng)的資源
location ~ \.(jpeg|jpg|png|svg)$ {
root /usr/share/nginx/images;
}
# 當(dāng)訪問 www.nginx-test.com/bbs/ 時會匹配上 /usr/share/nginx/html/bbs/index.html
location ^~ /bbs/ {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
location /test {
...
}
location /test/ {
...
}
不帶 / 當(dāng)訪問 www.nginx-test.com/test 時, Nginx 先找是否有 test 目錄,如果有則找 test 目錄下的 index.html;如果沒有 test 目錄,Nginx 則會找是否有 test 文件。
帶 / 當(dāng)訪問 www.nginx-test.com/test 時,Nginx 先找是否有 test 目錄,如果有則找 test 目錄下的 index.html,如果沒有它也不會去找是否存在 test 文件。
return code [text];
return code URL;
return URL;
例如:
location / {
return 404; # 直接返回狀態(tài)碼
}
location / {
return 404 "pages not found"; # 返回狀態(tài)碼 + 一段文本
}
location / {
return 302 /bbs ; # 返回狀態(tài)碼 + 重定向地址
}
location / {
return https://www.baidu.com ; # 返回重定向地址
}
語法:rewrite 正則表達式 要替換的內(nèi)容 [flag];
上下文:server、location、if
示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括號(.*\.jpg)的反向引用
last 重寫后的 URL 發(fā)起新請求,再次進入 server 段,重試 location 的中的匹配;
break 直接使用重寫后的 URL ,不再匹配其它 location 中語句;
redirect 返回 302 臨時重定向;
permanent 返回 301 永久重定向;
server{
listen 80;
server_name fe.lion.club; # 要在本地 hosts 文件進行配置
root html;
location /search {
rewrite ^/(.*) https://www.baidu.com redirect;
}
location /images {
rewrite /images/(.*) /pics/$1;
}
location /pics {
rewrite /pics/(.*) /photos/$1;
}
location /photos {
}
}
當(dāng)訪問 fe.lion.club/search 時,會自動幫我們重定向到 https://www.baidu.com。
當(dāng)訪問 fe.lion.club/images/1.jpg 時,第一步重寫 URL 為 fe.lion.club/pics/1.jpg,找到 pics 的 location,繼續(xù)重寫 URL 為 fe.lion.club/photos/1.jpg,找到 /photos 的 location 后,去 html/photos 目錄下尋找 1.jpg 靜態(tài)資源。
語法:if (condition) {...}
上下文:server、location
示例:
if($http_user_agent ~ Chrome){
rewrite /(.*)/browser/$1 break;
}
$variable 僅為變量時,值為空或以 0 開頭字符串都會被當(dāng)做 false 處理;
= 或 != 相等或不等;
~ 正則匹配;
! ~ 非正則匹配;
~* 正則匹配,不區(qū)分大小寫;
-f 或 ! -f 檢測文件存在或不存在;
-d 或 ! -d 檢測目錄存在或不存在;
-e 或 ! -e 檢測文件、目錄、符號鏈接等存在或不存在;
-x 或 ! -x 檢測文件可以執(zhí)行或不可執(zhí)行;
server {
listen 8080;
server_name localhost;
root html;
location / {
if ( $uri = "/images/" ){
rewrite (.*) /pics/ break;
}
}
}
server {
listen 80;
server_name fe.lion-test.club;
location /download/ {
root /opt/source;
autoindex on; # 打開 autoindex,,可選參數(shù)有 on | off
autoindex_exact_size on; # 修改為 off,以 KB、MB、GB 顯示文件大小,默認(rèn)為 on,以 bytes 顯示出?件的確切??
autoindex_format html; # 以 html 的方式進行格式化,可選參數(shù)有 html | json | xml
autoindex_localtime off; # 顯示的?件時間為?件的服務(wù)器時間。默認(rèn)為 off,顯示的?件時間為GMT時間
}
}


server{
listen 8081;
server_name var.lion-test.club;
root /usr/share/nginx/html;
location / {
return 200 "
remote_addr: $remote_addr
remote_port: $remote_port
server_addr: $server_addr
server_port: $server_port
server_protocol: $server_protocol
binary_remote_addr: $binary_remote_addr
connection: $connection
uri: $uri
request_uri: $request_uri
scheme: $scheme
request_method: $request_method
request_length: $request_length
args: $args
arg_pid: $arg_pid
is_args: $is_args
query_string: $query_string
host: $host
http_user_agent: $http_user_agent
http_referer: $http_referer
http_via: $http_via
request_time: $request_time
https: $https
request_filename: $request_filename
document_root: $document_root
";
}
}
remote_addr: 27.16.220.84
remote_port: 56838
server_addr: 172.17.0.2
server_port: 8081
server_protocol: HTTP/1.1
binary_remote_addr: 茉
connection: 126
uri: /test/
request_uri: /test/?pid=121414&cid=sadasd
scheme: http
request_method: GET
request_length: 518
args: pid=121414&cid=sadasd
arg_pid: 121414
is_args: ?
query_string: pid=121414&cid=sadasd
host: var.lion-test.club
http_user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36
http_referer:
http_via:
request_time: 0.000
https:
request_filename: /usr/share/nginx/html/test/
document_root: /usr/share/nginx/html


隱藏真實服務(wù)器;
負(fù)載均衡便于橫向擴充后端動態(tài)服務(wù);
動靜分離,提升系統(tǒng)健壯性;


輪詢策略:默認(rèn)情況下采用的策略,將所有客戶端請求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺服務(wù)器壓力太大,出現(xiàn)延遲,會影響所有分配在這臺服務(wù)器下的用戶。
最小連接數(shù)策略:將請求優(yōu)先分配給壓力較小的服務(wù)器,它可以平衡每個隊列的長度,并避免向壓力大的服務(wù)器添加更多的請求。
最快響應(yīng)時間策略:優(yōu)先分配給響應(yīng)時間最短的服務(wù)器。
客戶端 IP 綁定策略:來自同一個 IP 的請求永遠只分配一臺服務(wù)器,有效解決了動態(tài)網(wǎng)頁存在的 session 共享問題。


語法:upstream name {
...
}
上下文:http
示例:
upstream back_end_server{
server 192.168.100.33:8081
}
server 定義上游服務(wù)器地址;
zone 定義共享內(nèi)存,用于跨 worker 子進程;
keepalive 對上游服務(wù)啟用長連接;
keepalive_requests 一個長連接最多請求 HTTP 的個數(shù);
keepalive_timeout 空閑情形下,一個長連接的超時時長;
hash 哈希負(fù)載均衡算法;
ip_hash 依據(jù) IP 進行哈希計算的負(fù)載均衡算法;
least_conn 最少連接數(shù)負(fù)載均衡算法;
least_time 最短響應(yīng)時間負(fù)載均衡算法;
random 隨機負(fù)載均衡算法;
語法:server address [parameters]
上下文:upstream
weight=number 權(quán)重值,默認(rèn)為 1;
max_conns=number 上游服務(wù)器的最大并發(fā)連接數(shù);
fail_timeout=time 服務(wù)器不可用的判定時間;
max_fails=numer 服務(wù)器不可用的檢查次數(shù);
backup 備份服務(wù)器,僅當(dāng)其他服務(wù)器都不可用時才會啟用;
down 標(biāo)記服務(wù)器長期不可用,離線維護;
keepalive connections;
上下文:upstream
示例:keepalive 16;
語法:keepalive_requests number;
默認(rèn)值:keepalive_requests 100;
上下文:upstream
語法:keepalive_timeout time;
默認(rèn)值:keepalive_timeout 60s;
上下文:upstream
upstream back_end{
server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
keepalive 32;
keepalive_requests 50;
keepalive_timeout 30s;
}
語法:proxy_pass URL;
上下文:location、if、limit_except
示例:
proxy_pass http://127.0.0.1:8081
proxy_pass http://127.0.0.1:8081/proxy
URL 必須以 http 或 https 開頭;
URL 中可以攜帶變量;
URL 中是否帶 URI ,會直接影響發(fā)往上游請求的 URL;
proxy_pass http://192.168.100.33:8081
proxy_pass http://192.168.100.33:8081/
不帶 / 意味著 Nginx 不會修改用戶 URL,而是直接透傳給上游的應(yīng)用服務(wù)器;
帶 / 意味著 Nginx 會修改用戶 URL ,修改方法是將 location 后的 URL 從用戶 URL 中刪除;
location /bbs/{
proxy_pass http://127.0.0.1:8080;
}
用戶請求 URL:/bbs/abc/test.html
請求到達 Nginx 的 URL:/bbs/abc/test.html
請求到達上游應(yīng)用服務(wù)器的 URL :/bbs/abc/test.html
location /bbs/{
proxy_pass http://127.0.0.1:8080/;
}
用戶請求 URL:/bbs/abc/test.html
請求到達 Nginx 的 URL:/bbs/abc/test.html
請求到達上游應(yīng)用服務(wù)器的 URL:/abc/test.html
# /etc/nginx/conf.d/proxy.conf
server{
listen 8080;
server_name localhost;
location /proxy/ {
root /usr/share/nginx/html/proxy;
index index.html;
}
}
# /usr/share/nginx/html/proxy/index.html
<h1> 121.42.11.34 proxy html </h1>
# /etc/nginx/conf.d/proxy.conf
upstream back_end {
server 121.42.11.34:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;
keepalive 32;
keepalive_requests 80;
keepalive_timeout 20s;
}
server {
listen 80;
server_name proxy.lion.club;
location /proxy {
proxy_pass http://back_end/proxy;
}
}
121.5.180.193 proxy.lion.club

當(dāng)訪問 proxy.lion.club/proxy 時通過 upstream 的配置找到 121.42.11.34:8080;
因此訪問地址變?yōu)?nbsp;http://121.42.11.34:8080/proxy;
連接到 121.42.11.34 服務(wù)器,找到 8080 端口提供的 server;
通過 server 找到 /usr/share/nginx/html/proxy/index.html 資源,最終展示出來。
server{
listen 8020;
location / {
return 200 'return 8020 \n';
}
}
server{
listen 8030;
location / {
return 200 'return 8030 \n';
}
}
server{
listen 8040;
location / {
return 200 'return 8040 \n';
}
}
nginx -t 檢測配置是否正確;
nginx -s reload 重啟 Nginx 服務(wù)器;
執(zhí)行 ss -nlt 命令查看端口是否被占用,從而判斷 Nginx 服務(wù)是否正確啟動。
upstream demo_server {
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
# /etc/hosts
121.5.180.193 balance.lion.club

upstream demo_server {
hash $request_uri;
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
upstream demo_server {
ip_hash;
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
語法:least_conn;
上下文:upstream;
upstream demo_server {
zone test 10M; # zone可以設(shè)置共享內(nèi)存空間的名字和大小
least_conn;
server 121.42.11.34:8020;
server 121.42.11.34:8030;
server 121.42.11.34:8040;
}
server {
listen 80;
server_name balance.lion.club;
location /balance/ {
proxy_pass http://demo_server;
}
}
語法:proxy_cache zone | off ; # zone 是共享內(nèi)存的名稱
默認(rèn)值:proxy_cache off;
上下文:http、server、location
語法:proxy_cache_path path [level=levels] ...可選參數(shù)省略,下面會詳細列舉
默認(rèn)值:proxy_cache_path off
上下文:http
path 緩存文件的存放路徑;
level path 的目錄層級;
keys_zone 設(shè)置共享內(nèi)存;
inactive 在指定時間內(nèi)沒有被訪問,緩存會被清理,默認(rèn)10分鐘;
語法:proxy_cache_key
默認(rèn)值:proxy_cache_key $scheme$proxy_host$request_uri;
上下文:http、server、location
語法:proxy_cache_valid [code...] time;
上下文:http、server、location
配置示例:proxy_cache_valid 200 304 2m;; # 說明對于狀態(tài)為 200 和 304 的緩存文件的緩存時間是 2 分鐘
語法:proxy_no_cache string;
上下文:http、server、location
示例:proxy_no_cache $http_pragma $http_authorization;
語法:proxy_cache_bypass string;
上下文:http、server、location
示例:proxy_cache_bypass $http_pragma $http_authorization;
MISS:未命中緩存
HIT:命中緩存
EXPIRED:緩存過期
STALE:命中了陳舊緩存
REVALIDDATED:Nginx 驗證陳舊緩存依然有效
UPDATING:內(nèi)容陳舊,但正在更新
BYPASS:X響應(yīng)從原始服務(wù)器獲取
server {
listen 1010;
root /usr/share/nginx/html/1010;
location / {
index index.html;
}
}
server {
listen 1020;
root /usr/share/nginx/html/1020;
location / {
index index.html;
}
}
proxy_cache_path /etc/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=2g inactive=60m use_temp_path=off;
upstream cache_server{
server 121.42.11.34:1010;
server 121.42.11.34:1020;
}
server {
listen 80;
server_name cache.lion.club;
location / {
proxy_cache cache_zone; # 設(shè)置緩存內(nèi)存,上面配置中已經(jīng)定義好的
proxy_cache_valid 200 5m; # 緩存狀態(tài)為 200 的請求,緩存時長為 5 分鐘
proxy_cache_key $request_uri; # 緩存文件的 key 為請求的URI
add_header Nginx-Cache-Status $upstream_cache_status # 把緩存狀態(tài)設(shè)置為頭部信息,響應(yīng)給客戶端
proxy_pass http://cache_server; # 代理轉(zhuǎn)發(fā)
}
}
...
server {
listen 80;
server_name cache.lion.club;
# URI 中后綴為 .txt 或 .text 的設(shè)置變量值為 "no cache"
if ($request_uri ~ \.(txt|text)$) {
set $cache_name "no cache"
}
location / {
proxy_no_cache $cache_name; # 判斷該變量是否有值,如果有值則不進行緩存,如果沒有值則進行緩存
proxy_cache cache_zone; # 設(shè)置緩存內(nèi)存
proxy_cache_valid 200 5m; # 緩存狀態(tài)為 200的請求,緩存時長為 5 分鐘
proxy_cache_key $request_uri; # 緩存文件的 key 為請求的 URI
add_header Nginx-Cache-Status $upstream_cache_status # 把緩存狀態(tài)設(shè)置為頭部信息,響應(yīng)給客戶端
proxy_pass http://cache_server; # 代理轉(zhuǎn)發(fā)
}
}
客戶端(瀏覽器)訪問 https://www.baidu.com 百度網(wǎng)站;
百度服務(wù)器返回 HTTPS 使用的 CA 證書;
瀏覽器驗證 CA 證書是否為合法證書;
驗證通過,證書合法,生成一串隨機數(shù)并使用公鑰(證書中提供的)進行加密;
發(fā)送公鑰加密后的隨機數(shù)給百度服務(wù)器;
百度服務(wù)器拿到密文,通過私鑰進行解密,獲取到隨機數(shù)(公鑰加密,私鑰解密,反之也可以);
百度服務(wù)器把要發(fā)送給瀏覽器的內(nèi)容,使用隨機數(shù)進行加密后傳輸給瀏覽器;
此時瀏覽器可以使用隨機數(shù)進行解密,獲取到服務(wù)器的真實傳輸內(nèi)容。
server {
listen 443 ssl http2 default_server; # SSL 訪問端口號為 443
server_name lion.club; # 填寫綁定證書的域名(我這里是隨便寫的)
ssl_certificate /etc/nginx/https/lion.club_bundle.crt; # 證書地址
ssl_certificate_key /etc/nginx/https/lion.club.key; # 私鑰地址
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 支持ssl協(xié)議版本,默認(rèn)為后三個,主流版本是[TLSv1.2]
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
http://store.company.com/dir2/other.html 同源
https://store.company.com/secure.html 不同源,協(xié)議不同
http://store.company.com:81/dir/etc.html 不同源,端口不同
http://news.company.com/dir/other.html 不同源,主機不同
Web 數(shù)據(jù)層面,同源策略限制了不同源的站點讀取當(dāng)前站點的 Cookie、IndexDB、LocalStorage 等數(shù)據(jù)。
DOM 層面,同源策略限制了來自不同源的 JavaScript 腳本對當(dāng)前 DOM 對象讀和寫的操作。
網(wǎng)絡(luò)層面,同源策略限制了通過 XMLHttpRequest 等方式將站點的數(shù)據(jù)發(fā)送給不同源的站點。
前端 server 的域名為:fe.server.com
后端服務(wù)的域名為:dev.server.com
server {
listen 80;
server_name fe.server.com;
location / {
proxy_pass dev.server.com;
}
}


# # 默認(rèn) off,是否開啟 gzip
gzip on;
# 要采用 gzip 壓縮的 MIME 文件類型,其中 text/html 被系統(tǒng)強制啟用;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# ---- 以上兩個參數(shù)開啟就可以支持 Gzip 壓縮了 ---- #
# 默認(rèn) off,該模塊啟用后,Nginx 首先檢查是否存在請求靜態(tài)文件的 gz 結(jié)尾的文件,如果有則直接返回該 .gz 文件內(nèi)容;
gzip_static on;
# 默認(rèn) off,Nginx 做為反向代理時啟用,用于設(shè)置啟用或禁用從代理服務(wù)器上收到相應(yīng)內(nèi)容 gzip 壓縮;
gzip_proxied any;
# 用于在響應(yīng)消息頭中添加 Vary:Accept-Encoding,使代理服務(wù)器根據(jù)請求頭中的 Accept-Encoding 識別是否啟用 gzip 壓縮;
gzip_vary on;
# gzip 壓縮比,壓縮級別是 1-9,1 壓縮級別最低,9 最高,級別越高壓縮率越大,壓縮時間越長,建議 4-6;
gzip_comp_level 6;
# 獲取多少內(nèi)存用于緩存壓縮結(jié)果,16 8k 表示以 8k*16 為單位獲得;
gzip_buffers 16 8k;
# 允許壓縮的頁面最小字節(jié)數(shù),頁面字節(jié)數(shù)從 header 頭中的 Content-Length 中進行獲取。默認(rèn)值是 0,不管頁面多大都壓縮。建議設(shè)置成大于 1k 的字節(jié)數(shù),小于 1k 可能會越壓越大;
# gzip_min_length 1k;
# 默認(rèn) 1.1,啟用 gzip 所需的 HTTP 最低版本;
gzip_http_version 1.1;


Master Process 用來管理子進程的,其本身并不真正處理用戶請求。
某個子進程 down 掉的話,它會向 Master 進程發(fā)送一條消息,表明自己不可用了,此時 Master 進程會去新起一個子進程。
某個配置文件被修改了 Master 進程會去通知 work 進程獲取新的配置信息,這也就是我們所說的熱部署。
子進程間是通過共享內(nèi)存的方式進行通信的。
向 master 進程發(fā)送 HUP 信號(reload 命令);
master 進程檢查配置語法是否正確;
master 進程打開監(jiān)聽端口;
master 進程使用新的配置文件啟動新的 worker 子進程;
master 進程向老的 worker 子進程發(fā)送 QUIT 信號;
老的 worker 進程關(guān)閉監(jiān)聽句柄,處理完當(dāng)前連接后關(guān)閉進程;
整個過程 Nginx 始終處于平穩(wěn)運行中,實現(xiàn)了平滑升級,用戶無感知;


