nginx进阶篇
一、配置成系统服务
1. 配置service文件
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx web service
Documentation=http://nginx.org/en/docs/
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=default.target
2.赋权文件
chmod 755 /usr/lib/systemd/system/nginx.service
3.使用系统命令操作Nginx服务
systemctl start nginx # 启动
systemctl stop nginx # 停止
systemctl restart nginx # 重启
systemctl reload nginx # 重新加载
systemctl status nginx # 查看状态
systemctl enable nginx # 开机启动
systemctl disable nginx # 删除开机启动
二、给nginx配置环境变量
1.修改profile,文件末尾添加配置
vim /etc/profile
# nginx
export PATH=$PATH:/usr/local/nginx/sbin
2.重加载profile
source /etc/profile
3.效果演示(不再需要输入一大串路径前缀)
nginx -v
三、静态资源压缩 gzip
1.gzip
gzip on|off; # 默认off,位置http/server/location
注:
- gzip是在应用程序区进行的,sendfile是只在内核区进行的,两者同时开启时,会造成冲突。
2.gzip_types 根据响应页的mime类型进行选择性的开启gzip压缩功能。
gzip_types text/html application/javascript; # 默认text/html,多个mime类型时,可以用空格分开。
gzip_types *; # 压缩所有资源,但视频等资源自身已经压缩过,再压缩会消耗性能,且效果不大,不建议直接 * ;
3.gzip_comp_level:设置gzip的压缩程度
gzip_comp_level 6; # 默认1
注:压缩程度1-9;1压缩程度最低,效率最高,9压缩程度最高,效率最低。一般建议设置为6
4.gzip_vary:设置使用gzip压缩后,数据发送时是否携带’Vary:Accept-Encoding’头域的响应头部。
gzip_vary on|off; # 默认off
注:主要用于告诉接方,所发送的数据经过了gzip压缩处理
5.gzip_buffers:设置用于处理请求压缩的缓冲区数量和大小
gzip_buffers num size; # 建议不配置,使用系统默认就好
6.gzip_min_length 进行压缩响应页的最小长度
gzip_min_length 1024;
注:
- 跟响应头的Content-Length做比较,小于Content-Length才会进行压缩。
7.gzip_disable 配置不压缩的情况
gzip_disable "MSIE [1-6]\."; # 对应IE6以下的版本不进行压缩
注:
- 过低版本的浏览器不支持gzip功能,会报乱码。
四、静态资源压缩 gzip-static
1. gzip-static模块
--with-http_zip_static_mpdule
注:
- 使用gzip-static前需要添加模块 ./configure --with-http_zip_static_mpdule,详细可借鉴:https://www.lzjfengyi.cloud/archives/nginx-addssl
- 解决gzip和sendfile冲突思路:在访问静态资源前,先在应用程序区压缩好,然后将压缩文件带上gz后缀放入磁盘。
- gzip-static思路:启用gzip-static时,会优先访问带gz后缀的同名静态文件。
2. 开启gzip-static
gzip off;
gzip-static on;
五、web缓存
1. 客户端缓存
浏览器在用户磁盘上对最近请求访问过的文档进行存储,当再次请求访问时,直接从本地磁盘显示文档
add_header Cache-Control no-store; # 不使用缓存
add_header Cache-Control no-cache; # 必须使用弱缓存
add_header Cache-Control max-age=<秒>; # 限时
2. 服务器缓存
六、nginx跨域
1. 同源策略
是指协议,域名,端口均相同,则同源。其一不同则为跨域。
2. 跨域问题
现象:浏览器console报 No ‘Access-Control-Allow-Origin’ header is …;
解决:
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE;
七、防盗链
定义:自己网址里的图片等静态资源,只有遵循我设置的规则才能访问。
valid_referers none blocked server_names string;
注:
- 多个值用空格分开。
- none:header中没有referer也能访问。 referer 表示该资源的来源。
- blocked:header中referer不为空,且不带 http https 的资源允许访问。
- server_names:运行指定的域名或ip。
- string:正则匹配。
实现:允许 www.lzjfengyi.cloud 访问,其他域访问返回403
valid_referers www.lzjfengyi.cloud;
# 匹配则$invalid_referer为0,不匹配$invalid_referer为1
if($invalid_referer){
return 403;
}
八、if
1. 变量
if ($param){}
注:当变量的值为0或者为空时,if判断为false,否则为true。
2. 与字符串比较
if ($request_method = POST){}
注:=相等,!=不等
3. 正则表达式
if ($http_user_agent ~ MSIE){}
注:
- $http_user_agent ~ MSIE 表示变量值包含MSIE时,if判断为true
- ~ 表示正则区分大小写, ~* 表示不区分大小写,前面加!表示不匹配:!~,!~*
4.判断文件是否存在
if (-f $request_filename){}
注:
- -f 判断请求的文件是否存在
- -d 判断请求的目录是否存在
- -e 判断请求的文件或目录是否存在
- -x 判断请求的文件是否可执行使用
5. break
location /testbreak {
default_type text/plain;
set $username Tom;
if ($args){
set $username JERRY;
break;
set $username ROSE;
}
add_header username $username;
return 200 $username;
}
注:
- 当访问 localhost/testbreak 时,返回tom,f12可查请求头有 username Tom
- 当 访问 localhost/testbreak/1 时:
2.1 当nginx/html目录没有/testbreak/index.html时,会报404。因为break会打断当前url页面并去html搜索与location路径一致目录下的index.html
2.2
2.2.1 当有这路径时,会重定向到/testbreak/index.html,原url页面报301:永久重定向。index.html报200正常访问,同时请求头有 username JERRY;
2.2.2 因为同一个作用域中,break前面的生效,break后面的不生效。跳出if作用域后的add_header依旧生效
2.2.3 return失效,显示的是index.html的内容。
九、重定向
1. return
return code [text];
return code URL;
return URL;
注:
- code表示http状态码
- text表示返回给客户端的内容,支持变量
- URL返回给客户端的URL地址
- 在return后面的所有配置失效
2.rewrite
rewrite regex replacement [flag]
例:rewrite ^/(test)\w*$ https://tiot.unimip.cn$1 permanent,相当于永久重定向到https://tiot.unimip.cn/test
- permanent永久重定向,状态码301
- redirect临时重定向,状态码302
rewrite_log:开启url重写日志的输出功能
rewrite_log on;
error_log logs/error.log notice;
注:开启url重写日志,并且日志输出到error.log
- rewrite_log和error_log同时配置才会有日志
- notice:日志级别
十、代理
1. 正向代理
2. 反向代理
2.1 proxy_pass
location /server{
proxy_pass http://xxxx; # 会访问http://xxxx:80/server
}
location /server{
proxy_pass http://xxxx/; # 会访问http://xxxx:80/
}
注:末尾不加/时,nginx会追加location路径
2.2 proxy_set_header
proxy_set_header field value;
注:在代理服务器修改客户端请求的请求头信息,然后转发到源服务器
2.3 proxy_redirect
proxy_pass http://代理服务器ip:port;
proxy_redirect ~^http://服务器ip:port(.*) http://代理服务器ip:port$1;
注:将请求头中location头域和refresh头域暴露的服务器信息改回代理服务器的信息
十一、负载均衡
1.upstream
upstream web_in536 {
server 10.15.0.164:46536 max_fails=3 fail_timeout=10s;
server 10.15.0.165:46536 max_fails=3 fail_timeout=10s;
server 127.0.0.1:48536 backup;
}
......
......
proxy_pass https://web_in536;
注:
- 默认负载均衡策略:轮询
- max_fails最大失败次数
- fail_timeout达到最大失败次数后,等待一段时间才再次尝试访问
- backup 备用服务器,只有当其他可用的全宕机才会启用
2.负载均衡策略
-
轮询 - 默认
-
weight
权重方式server 10.15.0.164:46536 weight=10;
server 10.15.0.165:46536 weight=5; -
iphash
根据ip分配方式:根据用户的ip经过一系列哈希算法,分配到服务器上,且当下一次同样ip访问时,分配到上次的服务器ip_hash;
server 10.15.0.164:46536;
server 10.15.0.165:46536;
注:
3.1 此方法可用解决session不共享,导致用户登录状态因不同服务器响应而失效的情况。
3.2 此方法负载均衡不彻底
3.3 可以将session数据放入到redis,多台服务器访问相同redis解决用户登录状态问题
-
least_conn
依据最少连接方式,将请求分发到最少连接的服务器上,适合用于因请求数过多,且连接时间长短不一的情况least_conn;
server 10.15.0.164:46536;
server 10.15.0.165:46536; -
url_hash
依据url分配方式,如果访问的url不变,分配到的则是同一台服务器。适合用于url访问服务器文件系统的情况。注:需配合缓存命中使用,如文件缓存。hash $request_uri;
server 10.15.0.164:46536;
server 10.15.0.165:46536; -
fair
依据响应时间方式:通过根据页面大小,加载时间长短来进行负载均衡。但需要第三方模块进行均衡策略(nginx-upstream-fair-master)。fair;
server 10.15.0.164:46536;
server 10.15.0.165:46536;
注:模块下载地址:https://github.com/gnosek/nginx-upstream-fair