Nginx 虚拟机核心知识

虚拟主机概念

定义:将一台物理服务器划分成多个“虚拟”服务器,每个有独立域名和目录,可独立发布网站。

实验案例:同时发布两个网站

  • 站点1目录:/usr/local/nginx/html/web1

  • 站点2目录:/usr/local/nginx/html/web2

三种虚拟主机类型对比表

对比维度

基于IP

基于域名

基于端口

核心原理

每个站点绑定独立的公网IP地址

同一IP和端口下,通过HTTP请求头中的Host字段区分站点

同一IP下,通过监听不同的端口号来区分站点

关键配置

listen 192.168.8.51:80;

listen 80; server_name web1.zuolaoshi.com;

listen 8080;

IP成本

高:每个站点需独立公网IP(约600元/年/个)

极低:所有站点共用1个IP

极低:所有站点共用1个IP

域名成本

低(每个站点可配独立域名或直接IP访问)

中:需为每个站点准备不同域名(支持二级/三级域名)

低(同IP方案)

用户访问

http://192.168.8.51(直观,默认端口)

http://web1.zuolaoshi.com(最友好,默认端口)

http://IP:8080(需加端口号,不便捷)

维护便捷性

高(IP独立,监控定位清晰)

高(通过域名管理,配置简单)

中(需注意防火墙放行额外端口)

生产推荐度

⭐⭐(极少使用,成本高,仅限特殊合规场景)

⭐⭐⭐⭐⭐(绝对主流,公网发布首选)

⭐⭐⭐(常用内部测试、管理后台或非标准服务)

典型场景

早期互联网架构、必须通过IP访问的合规要求

企业官网、SaaS平台、多站点公网发布

开发测试环境、API服务(如8080)、内部管理后台

网页状态码

 网页显示状态码
 ​
 200 ok              正常访问
 ​
 301                 永久重定向
 ​
 302                 临时重定向
 ​
 400                 本地错误
 ​
 403                 没有权限
 ​
 404                 路径错误
 ​
 500                 服务端错误
 ​
 502                 网关错误(后端崩溃、反向代理失效、数据掉线)

配置模板速记

通用结构:

 server {
     listen       IP或端口;          # 监听地址
     server_name  域名;              # 域名(基于域名时必填)
     location / {
         root   html/网站目录;       # 网站文件路径
         index  index.html;          # 默认首页文件
     }
 }

静态网站配置

 server {
     listen 80;
     server_name example.com;
 ​
     location / {
         root /var/www/example;
         index index.html;
     }
 }
 ​
 ​
 # 创建测试网站
 mkdir -p /var/www/example
 echo "<h1>Hello Nginx</h1>" | tee /var/www/example/index.html
 ​
 ## 知识点
 tee 是命令行工具,它的核心作用是 “双向输出”——既把内容保存到文件,同时又显示在终端屏幕上。

目录列表

 location /downloads/ {
     root /var/www;
     autoindex on;                   # 开启目录列表
     autoindex_exact_size off;       # 显示友好大小
     autoindex_localtime on;         # 显示本地时间
 }

访问控制

 location /admin/ {
     root /var/www;
     # IP 白名单
     allow 192.168.8.0/24;
     deny all;    # 除了上边网段以外的其余都无法访问
    
 }

默认站点与流量转发

 server {
     listen 80 default_server;      # 默认服务器(未匹配时用)
     server_name _;                 # 匹配所有未定义的域名
     return 444;                    # 直接断开连接
 }
 ​
 # 或重定向到主站
 server {
     listen 80 default_server;
     server_name _;
     return 301 http://www.example.com$request_uri;
 }

IP临时添加命令(测试用):

 ip addr add 192.168.8.53/24 dev ens33

