前端应该了解的Nginx使用技巧
0. 前言
nginx 是一个高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,最初由俄罗斯人 Igor Sysoev 编写。
本文整理了 Nginx 常见命令与配置,以便后面需要配置 Nginx 的时候可以快速的找到配置文档。个人以前端的视角来看 Nginx 主要是会配,能够理解这里面哪个配置文件是干什么的配置后有哪些效果。
1. 基础命令
- 列出 nginx 相关软件包
1 | yum list | grep nginx |
yum list: 列出所有软件清单
yum list installed: 列出已安装软件清单————检测系统中是否安装某个软件
grep: 用于查找文件中符合条件的字符串
安装 nginx
1 | yum install nginx |
- 查看 nginx 版本信息
1 | nginx -v |
- 列出 nginx 相关目录
1 | rpm -ql nginx |
- 全格式显示所有 nginx 运行进程
1 | ps -ef | grep nginx |
ps: 列出系统中当前运行的进程
-ef: -e 显示所有,-f 全格式显示,也可以使用 aux;
开机自启
1 | # 设置开机自启 |
可用 reboot 重启服务器,配合 ps -ef | grep nginx 进行测试
- 启动&停止&重启&重载
1 | # 启动 nginx |
- 杀死单个进程
1 | kill -9 PID(进程id) |
- 查看 nginx 最终配置
1 | nginx -T |
它会打印出 Nginx 的所有配置指令,包括主配置文件和引入的其他配置文件的内容。这对于调试和查看实际应用的配置非常有用。
检查配置项是否有问题,每次更改完先检查后重载
1 | # 当前目录下 |
2. 配置文件
- nginx.conf 文件默认配置
main
:nginx 的全局配置,对全局生效。events
:配置影响 nginx 服务器或与用户的网络连接。http
:可以嵌套多个 server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。server
:配置虚拟主机的相关参数,一个 http 中可以有多个 server。location
:配置请求的路由,以及各种页面的处理情况。upstream
:配置后端服务器具体地址,负载均衡配置不可或缺的部分。
上文日志格式中所涉及变量含义如下:
变量 | 含义 |
---|---|
$remote_addr | 客户端地址 |
$remote_user | 已经过验证的用户名 |
$time_local | 通用日志格式的本地时间 |
$request | 完整的原始的请求行 |
$status | 下发给客户端的响应码 |
$body_bytes_sent | 下发给客户端的字节数 |
$http_referer | 当前请求上一次页面访问的地址 |
$http_user_agent | 客户端 agent 信息 |
$http_x_forwarded_for | 获得用户 ip |
3. 静态资源配置
1 | server { |
root 与 alias 区别
图中静态资源所在目录为:/home/static;root 查找静态资源的路径为其填写路径拼接 location 路径,alias 则直接寻找其填写路径;
alias 只能用于 location 中;
autoindex
开启 autoindex 可访问文件根目录
4. 反向代理
我们在服务器上跑一个 node 项目,配置用 域名 来代替 ip + 端口 访问
1 | server { |
其含义为用户访问 nginx.xxx.com
的时候,将其反向代理到127.0.0.1:3002
上
- 解决跨域
tips:实际工作中,解决跨域一般为后端配置 CORS,HTTP 请求方法 里 Options 部分
- hosts 配置
1 | 127.0.0.1 nginx.xxx.com |
- nginx 配置
1 | server { |
其含义为用户访问 nginx.xxx.com
的时候,将其反向代理到 127.0.0.1:8080
上(前端部分);访问 nginx.xxx.com/api
的时候,将其反向代理到 127.0.0.1:3002/api
上(后端部分);此时前后端同域,以此解决跨域问题。
proxy_set_header Host $host
: 用来在后端获取用户发送过来得的请求头,如下图:第一行输出为没有配置该指令,第二行为配置了该指令。
5. HTTPS
- 配置 https
1 | server { |
- 访问 http 自动跳转至 https
1 | server { |
rewrite
1 | rewrite <regex> <replacement> [flag] |
故上文配置表示将当前路径永久重定向到 https://sso.xxx.com/
路径上
6. 图片防盗链
引言:referer 请求头用于识别访问来源,以此来配置防盗链。
valid_referers:设置可访问资源的规则,其不允许的规则 $invalid_referer 值为 1,对不允许的规则返回 403。
字段 | 含义 |
---|---|
none | 允许没有 referer 字段的请求访问资源 |
blocked | 允许非 HTTP(S) 开头的请求访问资源 |
server_names | 允许指定域名 / IP 访问资源 |
[string] | 正则匹配定义可访问资源的网址 |
1 | location ~/static/.*\.(jpg|jpeg|png|gif|webp)$ { |
上述配置表示只有*.xxx.com
可以访问资源,否则 403 保存
7. 访问限制
1 | location /static { |
表示仅允许39.xxx.xxx.xxx
访问该目录,禁止其他 IP 访问,其生效顺序为谁先触发谁起作用。
8. 请求过滤
根据状态码过滤
1 | error_page 500 501 502 503 504 506 /50x.html; |
根据 URL 名称过滤,精准匹配 URL,不匹配的 URL 全部重定向到主页。
1 | location / { |
仅允许使用 GET、POST、HEAD、OPTIONS 这四种请求,使用其余请求返回 403
1 | if ($request_method !~ ^(GET|POST|HEAD|OPTIONS)$) { |
9. 缓存
1 | expires 7d; # 缓存7天 |
将动态文件与静态文件分别配置,对静态文件设置缓存即为动静分离
10. PC 端和移动端使用不同项目
1 | location / { |
注意:条件语句中不能使用别名,若有需求,可采取折中方案,重定向移动端网址
11. 负载均衡
1 | upstream backserver { # 存放负载均衡所需变量 |
12. 限速限流
limit_conn 连接频率限制:TCP 连接
1 | limit_conn_zone $binary_remote_addr zone=conname:10m; |
limit_req 请求频率限制:API 请求
1 | limit_req_zone $binary_remtoe_addr zone=conname:1m rate=10r/s; |
内容 | 含义 |
---|---|
$binary_remote_addr | 这里填写的是限流对象,我们采用客户端 IP |
zone=conname | 给共享空间设置名称为:conname |
10m | 空间大小:10 兆 |
rate | 速率,上述表示每秒最多发起 10 个请求 |
limit_conn | 限制每个 name 对应的连接数 |
limit_req | 限制每个 name 对应的请求数 |
1 | server { |
这里可用 ab 命令进行压测
ab -n[number] -c[number] -k url
| 字段 | 含义 |
| —- | —————- |
| -n | 一共发送多少请求 |
| -c | 同时发送多少请求 |
| -k | keep-alive |
13. 其他
开启 gzip
1 | gzip on; |