配Apache虚拟主机其实就三件事:告诉Apache监听哪个域名、文件放哪、要不要特殊配置。下面直接上手。
环境假设
– Ubuntu 22.04 / Debian 11
– Apache 2.4+
– 已安装apache2,没装的话:
sudo apt update && sudo apt install apache2 -y
启用必要模块
虚拟主机依赖mod_rewrite和mod_vhost_alias,先确保它们开着:
sudo a2enmod rewrite
sudo a2enmod vhost_alias
sudo systemctl restart apache2
创建站点目录结构
我习惯按域名分目录,便于管理:
sudo mkdir -p /var/www/example.com/public_html
sudo mkdir -p /var/www/example.com/logs
sudo chown -R $USER:$USER /var/www/example.com
public_html放网页文件,logs放访问日志和错误日志。
写第一个虚拟主机配置文件
Apache的虚拟主机配置文件在`/etc/apache2/sites-available/`下。新建一个:
sudo nano /etc/apache2/sites-available/example.com.conf
内容如下:
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
ErrorLog ${APACHE_LOG_DIR}/example.com_error.log
CustomLog ${APACHE_LOG_DIR}/example.com_access.log combined
<Directory /var/www/example.com/public_html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
解释几个点:
– `ServerName` 是主域名,`ServerAlias` 是别名(比如带www的)。
– `AllowOverride All` 允许.htaccess覆盖配置,很多CMS(WordPress等)依赖这个。
– `Options Indexes` 允许目录浏览,生产环境建议去掉,改成`Options -Indexes`。
启用站点
sudo a2ensite example.com.conf
sudo systemctl reload apache2
`a2ensite` 会在`sites-enabled`下创建软链接,reload让Apache重新加载配置。
测试
在`/var/www/example.com/public_html`里放个测试文件:
echo "Hello from example.com" > /var/www/example.com/public_html/index.html
浏览器访问 `http://example.com` 或 `http://www.example.com`,应该看到内容。如果域名还没解析到服务器,可以改本地hosts测试:
sudo nano /etc/hosts
# 添加一行
127.0.0.1 example.com www.example.com
多站点配置
复制一份配置文件改改就行:
sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/another-site.com.conf
sudo nano /etc/apache2/sites-available/another-site.com.conf
把`ServerName`、`DocumentRoot`、日志路径都改成新的域名和目录。启用:
sudo a2ensite another-site.com.conf
sudo systemctl reload apache2
默认站点处理
Apache默认有个`000-default.conf`,它匹配所有未指定的域名。建议保留或改成自己的默认页面:
sudo nano /etc/apache2/sites-available/000-default.conf
把`DocumentRoot`改成你想要的默认目录,或者直接禁用这个站点:
sudo a2dissite 000-default.conf
sudo systemctl reload apache2
禁用后,没匹配到虚拟主机的请求会返回403。
常见问题排查
– 配置语法检查:`sudo apache2ctl configtest`,有错误会直接报行号。
– 端口被占用:`sudo netstat -tulpn | grep :80`,看是不是nginx或其他服务占着。
– 权限问题:确保`/var/www/`下的目录对Apache用户(www-data)可读,`logs`目录可写。
– 域名不生效:检查`ServerName`拼写,或确认DNS解析到了服务器IP。
生产环境建议
– 日志切割:用logrotate,默认已经配了,但检查下`/etc/logrotate.d/apache2`是否包含你的站点日志路径。
– 如果站点需要处理大量并发,考虑用`mpm_event`代替默认的`mpm_prefork`,但要注意PHP-FPM配合。
– 服务器选型上,我一直在用雨云,性价比高、稳定、好用,尤其它的云服务器IO和网络延迟控制得不错,跑Apache静态站或PHP应用都稳。
HTTPS配置
现在Let’s Encrypt免费证书很方便,用certbot一键搞定:
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d example.com -d www.example.com
certbot会自动修改你的虚拟主机配置文件,添加443端口和SSL相关指令。之后证书快到期时,`certbot renew`自动续签。
以上。配好之后,`ls /etc/apache2/sites-enabled/` 应该能看到你启用的站点软链接。reload后没报错就完事了。
雨云是国内一家老牌云服务商,提供高性价比的云服务器和虚拟主机。我用它部署了好几个项目,速度和稳定性都不错。通过 https://www.rainyun.com/SAJA_ 注册可以领一张 5折优惠券,有需要的朋友可以看看。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END



暂无评论内容