V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Rebron1900
V2EX  ›  问与答

nginx 配置多个 server 的问题,查了 2 天了,没结果,有大佬知道是怎么回事么。

  •  
  •   Rebron1900 · 2021-12-01 13:51:08 +08:00 · 1727 次点击
    这是一个创建于 1113 天前的主题,其中的信息可能已经有所发展或是发生改变。

    同一个 vps 下用 nginx 代理了两个站点,

    1. www.demo.com
    2. server.demo.com

    第一个没证书,第二个有证书。

    问题:

    现在访问 https://demo.com 会跳转到第二个站点, 显示的内容为第二个站点的内容。

    访问 http://demo.com 可以正常第一个站点的内容。

    第一个站点的 nginx 文件

    server {
        listen 80;
        listen [::]:80;
        server_name www.demo.com;
        root /var/www/ghost/system/nginx-root; 
    
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_pass http://127.0.0.1:2368;
            
        }
    
    
        location ~ /.well-known {
            allow all;
        }
    
        client_max_body_size 50m;
    }
    

    第二个站点的 nginx 文件

    server {
        listen              443 ssl;  
        server_name        server.demo.com;
        ssl_certificate     /data/_ssl/tmserver.crt;  
        ssl_certificate_key /data/_ssl/tmserver.key;
        ssl_session_cache   shared:SSL:1m;  
        ssl_session_timeout 5m;  
        ssl_ciphers         HIGH:!aNULL:!MD5;         
        ssl_prefer_server_ciphers  on;
       
        location / {
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://127.0.0.1:8080;
            proxy_http_version 1.1;
        }
    
    
    
    
        location ~ /.well-known {
            allow all;
        }
    
        client_max_body_size 50m;
    }
    
    17 条回复    2021-12-02 10:49:24 +08:00
    gam2046
        1
    gam2046  
       2021-12-01 13:58:33 +08:00
    除了这两个 server 是否还存在其他的配置项,类似这样的内容

    server {
    listen 80;
    server_name _;
    return 301 https://$host$request_uri;
    }
    Rebron1900
        2
    Rebron1900  
    OP
       2021-12-01 14:07:07 +08:00
    @gam2046
    我之前也想着是不是引入了其他配置文件,所以去过去核对过 nginx 的主配置文件。
    我这边的 server 都是通过 include 引入的,主配置文件没有其他 server ,引入代码:
    ```
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
    ```
    blackeeper
        3
    blackeeper  
       2021-12-01 14:20:40 +08:00
    https://demo.com 是 443 端口,有证书的网站是 server.demo.com 。nginx 是匹配端口之后,再匹配域名,443 的端口只有一个网站,那访问 https://demo.com 会跳转到第二个站点, 显示的内容为第二个站点的内容。
    Rebron1900
        4
    Rebron1900  
    OP
       2021-12-01 14:28:38 +08:00
    @blackeeper 这种情况我要怎么改配置文件呢。
    shenqi
        5
    shenqi  
       2021-12-01 14:35:05 +08:00
    https 优先走了 443 ,将 www.demo.com 加 443 监听就行。顺路监听 demo.com

    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen 80;
    listen [::]:433 ssl;
    server_name www.demo.com demo.com;
    root /var/www/ghost/system/nginx-root;
    ssl 配置之类 xxxxxx
    cnrting
        6
    cnrting  
       2021-12-01 14:37:49 +08:00 via iPhone
    加一个 443 给 demo.com 就行了
    Rebron1900
        7
    Rebron1900  
    OP
       2021-12-01 14:52:33 +08:00
    @shenqi @cnrting 但是我 demo.com 没有 ssl ,我监听 443 后重载配置文件失败,提示:
    nginx: [emerg] no "ssl_certificate" is defined for the "listen ... ssl" directive in /etc/nginx/sites-enabled/1900.live.conf:1
    cnrting
        8
    cnrting  
       2021-12-01 15:22:12 +08:00
    @Rebron1900 用 let's encrypted 签一个
    canbingzt
        9
    canbingzt  
       2021-12-01 15:39:53 +08:00   ❤️ 1
    感觉是 default_server 的问题,分别给 80 和 443 配置 default_server 试试
    Vegetable
        10
    Vegetable  
       2021-12-01 15:41:48 +08:00
    你 443 端口就只有一个 server ,访问 https 当然不可能到 demo.com
    Rebron1900
        11
    Rebron1900  
    OP
       2021-12-01 15:53:56 +08:00
    @cnrting 我现在这个站点就是不想搞 ssl ,有没有不绑定证书的办法
    Rebron1900
        12
    Rebron1900  
    OP
       2021-12-01 15:56:17 +08:00
    @canbingzt 刚刚测试了,显示定义 default_server 也不行。
    zelin44913
        13
    zelin44913  
       2021-12-01 16:10:34 +08:00
    明显的 default_server 问题
    zelin44913
        14
    zelin44913  
       2021-12-01 16:13:02 +08:00
    添加
    server {
    listen 443 default;
    server_name _;
    root /data;
    }
    Rebron1900
        15
    Rebron1900  
    OP
       2021-12-01 16:20:04 +08:00
    @zelin44913 修改原有的,还有新增一个。
    hahahahahahahah
        16
    hahahahahahahah  
       2021-12-01 22:34:29 +08:00 via iPhone
    http 走四层
    Rebron1900
        17
    Rebron1900  
    OP
       2021-12-02 10:49:24 +08:00
    结帖了。
    我通过在 server.deme.com 里写 if 来判断 servername ,
    如果请求的域名是 demo.com 就跳过去,如果是 server.demo.com 就直接给与访问。
    不知道是不是最优解,不过问题算是处理好了。
    谢谢各位大佬关注。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1182 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:06 · PVG 02:06 · LAX 10:06 · JFK 13:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.