我的 Nginx 的一些配置

我的 Nginx 的一些配置

在我们开发的过程当中,我们经常会遇到这样的一些问题:

  • 前端项目如何部署到服务器?
  • 接口跨域怎么解决?
  • 一个域名如何同时代理多个后端服务?
  • 如何限制某个IP的恶意请求?

这些问题,几乎都绕不开一个工具 —— Nginx。我是一个坚定的 Nginx 爱好者,虽然也接触过 Apache 和 IIS 这些其他的工具,但是最终还是 Nginx 轻量化获得了我的芳心。我会从实际项目出发给大家简单的介绍梳理一下 Nginx 的核心知识点。


一、 什么是 Nginx?

Nginx 是一款高性能的 Web 服务器 / 反向代理服务器,可以用于:

  • 托管静态资源
  • 反向代理后端服务
  • 负载均衡
  • 解决跨域问题

几乎所有中大型 Web 项目,生产环境都可以使用 Nginx。

一个典型的 Web 架构是:

1
2
3
4
5
浏览器

Nginx(80 / 443)

后端服务(Node / Java / Python / Go)

Nginx 就像一个门卫

  • 接收所有请求
  • 决定请求去哪里
  • 控制访问规则和性能

二、一个核心概念

正向代理 vs 反向代理

正向代理

  • 代理的是客户端
  • 比如:VPN

反向代理

  • 代理的是服务器
  • 客户端并不知道真实后端地址
  • 比如:我的博客你访问的是我服务器的 80 / 443 端口,但是实际上我是将 8000 端口代理到 80 和 443 的

我们平常的项目中,99% 用的是反向代理。


三、Nginx 的安装与基础使用

1. 常见安装方式

这里我只展示 Windows 和 Linux 的安装方式,如果使用的是 Mac 的话,可以参考 Linux 的方式,或者网上自行搜索相关教程。

Windows

  1. 首先进入点击链接官网: Nginx官网

  2. 然后点击 download,之后选择 nginx/Windows ,然后下载之后会有一个压缩包

    nginx官网
  3. 将文件解压之后,你就会看到 nginx 的目录,然后双击 nginx.exe 即可启动 nginx ,然后在浏览器中访问 localhost 出现页面就代表成功了。

    nginx目录结构
    访问localhost

Linux

  1. Linux 也是同样的官网,只不过下载的是旁边的版本。

    nginx-linux下载
  2. 解压包并进入 nginx 文件夹下

    1
    2
    tar -zxf nginx-版本.tar.gz # 解压安装包
    cd nginx-版本 # 进入文件夹
  3. 配置 nginx :./configure

  4. 编译安装nginx : make&&make install

  5. 运行nginx

    1
    2
    cd /usr/local/nginx/sbin # 转换到sbin文件夹下
    ./nginx # 运行nginx
  6. 查看结果,直接 curl http://localhost:80 ,如果出现HTML的代码,那就代表 nginx 安装成功了

2. 常用命令

1
2
3
4
5
6
7
8
9
10
11
# 启动
nginx

# 检查配置文件是否有误
nginx -t

# 重载配置(最常用)
nginx -s reload

# 停止
nginx -s stop

四、Nginx 配置文件

1. server

1
2
3
4
server {
listen 80;
server_name example.com; # 填写域名,如果没有可以填localhost
}
  • 一个 server = 一个站点
  • 可配置多个 server,实现多域名

2. location

1
2
location /api/ {
}
  1. = 精确匹配
  2. ^~ 前缀匹配
  3. 正则 ~
  4. 普通前缀匹配

3. root 和 alias

1
2
3
4
5
6
7
8
9
location /static/ {
root /data;
}
# 实际路径:/data/static/xxx

location /img/ {
alias /data/images/; # alias 必须以 `/` 结尾
}
# 实际路径:/data/images/xxx

4. 反向代理

1
2
3
location /api/ {
proxy_pass http://localhost:3000;
}

访问:

1
2
3
http://localhost/api/user

http://localhost:3000/user

5. HTTPS/SSL 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
server {
# 将原有 listen 80 修改为 listen 80 改为 listen 443 ssl
listen 443 ssl;
# 原有 server_name,可继续新增更多当前证书支持的域名
server_name 你的域名;

# 指定证书文件(中间证书可以拼接至该pem文件中),请将 /etc/ssl/cert/ssl.pem 替换为您实际使用的证书文件的绝对路径
ssl_certificate /etc/nginx/cert/你的域名.pem;
# 指定私钥文档,请将 /etc/ssl/cert/ssl.key 替换为您实际使用的私钥文件的绝对路径
ssl_certificate_key /etc/nginx/cert/你的域名.key;
# 配置 SSL 会话缓存,提高性能
ssl_session_cache shared:SSL:1m;
# 设置 SSL 会话超时时间
ssl_session_timeout 5m;
# 自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# 指定允许的 TLS 协议版本,TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差
ssl_protocols TLSv1.2 TLSv1.3;
# 优先使用服务端指定的加密套件
ssl_prefer_server_ciphers on;
# ======================= 证书配置结束 =======================

# 其它配置
location / {
proxy_pass http://localhost:8000; # 将请求转发到本地8000端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

五、总结

上面是我的一些常用的配置,当然还有一些负载均衡、日志分析呀这些功能我就不一一介绍了,最后总结一下,Nginx 是我日常开发架构中不可或缺的一个工具。作为反向代理服务器,它比传统服务器更节省资源,能轻松处理高并发。将 Nginx 作为项目部署的前置层,它的配置直观、灵活,从简单的静态站点到复杂的微服务网关,都能胜任。