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

本贴最后更新于 1712 天前,其中的信息可能已经事过景迁

背景

最近 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 日。

    315 引用 • 547 回帖 • 2 关注
  • Solo

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

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

    1439 引用 • 10067 回帖 • 490 关注
  • 配置
    16 引用 • 159 回帖
  • Q&A

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

    9258 引用 • 42107 回帖 • 119 关注

相关帖子

被采纳的回答

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • zeekling via Linux

    主站得出 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 的部署还存在一些问题

  • zeekling via Linux

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

    1 回复
  • MingGH

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