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