求助如何配置 nginx 的二级域名?

背景

最近 618 搞活动,买了台新的服务器,所以想着在本机搞一个静态页面,然后子域名解析到静态页面,静态页面 AJAX 请求到另一台服务器,如下图所示

image.png

问题

然后我卡在了怎么配置 nginx 的二级域名上,找了网上很多教程都没有但是没有实现

还原我之前的步骤

1.配置解析域名

image.png

2.搭建了一个简单的项目,通过 ip 加端口号查看是否能够访问,发现是可以的

image.png

3.配置 nginx

# 主站ssl
server {
    listen       443;
    server_name  localhost;
    ssl on;

    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;

    ssl_certificate /ssl/3098503_runnable.run.pem;
    ssl_certificate_key /ssl/3098503_runnable.run.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;


    location / {
        proxy_pass http://www.runnable.run:8080;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
# 主站
server{
  listen 80;
  server_name runnable.run;
  rewrite ^(.*) https://$host$1 permanent;
  proxy_set_header  Host $http_host;
  proxy_set_header  X-Real-IP  $remote_addr; 
}

# 子域名
server {
    listen       80;
    server_name  ssq.runnable.run;

    location / {
        proxy_pass              http://127.0.0.1:8081;
        proxy_redirect          off;
        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}


# 子域名ssl
server {
   listen       443;
   server_name  ssq.runnable.run;
   ssl  on;

   ssl_certificate      /ssl/ssq.runnable.pem;
   ssl_certificate_key  /ssl/ssq.runnable.key;
   ssl_session_timeout  5m;
   ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers               ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;    ssl_session_cache         shared:SSL:50m;
   ssl_prefer_server_ciphers on;

   location / {
        proxy_pass http://127.0.0.1:8081;
        proxy_http_version 1.1;
        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;
    }

}


结果

结果是主站任然可以访问,但是访问子域名的时候发现跳转到主站了,而且 ssl 不生效

image.png

image.png

有没有大佬教我一下,已经网上找了很多解决方案尝试过,不知道问题出在哪

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    266 引用 • 526 回帖 • 535 关注
  • Solo

    Solo 是一款小而美的开源博客系统,专为程序员设计。Solo 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    1213 引用 • 9314 回帖 • 628 关注
  • 配置
    14 引用 • 157 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    1761 引用 • 11538 回帖 • 581 关注

赞助商 我要投放

被采纳的回答

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • lzh984294471

    主站得出 servername 写成 runnable.run

    1 回复
  • MingGH

    我刚刚尝试了一下,还是不行。。。
    然后我又尝试了一下把 nginx 中的两个 server 端口进行交换,发现打开的网页也不出意料的交换了,但是仍然只显示主域名的。
    所以应该是 nginx 中的第二个 server 配置没有效果,但是为什么没有效果不知道。。。。。。

    # 主站ssl
    server {
        listen       443;
        server_name  runnable.run;
        ssl on;
    
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
    
        ssl_certificate /ssl/3098503_runnable.run.pem;
        ssl_certificate_key /ssl/3098503_runnable.run.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
    
    
        location / {
            proxy_pass http://47.96.163.98:8080;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    # 主站
    server{
      listen 80;
      server_name runnable.run;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Real-IP  $remote_addr; 
    }
    
    # 子域名
    server {
        listen       80;
        server_name  ssq.runnable.run;
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
    
    }
    
    
    # 子域名ssl
    server {
       listen       443;
       server_name  ssq.runnable.run;
       ssl  on;
    
       ssl_certificate      /ssl/ssq.runnable.pem;
       ssl_certificate_key  /ssl/ssq.runnable.key;
       ssl_session_timeout  5m;
       ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
       ssl_ciphers               ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;    ssl_session_cache         shared:SSL:50m;
       ssl_prefer_server_ciphers on;
    
       location / {
            proxy_pass http://47.96.163.98:8081;
            proxy_http_version 1.1;
            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 回复
  • MingGH

    结帖了

    问题解决了,问题具体还是出在配置上,

    还原刚刚我解决的步骤

    参考了一篇博客

    请教一个关于 nginx 和二级域名的问题

    按照博客中提到的配置,先还原 nginx 最开始的配置(只能主域名查看,未配置子域名),然后添加一个 server

    server {
        listen       80;
        server_name  ssq.runnable.run;
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
        location / {
            proxy_pass http://47.96.163.98:8081;
        }
    
    }
    

    实现了上述博客中的效果,主域名是博客,子域名是其他项目

    发现离我想要的结果已经很接近了,只要加上 ssl 就可以了,所以我怀疑我的 ssl 连接也有问题,之前在一个小网站申请的,所以又去阿里云申请了一个免费的
    image.png

    ,在申请的过程中,提示我填写完整域名,完成之后,也就是这张图里面我意识到一个很重要的问题,也就是
    www.ssq.runnable.run ≠ ssq.runnable.run
    啊!!!然后我就明白了为啥之前配置不行
    所以我申请的 ssl 是 www.ssq.runnable.run,我的域名解析应该也是这个,我的 nginx 配置也应该是这个,干!以及我的 ssl 证书也应该是这个

    重新走一遍流程

    域名解析->nginx 配置-> 部署-> 测试

    没问题了,可以实现主域名和子域名不同的项目访问,而且都带 ssl 证书

    附上现在成功的 nginx 配置供参考

    server {
        listen       443;
        server_name  www.ssq.runnable.run;
        ssl on;
    
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
    
        ssl_certificate /ssl/4163762_www.ssq.runnable.run.pem;
        ssl_certificate_key /ssl/4163762_www.ssq.runnable.run.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
    
    
        location / {
            proxy_pass http://47.96.163.98:8081;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    
    
    server {
        listen       80;
        server_name  www.ssq.runnable.run;
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
    
    }
    
    
    server {
        listen       443;
        server_name  runnable.run;
        ssl on;
    
        proxy_set_header  Host $http_host;
        proxy_set_header  X-Real-IP  $remote_addr;
    
        ssl_certificate /ssl/3098503_runnable.run.pem;
        ssl_certificate_key /ssl/3098503_runnable.run.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
    
    
        location / {
            proxy_pass http://47.96.163.98:8080;
        }
    
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    
    server{
      listen 80;
      server_name runnable.run;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Real-IP  $remote_addr; 
    }
    
    
    
    
    
    
    
    
    

    遗留的小问题

    部署之后发现

    子域名必须带上 www 才能访问

    image.png

    主域名必须去掉 www 才能访问

    image.png

    所以,我猜,应该是 nginx 对 www.runnable.run 的部署还存在一些问题

  • lzh984294471

    你这个就不知道了,可以参照我这个试下:https://git.zeekling.cn/zeekling/configs/src/branch/master/nginx/sites-enabled

    1 回复
  • MingGH

    谢谢帮助,那天下午的时候已经可以了,我在帖子的另一个回复上写了,是我配置有问题,我把 www.ssq.runnable.run 当作 ssq.runnable.run 处理了,原来两个是不同的东西