nginx进阶篇

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

注:

  1. 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;

注:

  1. 跟响应头的Content-Length做比较,小于Content-Length才会进行压缩。

7.gzip_disable 配置不压缩的情况

gzip_disable "MSIE [1-6]\.";    # 对应IE6以下的版本不进行压缩

注:

  1. 过低版本的浏览器不支持gzip功能,会报乱码。

四、静态资源压缩 gzip-static

1. gzip-static模块

--with-http_zip_static_mpdule

注:

  1. 使用gzip-static前需要添加模块 ./configure --with-http_zip_static_mpdule,详细可借鉴:https://www.lzjfengyi.cloud/archives/nginx-addssl
  2. 解决gzip和sendfile冲突思路:在访问静态资源前,先在应用程序区压缩好,然后将压缩文件带上gz后缀放入磁盘。
  3. 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;

注:

  1. 多个值用空格分开。
  2. none:header中没有referer也能访问。 referer 表示该资源的来源。
  3. blocked:header中referer不为空,且不带 http https 的资源允许访问。
  4. server_names:运行指定的域名或ip。
  5. 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){}

注:

  1. $http_user_agent ~ MSIE 表示变量值包含MSIE时,if判断为true
  2. ~ 表示正则区分大小写, ~* 表示不区分大小写,前面加!表示不匹配:!~,!~*

4.判断文件是否存在

if (-f $request_filename){}

注:

  1. -f 判断请求的文件是否存在
  2. -d 判断请求的目录是否存在
  3. -e 判断请求的文件或目录是否存在
  4. -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;
}

注:

  1. 当访问 localhost/testbreak 时,返回tom,f12可查请求头有 username Tom
  2. 当 访问 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;

注:

  1. code表示http状态码
  2. text表示返回给客户端的内容,支持变量
  3. URL返回给客户端的URL地址
  4. 在return后面的所有配置失效

2.rewrite

rewrite regex replacement [flag]

例:rewrite ^/(test)\w*$ https://tiot.unimip.cn$1 permanent,相当于永久重定向到https://tiot.unimip.cn/test

  1. permanent永久重定向,状态码301
  2. redirect临时重定向,状态码302

rewrite_log:开启url重写日志的输出功能

rewrite_log on;
error_log logs/error.log notice;

注:开启url重写日志,并且日志输出到error.log

  1. rewrite_log和error_log同时配置才会有日志
  2. 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;

注:

  1. 默认负载均衡策略:轮询
  2. max_fails最大失败次数
  3. fail_timeout达到最大失败次数后,等待一段时间才再次尝试访问
  4. backup 备用服务器,只有当其他可用的全宕机才会启用

2.负载均衡策略

  1. 轮询 - 默认

  2. weight
    权重方式

    server 10.15.0.164:46536 weight=10;
    server 10.15.0.165:46536 weight=5;

  3. 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解决用户登录状态问题

  1. least_conn
    依据最少连接方式,将请求分发到最少连接的服务器上,适合用于因请求数过多,且连接时间长短不一的情况

    least_conn;
    server 10.15.0.164:46536;
    server 10.15.0.165:46536;

  2. url_hash
    依据url分配方式,如果访问的url不变,分配到的则是同一台服务器。适合用于url访问服务器文件系统的情况。注:需配合缓存命中使用,如文件缓存。

    hash $request_uri;
    server 10.15.0.164:46536;
    server 10.15.0.165:46536;

  3. 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值