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,并且这两个域名分别需要代理到不同的后端服务器:
示例配置
- 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;
}
}
- 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