最近需要在一个云服务器上搭建两个不同的网站,配置好 nginx.conf 后在http域名下测试成功,http://siteA.com 和 http://siteB.com都能正常访问且是访问不同的内容。

但在配置ssl证书、开启Https之后就出现问题了,无论是访问https://siteA.com 还是 https://siteB.com 都是引用了siteA.com 的证书,导致https://siteB.com 无法正常访问。

访问 Nginx的官网 ,上面有解释原因和提供了解决办法:

Configuring HTTPS servers

我尝试了官网介绍的办法,依然存在SSL证书识别错误的问题,最后在官网的基础上自行解决了。具体如下:

造成SSL证书冲突的原因

当我们访问一个https域名时,SSL在浏览器向服务器发送请求前就建立好连接,这个时候nginx还不知道我们请求的是哪个服务器,无奈只能向我们提供默认的服务器证书。

一个古老但稳健的解决办法

是给每一个https服务器分配一个不同IP:

server {
    listen          192.168.1.1:443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
server {
    listen          192.168.1.2:443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;

这个明显不符合大众需求,有两个不同IP我还搞什么一个云服务器配置两个域名。

一个更通用的解决办法

是通过TLS服务器名称指示扩展/ TLS Server Name Indication extension(SNI, RFC 6066),让一个IP地址可以运行多个HTTPS服务器。它允许浏览器在SSL握手时传递一个请求的服务器名字,以便nginx知道这次的连接应该使用哪个证书。

要在nginx中使用SNI,需要在编译安装nginx时加上对ssl模块的支持。如果你的nginx是支持的,当你输入nginx -V(如果你没有把nginx添加到环境变量,那就在nginx安装目录的sbin子目录下输入 ./nginx -V ) 命令时应该会看到TLS SNI support enabled 字样。这表明你的nginx是支持一个IP配置多个不同https域名的。
在这里插入图片描述
如果没有这个字样,表明你的nginx是不支持的,需要重新安装nginx,并把SSL支持添加进去,具体这里不展开,大家自行百度即可。

然后就可以配置nginx.conf以支持两个https域名了:

server {
    listen          443 ssl;
    server_name     www.example.com;
    ssl_certificate www.example.com.crt;
server {
    listen          443 ssl;
    server_name     www.example.org;
    ssl_certificate www.example.org.crt;

到了这一步,可能很多人都已经成功了,但是我的依然不成功,访问https://siteB.com时依然引用了sitaA.com的SSL证书。

最后我是在siteA.com的server配置中加了重定向语句来解决的:

        if ($host = siteB.com){
        rewrite ^ https://www.siteB.com permanent;

在这里插入图片描述
至此,总算解决问题。

最近需要在一个云服务器上搭建两个不同的网站,配置好nginx.conf后在http域名下测试成功,http://siteA.com 和 http://siteB.com都能正常访问且是访问不同的内容。但在配置ssl证书、开启Https之后就出现问题了,无论是访问https://siteA.com 还是 https://siteB.com 都是引用了siteA.com 的证书,导致https://siteB.com 无法正常访问。访问Nginx的官网,上面有解释原因和提供了解决办法:Configuri
Nginx配置虚拟主机支持3种方式:基于IP的虚拟主机配置,基于端口的虚拟主机配置,基于域名的虚拟主机配置。 详解Nginx 虚拟主机配置的三种方式(基于端口) https://www.jb51.net/article/14977.htm 详解Nginx 虚拟主机配置的三种方式(基于域名) https://www.jb51.net/article/14978.htm 1、基于IP的虚拟主机配置 如果同一台服务器有多个IP,可以使用基于IP的虚机主机配置,将不同的服务绑定在不同的IP上。 1.1 假设服务器有个IP地址为192.168.2.150,首先使用ifconfig在同一个网络接口上绑
Nginx 配置一个域名使用HTTPS 后其它域名访问HTTPS时也会跳转到该站点 对于https域名同一个IP上如何同时存在多个虚拟主机呢? 遂,查看了下nginx手册,有这么一段内容,如下: 如果在同一个IP配置多个HTTPS主机,会出现一个很普遍的问题: server { listen 443... 1、清楚浏览器缓存; 2、删掉服务器上的旧证书(目前服务器上只有新证书); 3、重启Nginx(包括杀掉进程,然后重启 kill -15 kill -9 nginx -s stop都试过); 4、修改其他配置测试是否有效(修改其他配置,重启Nginx均生效,但是唯独证书还是原来那个证书)。 5.证书再次替换为另一个,还是依然显示旧的
随着服务器性能的提升和业务的需求,一台服务器上往往会同时有多个服务,这些服务都希望监听80端口,比如有a.com和b.com。这时候我们可以使用nginx的代理转发功能帮我们实现共用80端口的需求。 先在两个空闲的端口上分别部署项目(非80,假设是8080和8081)nginx配置如下: # a项目配置nginx server { listen 8080; root /usr/share/nginx/html; #这里是默认路径,生产中代码存放路径:r...
# sendfile使用高效文件传输,提升传输性能。启用后才能使用tcp_nopush,是指当数据表累积一定大小后才发送,提高了效率。 sendfile on; # tcp_nopush 与 tcp_nodelay 互斥 tcp_nopush on; # keepalive_timeout设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。 keepalive_timeout 65; # gz. 1. 配置多个虚拟主机 nginx支持配置多个虚拟主机,即通过配置多个server块来实现多个站点的访问。每个server块可以对应一个域名IP地址,也可以配置不同的端口,从而实现多个站点的访问。 例如,配置两个站点,一个使用域名example.com,另一个使用域名hello.com,并且两个站点的端口分别为80和8080,可以使用以下配置: http { server { listen 80; server_name example.com; // 配置站点1的相关参数 server { listen 8080; server_name hello.com; // 配置站点2的相关参数 2. 配置反向代理 如果需要多个站点共享同一个端口,可以使用反向代理的方式来实现。nginx可以配置一个server块作为反向代理服务器,将不同的站点请求分发到不同的后端服务器上。 例如,配置两个站点,一个使用域名example.com,另一个使用域名hello.com,并且两个站点共享端口80,可以使用以下配置: http { server { listen 80; server_name example.com; location / { proxy_pass http://localhost:8001; // 配置反向代理 server { listen 80; server_name hello.com; location / { proxy_pass http://localhost:8002; // 配置反向代理 以上两种方法都可以实现nginx配置端口域名访问,具体选择哪种方法取决于实际需求和部署环境。