最近需要在一个云服务器上搭建两个不同的网站,配置好
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证书识别错误的问题,最后在官网的基础上自行解决了。具体如下:
当我们访问一个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配置多端口多域名访问,具体选择哪种方法取决于实际需求和部署环境。