将Nginx
配置拆分为主文件和conf.d/
子模块,不仅是模块化思想的典型应用,更是现代软件开发中 “分而治之” 理念的延伸。通过这种方式,Nginx
配置系统能够更好地应对复杂性、协作需求和动态变更,与微服务、组件化、微前端等前沿架构思想的思路一样的。
需求
- 工作中,我们使用高性能的
nginx
进行服务器的反向代理 - 随着项目的增加,
nginx
的server块
也越来越多 - (一个
server块
可以监听一个域名或者一个端口做对应服务处理) - 如果都维护在同一个默认的
nginx.conf
文件中,则会导致nginx.conf
越来越大,冗余、不好维护 - 于是,按照模块化的思想,我们就需要进行
server块
的拆分,即:“分而治之”
不拆分的nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
}
server {
listen 800;
}
server {
listen 8000;
}
# 等等一堆server
...
server {
listen 65536;
}
}
用端口示意一下,实际上listen 443 ssl; server_name abcd.com.cn;
之类的...
拆分后的nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 引入同级目录下的conf.d文件夹的所有的以.conf结尾的server配置
include conf.d/*.conf;
}
- 首先在和默认的
nginx.conf
文件同级目录下,新建一个文件夹(一般叫做conf.d
文件夹,起名字无所谓的 - 然后在
conf.d
文件夹里新建一个又一个xxx.conf
- 具体这个
xxx
可以根据业务server块
进行命名 - 而后,把原本的
server块
都单独拎出来,放到一个又一个的xxx.conf
的文件中 - 最后,
直接通过include语法引入所有的xxx.conf即可
图示
同级目录新建conf.d文件夹
server块单独拎出来,放到一些xxx.conf的文件中
- 如下,假如我是三个
server块
- 新建对应
conf文件
,直接把server块
粘贴到对应conf文件
中即可
include的三种写法
*.conf
代表通配符,以.conf
结尾的文件
- 方式一 相对路径:
include conf.d/*.conf;
- 方式二 相对路径:
include ./conf.d/*.conf
- 方式三 绝对路径:
/etc/nginx/conf.d/*.conf
(linux也可以这样写,从根目录查找)
推荐 方式一 简洁不冗余 【一定要conf.d文件夹和nginx.conf同级目录】
检验操作后语法有没有错误
nginx -t
检查是否有语法错误,出现如下消息ok successful便是没问题- 而后再
nginx -s reload
重加载一下nginx即可
nginx的server块的五个功能
功能一 监听端口绑定域名
如:
server {
listen 80;
server_name abcd.com;
# 其他配置...
}
例子意思是:当 Nginx 接收到请求域名为 abcd.com
并且端口为 80 的请求时,将会由该 server
块处理。
功能二 server中的location监听请求返回资源,接口转发
如:请求返回资源
location / {
root /var/www/html;
index index.html index.htm;
}
例子意思是:对 /
路径的请求返回指定目录 /var/www/html
下的静态文件。
如:接口转发
server {
listen 80;
server_name abcd.com;
location /api/ {
proxy_pass http://backend_api;
}
}
例子意思是:对 /api
路径的请求,代理转发到http://backend_api;
后端的服务接口,就相当于vite.config.js
文件中的proxy代理
功能三 server块中配置SSL证书
如:
server {
listen 443 ssl;
server_name abcd.com;
ssl_certificate cert/abcd.pem;
ssl_certificate_key cert/abcd.key;
}
注意,这个cert也是和nginx.conf文件夹同级目录的,相当于conf.d文件夹目录的,里面存放我们购买ssl证书文件和私钥文件。
吐槽一句,证书挺贵的,看下图:
腾讯云证书购买链接:https://buy.cloud.tencent.com/ssl?fromSource=ssl
功能四 多个server块做负载均衡
- 可以配置多个
server
块来处理负载均衡,分发请求到不同的后端的服务器。 - 每个
server
块会根据不同的策略转发请求。 - 就是多个人
server
一块干活,均衡一下
这个一般是运维去操作配置,或者后端负责人,并且是大型项目
功能五 404或者error\_page
server {
listen 80;
server_name abcd.com;
error_page 404 /404.html;
location = /404.html {
root D:/nginx-1.18.0/html/errors;
}
}
- 当用户请求一个不存在的页面时
- Nginx 会显示 D:/nginx-1.18.0/html/errors/404.html 这个自定义的 404 错误页面
- 而不是默认的错误提示。
- 就是一个兜底的页面
- 用的不是太多
A good memory is better than a bad pen. Record it down...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。