Nginx绑定域名配置
Nginx绑定域名配置
引言
一台服务器跑多个站点,靠server_name区分访问哪个域名,配合DNS解析和站点根目录,Nginx按Host头把请求路由到对应虚拟主机。配置顺序写错或server_name不匹配,会落到默认站点。
基础域名站点
server {
listen 80;
server_name www.example.com example.com;
root /var/www/example;
index index.html index.php;
}
server_name可并列写主域名和裸域名,root指向站点目录。
裸域名跳转到www
server {
listen 80;
server_name example.com;
return 301 https://www.example.com$request_uri;
}
避免两个域名都解析内容造成重复收录,统一到一个规范域名。
多个域名并列
server_name api.example.com admin.example.com;
同一套站点对应多个子域名时直接空格分隔。
反向代理绑定域名
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
}
}
域名指向后端服务,记得把Host头透传给上游。
配置后检查重载
nginx -t
nginx -s reload
先测语法再平滑重载,reload不断连接。
匹配规则
- 精确域名优先,然后通配符,最后默认站点;
- 没匹配上server_name的请求落到default_server;
- 通配符*.example.com不能匹配example.com裸域;
- 多站点注意别让无关域名被默认站点接住。
注意事项
- DNS要先把A记录解析到服务器IP,否则域名打不开;
- server_name区分大小写但通常小写;
- 80改443需另配SSL证书块;
- return 301统一域名利于SEO避免重复;
- 防火墙和安全组放行80、443;
- 多个server块listen 80,靠server_name分流。
总结
server_name在server块绑定域名,可并列多个,裸域301跳www统一规范,反代时透传Host,改完nginx -t检查再reload。匹配精确优先于通配符,未命中走默认站点,前提是DNS解析到位、端口放行,统一域名有助于SEO避免重复收录。
Nginx默认站点配置
Nginx默认站点配置
引言
直接用IP或未匹配到server_name的域名访问时,Nginx会落到默认站点。装好Nginx自带的欢迎页就是默认server,安全上建议改掉,避免暴露版本或被扫描利用。
默认站点如何确定
同一端口下,第一个server块、或带default_server标记的就是默认站点:
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
index index.html;
}
server_name用_占位,表示匹配任意未命中的主机名。
配置占位拒绝页
对外只暴露正式站点时,默认站点直接返回444或简单403:
server {
listen 80 default_server;
server_name _;
return 444;
}
444是Nginx特有,直接断开连接,不返回内容。
隐藏版本号
http {
server_tokens off;
}
避免错误页暴露Nginx版本,减少针对性漏洞扫描。
自定义默认首页
server {
listen 80 default_server;
server_name _;
root /var/www/default;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
多端口默认
HTTPS同理,443也要配default_server:
server {
listen 443 ssl default_server;
server_name _;
# 自签或占位证书,否则握手失败
return 444;
}
注意事项
- 一台机器同端口只能有一个default_server;
- 不配默认站,未匹配域名会落到第一个server,可能串站点;
- 改完nginx -t校验再reload;
- 云主机IP直扫建议默认站返回444,不暴露首页;
- 区分default_server和servername ,前者是优先级标记;
- SSL默认站必须有证书,否则浏览器握手报错。
总结
默认站点由default_server或同端口首个server决定,用server_name _占位。安全做法是把默认站返回444拒绝、server_tokens off隐藏版本,443也要配默认拒绝站,避免IP直扫串到正式站点。改完务必-t校验再reload。
Nginx配置多站点,一个服务器跑多个网站
前言
买了一台服务器,想跑好几个网站,不用买好几台服务器。Nginx 的虚拟主机(vhost)功能就是干这个的。本文讲一下怎么用 Nginx 配置多站点。
原理
Nginx 通过 server_name 来区分不同的网站。同一个 IP 同一个端口,根据访问的域名不同,返回不同的网站内容。
用户访问 www.aaa.com → 网站A的目录
用户访问 www.bbb.com → 网站B的目录
基础配置方法
第一步:准备网站目录
mkdir -p /var/www/aaa
mkdir -p /var/www/bbb
放两个测试首页:
echo "网站A" > /var/www/aaa/index.html
echo "网站B" > /var/www/bbb/index.html
第二步:创建 Nginx 配置
在 /etc/nginx/conf.d/ 目录下,每个网站一个配置文件。
网站A配置:
vi /etc/nginx/conf.d/aaa.conf
内容:
server {
listen 80;
server_name www.aaa.com aaa.com;
root /var/www/aaa;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
网站B配置:
vi /etc/nginx/conf.d/bbb.conf
内容:
server {
listen 80;
server_name www.bbb.com bbb.com;
root /var/www/bbb;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
第三步:检查配置并重载
nginx -t
nginx -s reload
第四步:解析域名
把 www.aaa.com 和 www.bbb.com 都解析到这台服务器的 IP 上。
这样两个网站就都能访问了。
带 PHP 的多站点
如果每个网站都要跑 PHP,每个站点的配置里加上 PHP 转发:
server {
listen 80;
server_name www.aaa.com;
root /var/www/aaa;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
带 HTTPS 的多站点
每个站点单独配证书:
server {
listen 443 ssl http2;
server_name www.aaa.com;
ssl_certificate /etc/nginx/ssl/aaa.crt;
ssl_certificate_key /etc/nginx/ssl/aaa.key;
root /var/www/aaa;
index index.php index.html;
}
每个网站用自己的证书,互不影响。
目录结构建议
/etc/nginx/
├── nginx.conf
├── conf.d/
│ ├── aaa.conf # 网站A配置
│ ├── bbb.conf # 网站B配置
│ └── ccc.conf # 网站C配置
每个网站一个配置文件,方便管理。
常见坑
坑1:所有网站都显示同一个内容
访问不同域名,显示的都是同一个网站的内容。
原因: Nginx 默认 server 的问题。
解决: 把第一个 server 块设为默认:
server {
listen 80 default_server;
server_name _;
return 444;
}
其他网站用各自的 server_name。
坑2:新加的站点不生效
加了新的配置文件,但网站还是访问不了。
原因1: 配置文件后缀不对。Nginx 默认只加载 .conf 后缀的文件。
原因2: 没重载 Nginx。
解决:
nginx -t
nginx -s reload
坑3:PHP 解析不对
网站A的 PHP 请求跑到网站B去了。
原因: root 路径不对,或者 PHP 配置里的 root 写死了。
解决: 每个站点的 PHP location 里都写清楚自己的 root:
location ~ \.php$ {
root /var/www/aaa;
...
}
坑4:文件权限不对
网站B的文件 Nginx 读不了。
解决: 确保所有网站文件的属主都是 www:
chown -R www:www /var/www/
总结
| 步骤 | 操作 |
|---|---|
| 建目录 | mkdir /var/www/网站名 |
| 写配置 | 每个网站一个 .conf 文件 |
| server_name | 写域名 |
| root | 写网站目录 |
| 重载 | nginx -s reload |
| 解析域名 | 域名解析到服务器IP |
记住: 一个网站一个配置文件,别全写在 nginx.conf 里,不好管理。
遇到问题加QQ23979811 协助处理