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
2
3
4
5
# 设置开机自启
systemctl enable nginx

# g关闭开机自启
syetemctl diaable nginx

可用 reboot 重启服务器,配合 ps -ef | grep nginx 进行测试

  • 启动&停止&重启&重载
1
2
3
4
5
6
7
8
9
10
11
# 启动 nginx
systemctl start nginx | nginx

# 停止 nginx
systemctl stop nginx | nginx -s stop

# 重启 nginx
systemctl restart nginx | nginx -s reopen

# 重载 nginx,更改 nginx 配置后需执行
systemctl reload nginx | nginx -s reload
  • 杀死单个进程
1
kill -9 PID(进程id)
  • 查看 nginx 最终配置
1
nginx -T
  • 它会打印出 Nginx 的所有配置指令,包括主配置文件和引入的其他配置文件的内容。这对于调试和查看实际应用的配置非常有用。

  • 检查配置项是否有问题,每次更改完先检查后重载

1
2
3
4
5
# 当前目录下
nginx -t

# 不在当前目录
nginx -t -c <配置路径>

2. 配置文件

  • nginx.conf 文件默认配置

UPTIME1697103769

UPTIME1697096768.jpg

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
server {
listen 80;
server_name static.xxx.com;

location /static {
root /home;
# alias /home/static;

autoindex on; # 开启静态资源目录
autoindex_exact_size off; # 文件单位 -- on:字节 off:KB、MB、GB
autoindex_localtime off; # 时间格式 -- on:服务器时间 off:GMT时间
autoindex_format html; # 目录格式
}
}
  • root 与 alias 区别

  • 图中静态资源所在目录为:/home/static;root 查找静态资源的路径为其填写路径拼接 location 路径,alias 则直接寻找其填写路径;

  • alias 只能用于 location 中;

  • autoindex

开启 autoindex 可访问文件根目录

4. 反向代理

我们在服务器上跑一个 node 项目,配置用 域名 来代替 ip + 端口 访问

1
2
3
4
5
6
7
server {
listen 80;
server_name nginx.xxx.com;
location / {
proxy_pass http://127.0.0.1:3002;
}
}

其含义为用户访问 nginx.xxx.com​ 的时候,将其反向代理到127.0.0.1:3002​ 上

  • 解决跨域

tips:实际工作中,解决跨域一般为后端配置 CORS,HTTP 请求方法 里 Options 部分

  • hosts 配置
1
127.0.0.1       nginx.xxx.com
  • nginx 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name nginx.xxx.com;

location / {
proxy_pass http://127.0.0.1:8080;
}

location /api {
proxy_pass http://127.0.0.1:3002;
proxy_set_header Host $host;
}
}

其含义为用户访问 nginx.xxx.com​ 的时候,将其反向代理到 127.0.0.1:8080​ 上(前端部分);访问 nginx.xxx.com/api​ 的时候,将其反向代理到 127.0.0.1:3002/api​ 上(后端部分);此时前后端同域,以此解决跨域问题。

proxy_set_header Host $host: 用来在后端获取用户发送过来得的请求头,如下图:第一行输出为没有配置该指令,第二行为配置了该指令。

1697100611.png

5. HTTPS

  • 配置 https
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
server {
listen 443 ssl; # 采用443端口,开启ssl
listen [::]:443 ssl;
server_name sso.deeruby.com;

# 证书配置
ssl_certificate /etc/nginx/ssl/sso/full_chain.pem; # pem 文件路径
ssl_certificate_key /etc/nginx/ssl/sso/private.key; # key 文件路径

ssl_session_cache shared:SSL:1m; # 共享缓存大小
ssl_session_timeout 5m; # 超时时间
ssl_ciphers HIGH:!aNULL:!MD5; # 加密算法
ssl_prefer_server_ciphers on; # 优先采取服务器算法

location / {
proxy_pass http://127.0.0.1:3002;
}
}
  • 访问 http 自动跳转至 https
