在Nginx服务器上安装虚拟主机和私有证书,核心流程是:先通过server块配置虚拟主机,再生成或获取SSL证书,最后在server块中指定证书路径并强制HTTPS跳转。这套操作在个人服务器和中小企业业务中非常常见,配置难度不算高,但细节容易出错,下面按照实际部署顺序,把每一步拆开讲清楚。
虚拟主机在Nginx里的本质是什么
Nginx的虚拟主机,本质上就是配置文件里的server块,每个server块监听一个端口、绑定一个域名,并指定对应的站点根目录,服务器上创建多个虚拟主机,就是写多个server块,让一台Nginx同时服务多个网站。
配置虚拟主机的常规路径是:
- 主配置文件:
/etc/nginx/nginx.conf - 子配置文件目录:
/etc/nginx/conf.d/或/etc/nginx/sites-available/
大多数Linux发行版都支持在conf.d目录下按域名拆分配置文件,比如/etc/nginx/conf.d/example.com.conf,这样做的好处是,后续修改或删除某个站点,不影响其他配置。
Nginx服务器上怎么安装虚拟主机:分步实操
第一步:确认Nginx已安装并运行
先检查环境:
nginx -v systemctl status nginx
如果尚未安装,在Ubuntu/Debian上执行:
sudo apt update sudo apt install nginx -y
CentOS/RHEL系列则用:
sudo yum install nginx -y
安装完成后启动服务并设置开机自启:
sudo systemctl start nginx sudo systemctl enable nginx
第二步:创建站点目录和测试文件
每个虚拟主机要有独立的根目录,以/var/www/example.com为例:
sudo mkdir -p /var/www/example.com sudo chown -R $USER:$USER /var/www/example.com echo "<h1>Hello from example.com</h1>" > /var/www/example.com/index.html
目录权限建议设置为755,文件权限为644,避免Nginx因权限不足返回403。
第三步:编写虚拟主机配置文件
在/etc/nginx/conf.d/下新建example.com.conf:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
这段配置的含义是:监听80端口,当请求的域名是example.com或www.example.com时,将请求映射到/var/www/example.com目录。
第四步:测试配置并重载Nginx
写完后先检查语法:
sudo nginx -t
如果输出syntax is ok和test is successful,重载配置:
sudo systemctl reload nginx
此时在浏览器访问http://example.com,如果能看到测试页面,说明虚拟主机已经生效。
第五步:添加更多虚拟主机
复制同样的步骤,创建第二个配置文件another-site.conf,修改server_name和root即可,一台Nginx可以承载几十个虚拟主机,只要服务器资源够用。
在Nginx服务器上安装私有证书的完整流程
私有证书通常指自签名SSL证书或内网使用的私有CA签发的证书,简米云服务器和酷番云服务器上的操作基本一致,区别只在安全组或防火墙是否放行443端口。
第一步:生成自签名证书
使用OpenSSL生成私钥和证书:
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/example.com.key \
-out /etc/nginx/ssl/example.com.crt
执行过程中会提示输入国家、省份、组织等信息,其中Common Name要填域名或IP地址。-nodes参数表示不加密私钥,这样Nginx启动时不需要手动输入密码,如果需要更长的有效期,可以把-days 365改成-days 3650,业内专家指出,私有证书的有效期不宜超过两年,内网环境可以适当放宽,但公网业务强烈建议使用受信任的CA证书。
第二步:修改虚拟主机配置以支持HTTPS
在原配置文件example.com.conf中新增一个443端口的server块:
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
同时添加一个80端口的跳转规则,把HTTP请求强制转到HTTPS:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
行业共识认为,强制HTTPS跳转是部署SSL证书后的必要步骤,否则用户仍可能通过明文HTTP访问,证书形同虚设。
第三步:放行防火墙和安全组
本机防火墙需要放行443端口:
sudo ufw allow 443/tcp
如果是在简米云服务器或酷番云服务器上,还要在云控制台的安全组规则中添加入方向TCP 443端口,这一步经常被忽略,导致证书配置正确但外部无法访问。
第四步:重载Nginx并验证
sudo nginx -t sudo systemctl reload nginx
验证方式:
curl -I https://example.com
或者用浏览器访问,地址栏会出现锁形图标(自签名证书会提示不受信任,这是正常现象,因为浏览器不认私有CA),想要彻底消除浏览器警告,需要把自签名的CA证书导入到操作系统的信任库中,这在企业内部可以通过组策略批量下发。
私有证书和公网证书的区别,怎么选
| 证书类型 | 适用场景 | 浏览器信任 | 成本 |
|---|---|---|---|
| 自签名证书 | 内网测试、开发环境 | 不信任,需手动导入 | 免费 |
| 私有CA签发的证书 | 企业内部系统、局域网应用 | 导入CA后信任 | 视内部CA建设成本而定 |
| 公网CA证书(如Let’s Encrypt) | 公网网站、小程序后端 | 全信任 | 免费或数百元/年 |
如果只是本地联调或内网服务,自签名证书完全够用,但涉及公网用户访问、小程序接口、App支付回调等场景,还是建议用Let’s Encrypt或云厂商提供的免费证书,需要注意,自签名证书的私钥如果泄露,攻击者可以伪造证书实施中间人攻击,内网环境也不能掉以轻心。
常见报错和排查思路
部署过程中容易遇到以下几类问题,对应的排查方向如下:
- Nginx启动失败,报错
ssl_certificate不存在:检查证书文件路径是否写错,确认Nginx用户(通常是www-data或nginx)对证书文件有读取权限。 - 访问HTTPS站点提示”连接不安全”:自签名证书的预期行为,检查证书的
Common Name是否和访问域名一致。 - HTTP能访问,HTTPS超时:大概率是安全组或防火墙没有放行443端口,用
telnet 域名 443测试连通性。 - 配置了多个server块,但访问时总是跳到同一个站点:检查
server_name是否重复,如果两个server块监听了同一个端口且server_name相同,Nginx会使用先加载的那个配置,多数情况下,这类问题源于配置文件里存在语法错误或重复的默认server块。
关于Nginx配置虚拟主机和SSL证书,常见问题解答
Nginx服务器上怎么安装虚拟主机但不影响现有站点?
只要新虚拟主机的server_name不与其他站点冲突,在conf.d目录下新增独立的配置文件,nginx -t检查通过后reload即可,Nginx的reload是平滑重载,不会中断现有请求。
自己生成私有证书后,浏览器仍然提示不安全,是否说明配置失败了?
不是,自签名证书和私有CA签发的证书天然不被浏览器信任,这是客户端侧的机制,配置本身可能已经成功,用openssl s_client -connect 域名:443可以看到证书链信息,如果确认证书链完整且服务端配置正确,只需将自签名证书导入客户端信任库即可消除警告。
一台Nginx服务器上可以同时配置虚拟主机和多个私有证书吗?
可以,Nginx支持SNI(Server Name Indication),每个server块可以指定不同的ssl_certificate和ssl_certificate_key,只要各自的server_name不同即可,注意Nginx版本不低于1.11.0时SNI支持比较完善,老版本可能会有兼容性问题。
首发原创文章,作者:王坚,如若转载,请注明出处:https://test.idctop.com/article/558777.html

