生产环境基于IP的虚拟主机核心是稳定、隔离、可审计,通过独占IP、静态绑定、目录隔离、独立日志及“停—验—启”闭环流程实现网络层强隔离与合规可控。
生产环境用基于 ip 的虚拟主机,核心是稳定、隔离、可审计。它不依赖 dns 解析或 host 头,天然规避了域名劫持、sni 限制、http/https 混合 host 冲突等问题,特别适合多租户托管、合规审计场景或需严格网络层隔离的业务。
一、前置准备:IP 绑定与系统加固
确保每个虚拟主机独占一个公网或内网 IP,并完成基础安全收敛:
- 使用 静态网络配置(非 DHCP)绑定多个 IP,例如在 Ubuntu 上编辑
/etc/netplan/01-netcfg.yaml,CentOS/Rocky 上修改/etc/sysconfig/network-scripts/ifcfg-eth0:0等子接口; - 禁用 SELinux(生产中若启用,需精确策略):
sudo setenforce 0 && sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config; - 启用 UFW 或 firewalld,仅放行对应 IP 的 80/443 端口:
sudo ufw allow from 192.168.1.10 to any port 80(按 IP 精确控制); - 创建独立运维用户(如
webops),禁止 root 直接登录,所有配置变更通过该用户执行。
二、目录结构与权限模型
拒绝使用 /var/www/html 共享根目录,强制站点级隔离:
- 为每个 IP 创建专属网站根目录,路径含 IP 地址标识,例如:
/srv/www/192.168.1.10/、/srv/www/192.168.1.11/; - 所有目录属主设为
root:www-data(Debian/Ubuntu)或root:apache(RHEL/Rocky),权限750; - Web 可写目录(如上传、缓存)单独设为
www-data:www-data,权限755或更严(如750+setgid); - 禁止全局
FollowSymLinks,除非明确需要,且必须配合AllowOverride None防止 .htaccess 覆盖。
三、虚拟主机配置模板(/etc/apache2/sites-available/ip-vhost-192.168.1.10.conf)
每个 IP 对应一个独立 .conf 文件,启用 a2ensite 管理,不修改主配置:
<virtualhost>
ServerAdmin admin@example.com
DocumentRoot "/srv/www/192.168.1.10"
ServerName 192.168.1.10
<pre class="brush:php;toolbar:false;"><directory>
Options -Indexes -FollowSymLinks +ExecCGI
AllowOverride None
Require all granted
# 生产环境禁用目录浏览与符号链接,仅允许可信 CGI
</directory>
ErrorLog ${APACHE_LOG_DIR}/ip-192.168.1.10-error.log
CustomLog ${APACHE_LOG_DIR}/ip-192.168.1.10-access.log combined
# 强制 HTTPS(若启用 TLS)
# Redirect permanent "/" "https://192.168.1.10/"
SSLEngine on
SSLCertificateFile /etc/ssl/certs/192.168.1.10.crt
SSLCertificateKeyFile /etc/ssl/private/192.168.1.10.key
SSLCertificateChainFile /etc/ssl/certs/chain.pem
<directory>
Options -Indexes -FollowSymLinks +ExecCGI
AllowOverride None
Require all granted
</directory>
ErrorLog ${APACHE_LOG_DIR}/ip-192.168.1.10-ssl-error.log
CustomLog ${APACHE_LOG_DIR}/ip-192.168.1.10-ssl-access.log combined
# TLS 安全加固
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
SSLCompression off
- 所有
<virtualhost></virtualhost>块显式声明 IP+端口,不用*或_default_; - 日志路径含 IP 标识,便于按 IP 切分归档;
- SSL 配置块仅在启用 HTTPS 时保留,证书路径按 IP 单独管理;
- 禁用
ServerSignature和ServerTokens(在全局apache2.conf中设为Prod)。
四、上线与验证流程
避免配置热加载引发状态不一致,坚持“停—验—启”闭环:
- 停服务:
sudo systemctl stop apache2(或httpd); - 语法检查:
sudo apache2ctl configtest(Ubuntu)或sudo httpd -t(RHEL); - 检查监听:
sudo ss -tlnp | grep ':80\|:443',确认只监听预期 IP; - 启用站点:
sudo a2ensite ip-vhost-192.168.1.10.conf(Debian/Ubuntu)或软链至/etc/httpd/conf.d/(RHEL); - 启动并验证:
sudo systemctl start apache2 && sudo systemctl status apache2,再用curl -I http://192.168.1.10和openssl s_client -connect 192.168.1.10:443 -servername 192.168.1.10测试连通性与证书。











