nginx server_name配置文件覆盖不生效

nginx server配置文件覆盖不生效

背景: 要在1个nginx上加两个域名解析,dns解析已经做了,按正常来说,当访问不同的域名的时候,可以分别跳转到不同的后端,但是现象是所有的请求都打到新增的那个后端服务上了,
最后发现原先的同事在配置443的时候,没有加server_name

如果不加server_name会发生什么

server_name 指令用于指定一个或多个域名,Nginx 将根据客户端请求中的 Host 头来匹配相应的 server_name,从而确定应该用哪个 server block 来处理请求。
如果没有 server_name 指令,Nginx 将无法区分不同域名的请求,因此所有请求都将被默认server block处理。默认情况下,如果没有指定 server_name,Nginx 会认为该server block是一个默认server block,它会处理所有未匹配其他server block的请求。

除了不加server_name还有可能有其他情况导致配置失效

  • 配置文件位置错误:
    如果你直接在 /etc/nginx/nginx.conf 文件中添加了新的server block,那么可能会覆盖已有的server block配置。正确的做法是在 /etc/nginx/conf.d/ 目录下创建独立的配置文件,并确保 /etc/nginx/nginx.conf 包含了这些配置文件的引用。

  • 配置文件引用丢失:
    如果你在 /etc/nginx/nginx.conf 文件中删除了引用其他配置文件的行(例如 include /etc/nginx/conf.d/*.conf;),那么其他配置文件将不会被加载。

  • server_name 配置问题:
    如果新的server block中的 server_name 包含了其他域名,那么这些域名的请求将被新的server block处理。确保 server_name 只包含目标域名及其子域名(如有必要)。

  • 默认server block问题:
    如果没有指定 server_name 的server block被认为是默认server block,它会捕获所有未匹配其他server block的请求。确保没有默认server block,或者确保默认server block的行为符合预期。

  • 配置冲突:
    如果多个server block监听相同的端口,并且它们之间存在重叠(比如 server_name 设置有误),那么Nginx会选择最先匹配的server block来处理请求。检查所有server block的 server_name 设置是否正确无误。

怎么1个nginx配置两个域名

假设我们有两个域名 example.com 和 test.com,并且这两个域名分别需要代理到不同的后端服务器:

示例配置

  1. example.com 的配置
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://backend_server_for_example_com; # 例如: http://192.168.1.100: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;
    }
}
  1. test.com 的配置
server {
    listen 443 ssl http2;
    server_name test.com www.test.com;

    ssl_certificate /etc/letsencrypt/live/test.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/test.com/privkey.pem;

    location / {
        proxy_pass http://backend_server_for_test_com; # 例如: http://192.168.1.101: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;
    }
}

注意事项
监听端口和协议:确保listen指令包含了http2,因为现代浏览器支持HTTP/2,这可以提高性能。不过,这不是必须的,可以根据实际需求决定是否开启。
域名匹配:确保server_name指令中列出的所有域名都是你希望配置的域名。例如,如果你希望www.example.com和example.com都指向同一个后端,那么就需要在server_name中列出这两个域名。
证书路径:确保ssl_certificate和ssl_certificate_key指令中的路径指向正确的证书文件。这些文件通常由SSL证书颁发机构提供。
后端地址:确保proxy_pass指令中的URL指向正确的后端服务器地址。例如,如果是内部局域网内的服务器,可能是类似http://192.168.1.100:8000这样的地址。

配置验证
sudo nginx -t
如果配置正确,输出应该类似于:

sudo systemctl reload nginx

posted @ 2024-10-09 16:09  liwenchao1995  阅读(50)  评论(0编辑  收藏  举报