场景案例

 # 基于IP的虚拟主机
 应用场景:IP充足的环境,每个网站需要一个IP地址
 ​
 ## 基于IP的虚拟主机特点
 - 不同IP对应不同网站
 - 访问方便,用户直接使用默认端口即可访问
 - 服务器需要有多个IP地址(一个公网IP大概一年的费用是600左右)
 - 维护方便,基于独立IP的站点,便于监控、维护。
 ​
 :演示案例
 # 第一个虚拟主机 (web1)
 server {
     listen       192.168.8.51:80;      # 监听本机 192.168.8.51 这个特定 IP 的 80 端口
     location / {                       # 匹配所有以 / 开头的请求(即所有请求)
         root   html/web1;              # 设置网站根目录为 Nginx 安装目录下的 html/web1
         index  index.html index.htm index.php; # 定义默认首页的查找顺序:先找 index.html,再找 index.htm,最后找 index.php
     }
 }
 ​
 # 第二个虚拟主机 (web2)
 server {
     listen       192.168.8.52:80;      # 监听本机 192.168.8.52 这个特定 IP 的 80 端口
     location / {                       # 匹配所有请求
         root   html/web2;              # 设置网站根目录为 Nginx 安装目录下的 html/web2
         index  index.html index.htm;   # 定义默认首页的查找顺序:只找 index.html 或 index.htm(不支持 php)
     }
 }
 ​
 ​
 # 基于端口的虚拟主机
 应用场景:IP不足的环境
 优点: 多个网站发布使用该配置方法只需要一个IP,节省IP地址
 缺点: 端口你是无法告诉公网用户,无法适用于公网客户,适合内部用户
 ​
 ## 基于端口的虚拟主机特点
 - 不同端口对应不同网站
 - 访问需要加端口
 - 节省IP地址
 - 适合私网运行
 ​
 :演示案例
 # 第一个虚拟主机 (web1)
 server {
     listen       80;                       # 监听服务器的 80 端口(HTTP 默认端口)
     #server_name  www.zuolaoshi.cn;        # 域名配置被注释掉了,意味着该 server 块将作为 80 端口的默认站点
     location / {                           # 匹配所有以 / 开头的请求
         root   html/web1;                  # 设置网站根目录为 Nginx 安装目录下的 html/web1
         index  index.html index.htm index.php; # 定义默认首页的查找顺序:先找 index.html,再找 index.htm,最后找 index.php
     }
 }
 ​
 # 第二个虚拟主机 (web2)
 server {
     listen       8080;                     # 监听服务器的 8080 端口
     #server_name  www.zuolaoshi.cn;        # 域名配置同样被注释掉
     location / {                           # 匹配所有请求
         root   html/web2;                  # 设置网站根目录为 Nginx 安装目录下的 html/web2
         index  index.html index.htm;       # 定义默认首页的查找顺序:只找 index.html 或 index.htm
     }
 }
 ​
 ​
 # 基于域名的虚拟主机
 应用场景:一个网站需要有一个域名,目前公网发布网站的首选
 ​
 ## 基于域名的虚拟主机特点
 - 不同域名对应不同网站
 - 需要多个域名 可以是二级或三级域名
 - 每个站点使用默认端口,方便用户访问
 - 只需要一个IP地址,节约成本
 - 适合公网环境
 ​
 :演示案例
 # 第一个虚拟主机 (web1)
 server {
     listen       80;                     # 监听服务器的 80 端口
     server_name  web1.zuolaoshi.com;     # 绑定的域名为 web1.zuolaoshi.com
 ​
     location / {                         # 匹配所有请求
         root   html/web1;                # 网站根目录指向 html/web1
         index  index.html index.htm index.php; # 默认首页查找顺序
     }
 }
 ​
 # 第二个虚拟主机 (web2)
 server {
     listen       80;                     # 同样监听服务器的 80 端口
     server_name  web2.zuolaoshi.com;     # 绑定的域名为 web2.zuolaoshi.com
 ​
     location / {                         # 匹配所有请求
         root   html/web2;                # 网站根目录指向 html/web2
         index  index.html index.htm;     # 默认首页查找顺序
     }
 }

注意:每次修改完配置文件记得刷新一下

systemctl reload nginx

记忆口诀与重点提示

  1. 选型口诀:“公网首选域名型,内网省钱用端口,IP充足不差钱。”

  2. 关键区别:三种方式的核心区别在于 listen 指令 中指定的资源(IP、端口)和 server_name 的组合。

  3. 考试常见坑:

    • 基于域名的虚拟主机,多个站点可以共用IP和端口(都是80)。

    • 基于端口的虚拟主机,访问URL必须携带端口号。

    • 所有配置修改后,需重载Nginx服务:nginx -s reload。