Nginx進階
靜態資源WEB服務
- 靜態資源類型
類型 | 種類 |
---|---|
瀏覽器端渲染 | HTML,CSS,JS |
圖片 | JPEG,GIF,PNG |
視頻 | FLV,MPEG |
文件 | TXT,等任意下載文件 |
- 靜態資源服務場景-CDN(內容分發網絡)
# 訪問本地絕對路徑下的靜態html
location / {
#root html;
root /home/admin/XXX;
index index.html index.htm;
}
#訪問路徑拼接 /page
location /page/ {
alias /home/admin/XXX;
autoindex on;
}
- 文件讀取
-
http_gzip_static_module -預讀gzip功能
-
http_gunzip_module -應用支持gunzip的壓縮方式
server { listen 80; server_name localhost; sendfile on; #打開發送文件 #charset koi8-r; access_log /var/log/nginx/log/static_access.log main; location ~ .*\.(jpg|gif|png)$ { # 壓縮圖片的效率不是特別高 gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/images; } location ~ .*\.(txt|xml)$ { #壓縮文本的效率挺高的 gzip on; gzip_http_version 1.1; gzip_comp_level 1; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/doc; } location ~ ^/download { #目錄下的文件必須是壓縮文件,打開後就可以下載 gzip_static on; tcp_nopush on; root /opt/app/code; } ....... }
-
緩存,返回的Response頭中加入Cache-Control:max-age=86400
server { listen 80; server_name localhost; sendfile on; #打開發送文件 #charset koi8-r; access_log /var/log/nginx/log/static_access.log main; location ~ .*\.(jpg|gif|png)$ { # 壓縮圖片的效率不是特別高 gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/images; } location ~ .*\.(txt|xml)$ { #壓縮文本的效率挺高的 gzip on; gzip_http_version 1.1; gzip_comp_level 1; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/doc; } location ~ ^/download { #目錄下的文件必須是壓縮文件,打開後就可以下載 gzip_static on; tcp_nopush on; root /opt/app/code; } location ~ .*\.(htm|html)${ expires 24h; #響應返回頭中加入Cache-Control:max-age=86400 root /opt/qpp/code; } ....... }
-
跨域訪問
-
不同域名之間的請求,在瀏覽器中一般是禁止的
-
不安全,容易出現CSRF攻擊 你點了銀行A網站,攜帶了cookie,session之後不小心又去點了黑客B網站,B網站給客戶返回一些帶有惡意的Response請求,讓用戶去訪問銀行A網站。
server { listen 80; server_name localhost; sendfile on; #charset koi8-r; access_log /var/log/nginx/log/static_access.log main; location ~ .*\.(jpg|gif|png)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/images; } location ~ .*\.(txt|xml)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 1; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/doc; } location ~ .*\.(htm|html)$ { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS; #expires 24h; root /opt/app/code; } location ~ ^/download { gzip_static on; tcp_nopush on; root /opt/app/code; } ....... }
-
-
防盜鏈 :防止資源被盜用
首要任務:區別哪些請求是非正常的用戶請求
使用http_referer模塊
server { listen 80; server_name localhost; sendfile on; #charset koi8-r; access_log /var/log/nginx/log/static_access.log main; location ~ .*\.(jpg|gif|png)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; valid_referers none blocked IP地址 ~/google\./; ##正則匹配的方式來限制 if ($invalid_referer) { return 403; } #初級防盜鏈的設計,把refer信息限制爲本機IP地址 root /opt/app/code/images; } location ~ .*\.(txt|xml)$ { gzip on; gzip_http_version 1.1; gzip_comp_level 1; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; root /opt/app/code/doc; } location ~ .*\.(htm|html)$ { expires 24h; root /opt/app/code; } location ~ ^/download { gzip_static on; tcp_nopush on; root /opt/app/code; } ....... }
代理服務
-
正向代理:代理的對象是客戶端
翻牆:通過國外的一臺代理服務器實現翻牆
admin.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/log/host.access.log main;
location / {
if ( $http_x_forwarded_for !~* "^XXX\.xx\.xxx\.xxx") { #判斷所有代理的IP信息
return 403;
}
root /opt/app/code;
index index.html index.htm;
}
......
}
zx_proxy.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/test_proxy.access.log main;
resolver 8.8.8.8; #DNS解析
location / {
proxy_pass http://$http_host$request_uri;
}
.......
}
- 反向代理:代理的對象是服務端 不需要知道請求的服務器是哪一臺
realserver.conf 真正的服務器端口
server {
listen 8080;#實際端口
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/server.access.log main;
location / {
root /opt/app/code2; #目錄下放置測試文件html
index index.html index.htm;
}
.......
}
fx_proxy.conf 代理的服務器配置
server {
listen 80; #對外提供的端口
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/test_proxy.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#location ~ /test_proxy.html$ { #當請求匹配爲test_proxy.html時,去請求本機的8080端口
# proxy_pass http://127.0.0.1:8080;
#}
......
}
netstat -luntp|grep nginx #查詢nginx配置中所啓動的端口號
-
代理服務配置模塊
fx_proxy.conf 配置
server { listen 80; #對外提供的端口 server_name localhost; #charset koi8-r; access_log /var/log/nginx/test_proxy.access.log main; location / { proxy_pass http://127.0.0.1:8080; include proxy_params; ##可以把公用模塊的代理寫成一個文件,放在/etc/nginx下 proxy_redirect default; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_buffer_size 32k; proxy_buffering on; proxy_buffers 4 128k; proxy_busy_buffers_size 256k; proxy_max_temp_file_size 256k; } ...... }
Nginx負載均衡
客戶端請求經過Nginx,經過proxy_pass,放入虛擬的upstream server去分發到不同的服務上
-
登錄後臺服務器上,服務器上放了不同的服務
服務器上有server1.conf,server2.conf,server3.conf配置,只有端口不同
另一個負載均衡服務器上有upstream.conf,上面配置了3個不同的upstream監聽端口
upstream baidu { #命名跟下面配置相同 server ip:8001; server ip:8002; server ip:8003; } server { listen 80; server_name localhost; #charset koi8-r; access_log /var/log/nginx/test_proxy.access.log main; resolver 8.8.8.8; location / { proxy_pass http://baidu; include proxy_params; } ...... } 模擬宕機的時候,直接把請求的端口的入方向配置爲閉合 iptables -I INPUT -p tcp --dport 8080 -j DROP 恢復 iptables -F
調度算法:
輪詢 | 按時間順序逐一分配到不同的後端服務器 |
---|---|
加權輪詢 | weight值越大,分配到的訪問機率越高 |
ip_hash | 每個請求按訪問IP的hash結果分配,這樣來自同一個IP的固定訪問一個後端服務器 |
url_hash | 按照訪問的URL的hash結果來分配請求,是每個URL定向到同一個後端服務器 |
least_conn | 最少鏈接數,那個機器連接數少就分發 |
hash關鍵數值 | hash自定義的key |
更多的upstream.conf配置
upstream baidu {
server IP:8001 down; //服務關閉,用不了
server IP:8002 backup; //服務作爲備份,服務全部停止後才能用
server IP:8003 max_fails=1 fail_timeout=10s; //服務連接失敗數,等待時間
}
#負載均衡策略 加權輪詢,基於請求分配
upstream baidu {
server IP:8001;
server IP:8002 weight=5; #10個請求5個請求在8002上
server IP:8003;
}
#基於請求會使 用戶cookie丟失,所以採用基於IP分配
upstream baidu {
ip_hash;
server IP:8001;
server IP:8002;
server IP:8003;
}
#基於URL分配
upstream baidu {
hash $request_uri; #可以加入正則表達式判斷url中帶的參數
server IP:8001;
server IP:8002;
server IP:8003;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/test_proxy.access.log main;
resolver 8.8.8.8;
location / {
proxy_pass http://baidu;
include proxy_params;
}
.......
}
緩存服務
cache.conf配置文件
upstream baidu {
server IP:8001;
server IP:8002;
server IP:8003;
}
proxy_cache_path /opt/app/cache levels=1:2 keys_zone=cyj_cache:10m max_size=10g inactive=60m use_temp_path=off;
#臨時緩存文件目錄;根據目錄分級;zone空間的名字,與下對應;不活躍的60分鐘緩存文件自動清理
server {
listen 80;
server_name localhost;
#charset koi8-r;
access_log /var/log/nginx/test_proxy.access.log main;
location / {
proxy_cache cyj_cache;
proxy_pass http://baidu;
proxy_cache_valid 200 304 12h; ##過期時間12小時200,304返回頭
proxy_cache_valid any 10m; ##其他10分鐘
proxy_cache_key $host$uri$is_args$args;##緩存的key
add_header Nginx-Cache "$upstream_cache_status"; ##增加頭信息
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
include proxy_params;
}
.......
}
如何清理指定緩存:
- rm -rf 緩存目錄內容
- 第三方拓展模塊ngx_cache_purge