Appearance
基于域名的虚拟主机
基于域名的虚拟主机是最常用的虚拟主机配置方式,通过不同的域名访问不同的网站。
基本配置
配置示例
nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name test.com www.test.com;
root /var/www/test.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}配置说明
listen 80:监听80端口server_name:指定域名,可以指定多个root:网站根目录index:默认首页文件
server_name匹配规则
精确匹配
nginx
server_name example.com;通配符匹配
nginx
# 前缀通配符
server_name *.example.com;
# 后缀通配符
server_name example.*;正则表达式匹配
nginx
server_name ~^(?<subdomain>.+)\.example\.com$;优先级
- 精确匹配
- 前缀通配符(*.example.com)
- 后缀通配符(example.*)
- 正则表达式匹配
完整配置示例
多域名配置
nginx
# 站点1
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
# 站点2
server {
listen 80;
server_name test.com www.test.com;
root /var/www/test.com;
index index.html index.htm;
access_log /var/log/nginx/test.com.access.log;
error_log /var/log/nginx/test.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
# 默认站点
server {
listen 80 default_server;
server_name _;
root /var/www/default;
index index.html index.htm;
location / {
return 404;
}
}配置文件组织
单文件配置
将所有虚拟主机配置放在一个文件中:
nginx
# /etc/nginx/nginx.conf
http {
include /etc/nginx/mime.types;
server {
listen 80;
server_name example.com;
root /var/www/example.com;
}
server {
listen 80;
server_name test.com;
root /var/www/test.com;
}
}多文件配置
将每个虚拟主机配置放在独立文件中:
/etc/nginx/
├── nginx.conf
└── conf.d/
├── example.com.conf
└── test.com.confexample.com.conf
nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}test.com.conf
nginx
server {
listen 80;
server_name test.com www.test.com;
root /var/www/test.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}nginx.conf
nginx
http {
include /etc/nginx/mime.types;
include /etc/nginx/conf.d/*.conf;
}域名解析
配置DNS
将域名解析到服务器IP地址:
example.com A 192.168.1.100
www.example.com A 192.168.1.100
test.com A 192.168.1.100
www.test.com A 192.168.1.100本地测试
修改本地hosts文件进行测试:
Windows
C:\Windows\System32\drivers\etc\hostsLinux/Mac
/etc/hosts添加内容:
192.168.1.100 example.com
192.168.1.100 www.example.com
192.168.1.100 test.com
192.168.1.100 www.test.com常见配置
主域名和www域名
nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
}多个域名指向同一站点
nginx
server {
listen 80;
server_name example.com www.example.com example.net www.example.net;
root /var/www/example.com;
index index.html index.htm;
}子域名配置
nginx
# 主域名
server {
listen 80;
server_name example.com;
root /var/www/example.com;
}
# 子域名
server {
listen 80;
server_name blog.example.com;
root /var/www/blog.example.com;
}
server {
listen 80;
server_name api.example.com;
root /var/www/api.example.com;
}通配符子域名
nginx
server {
listen 80;
server_name *.example.com;
root /var/www/$subdomain;
set $subdomain $host;
if ($host ~* ^(.*)\.example\.com$) {
set $subdomain $1;
}
location / {
try_files $uri $uri/ =404;
}
}域名跳转
HTTP跳转HTTPS
nginx
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
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;
root /var/www/example.com;
index index.html index.htm;
}www跳转到非www
nginx
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
root /var/www/example.com;
}非www跳转到www
nginx
server {
listen 80;
server_name example.com;
return 301 http://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
root /var/www/example.com;
}测试配置
测试配置文件
bash
nginx -t重载配置
bash
nginx -s reload查看域名解析
bash
nslookup example.com
dig example.com测试访问
bash
curl -H "Host: example.com" http://localhost常见问题
域名无法访问
检查项:
- DNS解析是否正确
- 防火墙是否开放80端口
- Nginx配置是否正确
- 网站目录权限是否正确
访问错误站点
原因: server_name配置错误
解决: 检查server_name配置
默认站点问题
解决: 配置default_server
nginx
server {
listen 80 default_server;
server_name _;
return 404;
}总结
基于域名的虚拟主机配置要点:
- server_name:指定域名,支持通配符和正则表达式
- root:设置网站根目录
- 日志:为每个站点配置独立的日志
- 文件组织:建议将每个站点配置放在独立文件中
- 域名解析:确保DNS解析正确
合理配置虚拟主机,可以在一台服务器上托管多个网站。