Nginx 配置拆分为主文件和 conf.d/ 子模块,不仅是模块化思想的典型应用,更是现代软件开发中 “分而治之” 理念的延伸。通过这种方式,Nginx 配置系统能够更好地应对复杂性、协作需求和动态变更,与微服务、组件化、微前端等前沿架构思想的思路一样的。

需求

  • 工作中,我们使用高性能的nginx进行服务器的反向代理
  • 随着项目的增加,nginxserver块也越来越多
  • (一个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...

水冗水孚
1.1k 声望598 粉丝

每一个不曾起舞的日子,都是对生命的辜负