1
2
3
4
5
server {
listen 80;
server_name sso.xxx.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
  • rewrite
1
2
3
4
rewrite   <regex>    <replacement>       [flag]
正则 跳转后的内容 rewrite支持的flag标记

[flag]:permanent -- 301 永久重定向;redirect -- 302 临时重定向;

故上文配置表示将当前路径永久重定向到 https://sso.xxx.com/路径上

6. 图片防盗链

引言:referer 请求头用于识别访问来源,以此来配置防盗链。

valid_referers:设置可访问资源的规则,其不允许的规则 $invalid_referer 值为 1,对不允许的规则返回 403。

字段 含义
none 允许没有 referer 字段的请求访问资源
blocked 允许非 HTTP(S) 开头的请求访问资源
server_names 允许指定域名 / IP 访问资源
[string] 正则匹配定义可访问资源的网址
1
2
3
4
5
6
7
location ~/static/.*\.(jpg|jpeg|png|gif|webp)$ {
root /home;
valid_referers *.xxx.com;
if ($invalid_referer) {
return 403;
}
}

上述配置表示只有*.xxx.com可以访问资源,否则 403 保存

7. 访问限制

1
2
3
4
5
location /static {
root /home;
allow 39.xxx.xxx.xxx; # allow 允许
deny all; # deny 拒绝
}

表示仅允许39.xxx.xxx.xxx访问该目录,禁止其他 IP 访问,其生效顺序为谁先触发谁起作用。

8. 请求过滤

根据状态码过滤

1
2
3
4
5
error_page 500 501 502 503 504 506 /50x.html;
location = /50x.html {
#将跟路径改编为存放html的路径。
root /root/static/html;
}

根据 URL 名称过滤,精准匹配 URL,不匹配的 URL 全部重定向到主页。

1
2
3
location / {
rewrite ^.*$ /index.html redirect;
}

仅允许使用 GET、POST、HEAD、OPTIONS 这四种请求,使用其余请求返回 403

1
2
3
if ($request_method !~ ^(GET|POST|HEAD|OPTIONS)$) {
return 403;
}

9. 缓存

1
2
expires 7d;  # 缓存7天
expires -1; # 不缓存

将动态文件与静态文件分别配置,对静态文件设置缓存即为动静分离

10. PC 端和移动端使用不同项目

1
2
3
4
5
6
7
location / {
root /home/static/pc;
if ($http_user_agent ~* '(mobile|android|iphone|ipod|phone)') {
root /home/static/mobile;
}
index index.html;
}

注意:条件语句中不能使用别名,若有需求,可采取折中方案,重定向移动端网址

11. 负载均衡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
upstream backserver {              # 存放负载均衡所需变量
ip_hash; # 根据用户访问 IP 的 hash 分配,这样每个访客固定访问一个后端服务,可有效解决动态网页存在的 session 共享问题
# fair; # 根据页面大小和加载时间长短智能地进行负载均衡,响应时间短的优先分配
server 127.0.0.1:9090;
server 127.0.0.1:8080 weight=2; # 加权,权重越大,被访问概率越大
server 127.0.0.1:7070 down; # 该 server 不参与负载均衡
server 127.0.0.1:6060 backup; # 其余 server 均不可用时,使用这个
}
server {
location / {
proxy_pass http://backserver; # 接入负载均衡相关配置
proxy_redirect default;
}
}

12. 限速限流

limit_conn 连接频率限制:TCP 连接

1
2
3
4
limit_conn_zone $binary_remote_addr zone=conname:10m;
server {
limit_conn conname 3; # 每个 IP 只能发起3个连接
}

limit_req 请求频率限制:API 请求

1
2
3
4
limit_req_zone $binary_remtoe_addr zone=conname:1m rate=10r/s;
server {
limit_req zone=conname burst=5 nodelay; # 最大请求数为5,且超过的请求不延迟
}
内容 含义
$binary_remote_addr 这里填写的是限流对象,我们采用客户端 IP
zone=conname 给共享空间设置名称为:conname
10m 空间大小:10 兆
rate 速率,上述表示每秒最多发起 10 个请求
limit_conn 限制每个 name 对应的连接数
limit_req 限制每个 name 对应的请求数
1
2
3
4
server {
limit_rate_after 10m; # 前10兆大小不限速
limit_rate 100k; # 限速为 100KB/秒
}

这里可用 ab 命令进行压测

ab -n[number] -c[number] -k url
| 字段 | 含义 |
| —- | —————- |
| -n | 一共发送多少请求 |
| -c | 同时发送多少请求 |
| -k | keep-alive |

13. 其他

开启 gzip

1
gzip on;