nginx是俄羅斯人Igor Sysoev編寫的輕量級Web伺服器。
它不僅是一個高效能的HTTP和反向代理伺服器,同時也是一個IMAP/POP3/SMTP 代理伺服器
nginx只是一個靜態檔案伺服器或者http請求轉發器,它可以把靜態檔案的請求直接返回靜態檔案資源,把動態檔案的請求轉發給後臺服務。
Nginx 主組態檔 /etc/nginx/nginx.conf 是一個純文字型別的檔案,整個組態檔是以區塊的形式組織,通常每一個區塊以一對大括號{}來表示開始與結束(可看下方的程式碼註釋)。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
......
events {}
http {}
location /docs{
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#http://aaa.test/docs
#代理存取後端服務:http://localhost:8080/docs
location /a {
proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#http://localhost:1111/a/docs
#代理存取後端服務:http://localhost:8080/docs
server {
listen 80;
server_name a.local;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
server {
listen 16010;
server_name localhost;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
proxy_pass http://192.192.192.192:16010;
}
}
upstream test {
server localhost:8080;
server localhost:8081;
}
server {
listen 80;
server_name localhost;
client_max_body_size 1024M;
location / {
proxy_pass http://test;
proxy_set_header Host $host:$server_port;
}
}
upstream test {
server localhost:8080 weight=9; #請求的 90% 進入到8080伺服器
server localhost:8081 weight=1; #請求的 10% 進入到8081伺服器
}
upstream test {
ip_hash;
server localhost:8080 weight=9; #請求的 90% 進入到8080伺服器
server localhost:8081 weight=1; #請求的 10% 進入到8081伺服器
}
upstream test {
fair;
server localhost:8080 weight=9; #請求的 90% 進入到8080伺服器
server localhost:8081 weight=1; #請求的 10% 進入到8081伺服器
}
upstream test {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
server {
listen 80;#監聽埠
server_name 192.168.1.1;#設定虛擬主機名和IP
location / {
root /home/wwwroot/ipsite01/;#請求匹配路徑
index index.html;#指定主頁
access_log /home/wwwlog/ipsite01.access.log main;
error_log /home/wwwlog/ipsite01.error.log warn;
}
}
server {
listen 80;
server_name 192.168.1.2;
location / {
root /home/wwwroot/ipsite02/;#請求匹配路徑
index index.html;
access_log /home/wwwlog/ipsite02.access.log main;
error_log /home/wwwlog/ipsite02.error.log warn;
}
}
server {
listen 80;#監聽埠
server_name www.cainiaojc.com;#設定虛擬主機域名
location / {
root /home/wwwroot/domainsite01/;#請求匹配路徑
index index.html;#指定主頁
access_log /home/wwwlog/domainsite01.access.log main;
error_log /home/wwwlog/domainsite01.error.log warn;
}
}
server {
listen 80;
server_name man.niaoge.com;
location / {
root /home/wwwroot/domainsite02/;#請求匹配路徑
index index.html;
access_log /home/wwwlog/domainsite02.access.log main;
error_log /home/wwwlog/domainsite02.error.log warn;
}
}
server {
listen 8080;#監聽埠
server_name www.cainiaojc.com;#設定虛擬主機域名
location / {
root /home/wwwroot/portsite01/;#請求匹配路徑
index index.html;#指定主頁
access_log /home/wwwlog/portsite01.access.log main;
error_log /home/wwwlog/portsite01.error.log warn;
}
}
server {
listen 8090;
server_name www.cainiaojc.com;
location / {
root /home/wwwroot/portsite02/;#請求匹配路徑
index index.html;
access_log /home/wwwlog/portsite02.access.log main;
error_log /home/wwwlog/portsite02.error.log warn;
}
}
以下都是nginx的部分內建全域性變數,可以在設定的任何位置使用
在組態檔中,可以通過變數,來上下文使用
用法就是用 $ 來命名變數
set $a "hello world";
#這樣在nginx.conf檔案中都能用到
例子:行動端和pc端切換.
location / {
# 適配行動端/PC端設定
set $type "pc";
if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
set $type "mobile";
}
root /usr/local/var/www/project/$type; # 根據裝置型別選擇設定根目錄資料夾名(pc/mobile)
index index.html index.htm;
}
使用者端發出一個http請求時,nginx收到後會取出header頭中的host,與nginx.conf中每個server的server_name進行匹配,以此決定到底由哪一個server塊來處理這個請求。
匹配規則:
偵錯程式碼:
server{
default_type text/plain;
listen 80;
server_name _;
return 200 "no1 match";
}
server{
default_type text/plain;
listen 80;
server_name *.test.com;
return 200 "萬用字元在前";
}
server{
default_type text/plain;
listen 80;
server_name www.test.*;
return 200 "萬用字元在後";
}
server{
default_type text/plain;
listen 80;
server_name ~^www.test.com$;
return 200 "正則匹配";
}
server{
default_type text/plain;
listen 80;
server_name www.test.com;
return 200 "完全匹配";
}
# 把這些放到nginx.conf中,重啟nginx -s reload
# 設定host檔案 127.0.0.1 www.test.com
# 開啟www.test.com
# 結果就如匹配規則一樣,從前依次刪除server測試,重啟nginx,即可發現規律
# 同樣的,可以改變server的順序,也可得出第一種匹配規則和順序無關
server{
default_type text/plain;
listen 80 default_server;
server_name 127.0.0.1;
return 200 "default";
}
server{
default_type text/plain;
listen 80;
server_name *.test.com;
return 200 "萬用字元在前";
}
# 這個我測試的老是報a duplicate default server for 0.0.0.0:82 in /usr/local/etc/nginx/servers/learn.conf:65, 原因未解
# 網上說的即使有defualt,但也會命中萬用字元在前,這說明了第一種情況的優先順序高於第二種
server{
default_type text/plain;
listen 83;
return 200 "first";
}
server{
default_type text/plain;
listen 83;
return 200 "last";
}
#若都不匹配的話,直接取第一個
location /api{
#規則
}
# 以下存取都是正確的
# http://127.0.0.1/api
# http://127.0.0.1/api?p1=TOM
# http://127.0.0.1/api/
# http://127.0.0.1/apiapi
location =/api{
#規則
}
# 可以匹配到
# http://127.0.0.1/api
# http://127.0.0.1/api?p1=TOM
# 匹配不到
# http://127.0.0.1/api/
# http://127.0.0.1/apiapi
location ~ /Example/ {
#規則
}
# 可以匹配到
#http://127.0.0.1/Example/
# 匹配不到
#http://127.0.0.1/example/
location ~* /Example/ {
#規則
}
# 可以匹配到
#http://127.0.0.1/Example/
#http://127.0.0.1/example/
location ^~ /img/ {
#規則
}
#以 /img/ 開頭的請求,都會匹配上
#https://s3.ap-northeast-1.wasabisys.com/img.tw511.com/202209/armuvzlmx14f.jpg
#http://local.learn.com/img/b.mp4
location /img/ {
error_page 404 @img_err;
}
location @img_err {
# 規則
}
#以 /img/ 開頭的請求,如果連結的狀態為 404。則會匹配到 @img_err 這條規則上。
#執行使用者
user nobody;
#啟動程序,通常設定成和cpu的數量相等
worker_processes 1;
#全域性錯誤紀錄檔及PID檔案
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#工作模式及連線數上限
events {
#epoll是多路複用IO(I/O Multiplexing)中的一種方式,
#僅用於linux2.6以上核心,可以大大提高nginx的效能
use epoll;
#單個後臺worker process程序的最大並行連結數
worker_connections 1024;
# 並行總數是 worker_processes 和 worker_connections 的乘積
# 即 max_clients = worker_processes * worker_connections
# 在設定了反向代理的情況下,max_clients = worker_processes * worker_connections / 4 為什麼
# 為什麼上面反向代理要除以4,應該說是一個經驗值
# 根據以上條件,正常情況下的Nginx Server可以應付的最大連線數為:4 * 8000 = 32000
# worker_connections 值的設定跟實體記憶體大小有關
# 因為並行受IO約束,max_clients的值須小於系統可以開啟的最大檔案數
# 而系統可以開啟的最大檔案數和記憶體大小成正比,一般1GB記憶體的機器上可以開啟的檔案數大約是10萬左右
# 我們來看看360M記憶體的VPS可以開啟的檔案控制程式碼數是多少:
# $ cat /proc/sys/fs/file-max
# 輸出 34336
# 32000 < 34336,即並行連線總數小於系統可以開啟的檔案控制程式碼總數,這樣就在作業系統可以承受的範圍之內
# 所以,worker_connections 的值需根據 worker_processes 程序數目和系統可以開啟的最大檔案總數進行適當地進行設定
# 使得並行總數小於作業系統可以開啟的最大檔案數目
# 其實質也就是根據主機的物理CPU和記憶體進行設定
# 當然,理論上的並行總數可能會和實際有所偏差,因為主機還有其他的工作程序需要消耗系統資源。
# ulimit -SHn 65535
}
http {
#設定mime型別,型別由mime.type檔案定義
include mime.types;
default_type application/octet-stream;
#設定紀錄檔格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#紀錄檔儲存地址 格式程式碼 main
access_log logs/access.log main;
#sendfile 指令指定 nginx 是否呼叫 sendfile 函數(zero copy 方式)來輸出檔案,
#對於普通應用,必須設為 on,
#如果用來進行下載等應用磁碟IO重負載應用,可設定為 off,
#以平衡磁碟與網路I/O處理速度,降低系統的uptime.
sendfile on;
#tcp_nopush on;
#連線超時時間
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;
#開啟gzip壓縮
gzip on;
gzip_disable "MSIE [1-6].";
# 設定壓縮的臨界點
gzip_min_length 1000;
# 壓縮級別
gzip_comp_level 3;
# 要壓縮的檔案類別
gzip_types text/plain application/xml;
#設定請求緩衝
client_header_buffer_size 128k;
large_client_header_buffers 4 128k;
#開啟錯誤頁面跳轉404
proxy_intercept_errors on;
#設定虛擬主機設定
server {
#偵聽80埠
listen 80;
#定義使用 www.nginx.cn存取
server_name www.nginx.cn;
#定義伺服器的預設網站根目錄位置
root html;
#設定本虛擬主機的存取紀錄檔
access_log logs/nginx.access.log main;
#預設請求
location / {
#定義首頁索引檔案的名稱
index index.php index.html index.htm;
try_files $uri index.html =404;
}
# 定義錯誤提示頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#靜態檔案,nginx自己處理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#過期30天,靜態檔案不怎麼更新,過期可以設大一點,
#如果頻繁更新,則可以設定得小一點。
expires 30d;
}
#PHP 指令碼請求全部轉發到 FastCGI處理. 使用FastCGI預設設定.
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
#禁止存取 .htxxx 檔案
location ~ /.ht {
deny all;
}
}
}
server {
listen 80;
server_name ~^(?:www\.)?(.+)$;
return 301 https://$1$request_uri;
}
程式碼解釋:在 http 對應的 sever 中,把 server_name 也改為正則模式,並將 $host 用捕獲的根域名 $1 取代www 在這裡會直接棄掉,所以不需要捕獲,使用 ?: 標示實現只分組不捕獲,於是後面的根域名就成了 $1這樣的結果是不管原來是否帶 www,都統一跳轉到不帶 www 的 https 根域名
2. 防盜鏈
location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked 192.168.0.103; # 只允許本機IP外連參照
if ($invalid_referer){
return 403;
}
}
server {
listen 8080;
server_name localhost;
location / {
# 跨域代理設定
proxy_pass http://www.baidu.com; # 要實現跨域的域名
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
}
}
server {
listen 8080;
server_name localhost;
location / {
# IP存取限制(只允許IP是 12.12.12.12 的機器才能存取)
allow 12.12.12.12;
deny all;
root html;
index index.html index.htm;
}
}
location /test {
alias /myTest/nginxTest;
}
# 存取地址為:localhost/test/nginxTest.html-->檔案目錄:/myTest/nginxTest/nginxTest.html
location /test {
root /myTest/nginxTest;
}
# 存取地址為:localhost/test/nginxTest.html-->檔案目錄:/myTest/nginxTest/test/nginxTest.html
# 說明root把匹配的字元/test拼接到了檔案路徑中
# 當root下沒有test的資料夾的話會直接報404
(8分鐘帶你深入淺出搞懂Nginx)[https://zhuanlan.zhihu.com/p/34943332]
(Nginx中文檔案)[https://www.nginx.cn/doc/index.html]
(Nginx 教學)[https://www.cainiaojc.com/nginx/nginx-index.html]