【Nginx开荒攻略】Nginx虚拟主机配置:从域名、端口到IP的完整指南

目录

引言

[1 虚拟主机概述](#1 虚拟主机概述)

[1.1 什么是虚拟主机](#1.1 什么是虚拟主机)

[1.2 虚拟主机的工作原理](#1.2 虚拟主机的工作原理)

[1.3 虚拟主机的类型](#1.3 虚拟主机的类型)

[1.4 虚拟主机的优势](#1.4 虚拟主机的优势)

[2 基于域名的虚拟主机](#2 基于域名的虚拟主机)

[2.1 基于域名虚拟主机概述](#2.1 基于域名虚拟主机概述)

[2.2 server_name指令详解](#2.2 server_name指令详解)

[2.2.1 基本语法](#2.2.1 基本语法)

[2.2.2 server_name配置类型](#2.2.2 server_name配置类型)

[2.2.3 server_name匹配优先级](#2.2.3 server_name匹配优先级)

[2.3 基于域名虚拟主机配置示例](#2.3 基于域名虚拟主机配置示例)

[2.3.1 基础配置示例](#2.3.1 基础配置示例)

[2.3.2 高级配置示例](#2.3.2 高级配置示例)

[3 基于端口的虚拟主机](#3 基于端口的虚拟主机)

[3.1 基于端口虚拟主机概述](#3.1 基于端口虚拟主机概述)

[3.2 基于端口虚拟主机配置示例](#3.2 基于端口虚拟主机配置示例)

[3.2.1 基础配置示例](#3.2.1 基础配置示例)

[3.2.2 高级配置示例](#3.2.2 高级配置示例)

[4 基于IP的虚拟主机](#4 基于IP的虚拟主机)

[4.1 基于IP虚拟主机概述](#4.1 基于IP虚拟主机概述)

[4.2 基于IP虚拟主机配置示例](#4.2 基于IP虚拟主机配置示例)

[4.2.1 基础配置示例](#4.2.1 基础配置示例)

[4.2.2 高级配置示例](#4.2.2 高级配置示例)

[5 总结](#5 总结)


引言

在当今的互联网环境中,虚拟主机技术已经成为Web服务部署的标准配置。Nginx作为最受欢迎的Web服务器之一,其强大的虚拟主机功能让管理员可以在单台服务器上托管多个网站,实现资源的最大化利用。虚拟主机不仅能够降低硬件成本,还能简化管理流程,提高运维效率。

1 虚拟主机概述

1.1 什么是虚拟主机

虚拟主机(Virtual Host)是一种特殊的技术,它允许在单台物理服务器上运行多个独立的网站服务。每个虚拟主机在逻辑上都是独立的,拥有自己的域名、配置文件和资源,但共享同一台服务器的硬件资源。

  • 物理服务器:提供硬件资源(CPU、内存、磁盘等)
  • 操作系统:管理硬件资源和软件进程
  • Nginx:作为Web服务器,接收和处理HTTP请求
  • 虚拟主机:每个虚拟主机对应一个独立的网站服务
  • 域名与网站:每个虚拟主机绑定特定的域名和网站内容

1.2 虚拟主机的工作原理

  • 当客户端发起HTTP请求时,Nginx会根据请求中的特定信息来确定应该由哪个虚拟主机来处理该请求:
  • 请求接收:客户端向Nginx服务器发送HTTP请求
  • 信息解析:Nginx解析请求中的关键信息(Host、IP、端口)
  • 虚拟主机匹配:根据配置的匹配规则确定对应的虚拟主机
  • 请求处理:选定的虚拟主机处理请求并返回响应
  • 内容返回:将处理结果返回给客户端

1.3 虚拟主机的类型

  • Nginx支持三种主要的虚拟主机配置方式:

|------|-------------|------------|-------------|-----------|
| 类型 | 匹配依据 | 适用场景 | 优势 | 劣势 |
| 基于域名 | HTTP Host头部 | 外部网站、多域名服务 | 资源利用率高、配置灵活 | 需要域名解析 |
| 基于IP | 目标IP地址 | 多IP环境、独立服务 | 完全隔离、无需域名 | 需要多个IP地址 |
| 基于端口 | 目标端口号 | 内部服务、管理后台 | 配置简单、无需额外IP | 用户需要记住端口号 |

1.4 虚拟主机的优势

  • 资源利用率高:多个网站共享同一台服务器的计算资源
  • 成本效益:降低硬件采购和运维成本
  • 管理便捷:集中管理多个网站,简化运维流程
  • 灵活扩展:可以随时添加新的虚拟主机
  • 隔离性好:各网站在逻辑上相互独立,避免相互影响

2 基于域名的虚拟主机

2.1 基于域名虚拟主机概述

基于域名的虚拟主机是最常见和最灵活的虚拟主机配置方式。它通过HTTP请求中的Host头部字段来区分不同的网站,允许多个域名解析到同一个IP地址,从而实现"一机多站"的功能。

基于域名虚拟主机工作原理:

  • 域名解析:多个域名DNS解析到同一个IP地址
  • 请求发送:客户端通过不同域名访问服务器
  • Host头部:HTTP请求中包含Host头部信息
  • 域名匹配:Nginx根据Host头部匹配对应的虚拟主机
  • 内容返回:匹配的虚拟主机返回对应的网站内容

2.2 server_name指令详解

server_name指令是基于域名虚拟主机的核心指令,用于指定虚拟主机处理的域名。

2.2.1 基本语法

复制代码
server_name name ...;

参数说明:

  • name:域名列表,可以包含多个域名,用空格分隔
  • 支持的域名格式:精确域名、通配符域名、正则表达式域名

2.2.2 server_name配置类型

复制代码
# 精确匹配
server_name www.example.com;
server_name example.com;

# 通配符匹配
# 通配符在开头
server_name *.example.com;
# 通配符在结尾
server_name www.example.*;

# 正则表达式匹配
server_name ~^www\d+\.example\.com$;
server_name ~^.*\.example\.com$;

# 混合配置
server_name example.com www.example.com *.example.com;

2.2.3 server_name匹配优先级

  • 完全匹配:精确匹配server_name中的域名
  • 通配符前缀匹配:*.example.com格式的匹配
  • 通配符后缀匹配:www.example.*格式的匹配
  • 正则表达式匹配:以~开头的正则表达式匹配
  • 默认虚拟主机:如果没有匹配的server_name,使用default_server标记的虚拟主机

2.3 基于域名虚拟主机配置示例

2.3.1 基础配置示例

复制代码
# 主配置文件 /etc/nginx/nginx.conf
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 日志格式定义
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    
    # 第一个虚拟主机 - 主网站
    server {
        listen 80;
        server_name www.example.com example.com;
        
        root /var/www/example.com/html;
        index index.html index.htm;
        
        access_log /var/log/nginx/example.com.access.log main;
        error_log /var/log/nginx/example.com.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
        
        # 静态文件缓存
        location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    }
    
    # 第二个虚拟主机 - 博客网站
    server {
        listen 80;
        server_name blog.example.com;
        
        root /var/www/blog.example.com/html;
        index index.html index.htm;
        
        access_log /var/log/nginx/blog.example.com.access.log main;
        error_log /var/log/nginx/blog.example.com.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
        
        # WordPress伪静态规则
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
        
        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;
        }
    }
    
    # 第三个虚拟主机 - 商城网站
    server {
        listen 80;
        server_name shop.example.com;
        
        root /var/www/shop.example.com/html;
        index index.php;
        
        access_log /var/log/nginx/shop.example.com.access.log main;
        error_log /var/log/nginx/shop.example.com.error.log;
        
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
        
        # PHP处理
        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.3.2 高级配置示例

复制代码
# HTTPS虚拟主机配置
server {
    listen 443 ssl http2;
    server_name www.example.com;
    
    root /var/www/example.com/html;
    index index.html;
    
    # SSL配置
    ssl_certificate /etc/nginx/ssl/example.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example.com.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    
    # 安全头配置
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# HTTP重定向到HTTPS
server {
    listen 80;
    server_name www.example.com example.com;
    
    return 301 https://$host$request_uri;
}

# 通配符域名配置
server {
    listen 80;
    server_name *.example.com;
    
    # 通配符域名处理
    set $domain $host;
    
    if ($host ~* ^(\w+)\.example\.com$) {
        set $subdomain $1;
    }
    
    root /var/www/example.com/$subdomain;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# 正则表达式域名配置
server {
    listen 80;
    server_name ~^(\w+)\.example\.com$;
    
    # 使用捕获的子域名
    set $subdomain $1;
    
    root /var/www/example.com/$subdomain;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

3 基于端口的虚拟主机

3.1 基于端口虚拟主机概述

基于端口的虚拟主机是通过监听不同的端口号来区分不同的网站服务。这种方式不需要额外的IP地址或域名解析,只需要在同一个IP地址上配置不同的端口即可实现多个网站服务。

  • 简单易用:不需要额外的IP地址或域名配置
  • 快速部署:适合临时测试或内部服务
  • 端口冲突:需要确保端口不被其他服务占用
  • 用户体验:用户需要记住端口号

3.2 基于端口虚拟主机配置示例

3.2.1 基础配置示例

复制代码
# 基于端口虚拟主机配置
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 第一个虚拟主机 - 80端口,主网站
    server {
        listen 80;
        server_name localhost;
        
        root /var/www/main-site/html;
        index index.html index.htm;
        
        access_log /var/log/nginx/main-site.access.log;
        error_log /var/log/nginx/main-site.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
    # 第二个虚拟主机 - 8080端口,管理后台
    server {
        listen 8080;
        server_name localhost;
        
        root /var/www/admin-panel/html;
        index index.php;
        
        access_log /var/log/nginx/admin-panel.access.log;
        error_log /var/log/nginx/admin-panel.error.log;
        
        location / {
            try_files $uri $uri/ /index.php?$args;
        }
        
        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;
        }
        
        # IP访问限制
        allow 192.168.1.0/24;
        deny all;
    }
    
    # 第三个虚拟主机 - 8081端口,开发环境
    server {
        listen 8081;
        server_name localhost;
        
        root /var/www/dev-site/html;
        index index.html;
        
        access_log /var/log/nginx/dev-site.access.log;
        error_log /var/log/nginx/dev-site.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
        
        # 开发环境调试
        location ~* \.(log|err)$ {
            allow all;
        }
    }
}

3.2.2 高级配置示例

复制代码
# 带SSL的端口虚拟主机
server {
    listen 8443 ssl;
    server_name localhost;
    
    root /var/www/secure-site/html;
    index index.html;
    
    # SSL配置
    ssl_certificate /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    # 安全配置
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# 反向代理端口虚拟主机
server {
    listen 9090;
    server_name localhost;
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    # WebSocket支持
    location /ws {
        proxy_pass http://localhost:3001;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# 负载均衡端口虚拟主机
upstream backend_cluster {
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

server {
    listen 7070;
    server_name localhost;
    
    location / {
        proxy_pass http://backend_cluster;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 超时设置
        proxy_connect_timeout 5s;
        proxy_read_timeout 30s;
        proxy_send_timeout 30s;
    }
}

4 基于IP的虚拟主机

4.1 基于IP虚拟主机概述

基于IP的虚拟主机是通过监听不同的IP地址来区分不同的网站服务。这种方式每个虚拟主机都需要独立的IP地址,适用于需要完全隔离的场景。

  • 完全隔离:每个IP地址对应独立的虚拟主机
  • 无需域名:不依赖于HTTP Host头部
  • 资源独占:每个虚拟主机独占IP资源
  • 成本较高:需要多个IP地址

4.2 基于IP虚拟主机配置示例

4.2.1 基础配置示例

复制代码
# 基于IP虚拟主机配置
http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    
    # 第一个虚拟主机 - IP1
    server {
        listen 192.168.1.100:80;
        server_name _;
        
        root /var/www/site1/html;
        index index.html index.htm;
        
        access_log /var/log/nginx/site1.access.log;
        error_log /var/log/nginx/site1.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
    # 第二个虚拟主机 - IP2
    server {
        listen 192.168.1.101:80;
        server_name _;
        
        root /var/www/site2/html;
        index index.html index.htm;
        
        access_log /var/log/nginx/site2.access.log;
        error_log /var/log/nginx/site2.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
    }
    
    # 第三个虚拟主机 - IP3
    server {
        listen 192.168.1.102:80;
        server_name _;
        
        root /var/www/site3/html;
        index index.html index.htm;
        
        access_log /var/log/nginx/site3.access.log;
        error_log /var/log/nginx/site3.error.log;
        
        location / {
            try_files $uri $uri/ =404;
        }
    }
}

4.2.2 高级配置示例

复制代码
# HTTPS IP虚拟主机配置
server {
    listen 192.168.1.100:443 ssl;
    server_name _;
    
    root /var/www/secure-site1/html;
    index index.html;
    
    # SSL配置
    ssl_certificate /etc/nginx/ssl/site1.crt;
    ssl_certificate_key /etc/nginx/ssl/site1.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    # 安全配置
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# 多端口IP虚拟主机配置
server {
    listen 192.168.1.101:80;
    server_name _;
    
    root /var/www/site2/html;
    index index.html;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 192.168.1.101:443 ssl;
    server_name _;
    
    root /var/www/site2-secure/html;
    index index.html;
    
    ssl_certificate /etc/nginx/ssl/site2.crt;
    ssl_certificate_key /etc/nginx/ssl/site2.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    location / {
        try_files $uri $uri/ =404;
    }
}

# 反向代理IP虚拟主机配置
server {
    listen 192.168.1.102:80;
    server_name _;
    
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    location /api/ {
        proxy_pass http://localhost:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

5 总结

Nginx虚拟主机技术是现代Web服务部署的核心技术之一。通过合理配置基于域名、端口和IP的虚拟主机,我们可以在单台服务器上托管多个网站,实现资源的最大化利用。记住,虚拟主机配置是一个持续优化的过程。在实际应用中,需要根据业务需求和技术发展不断调整和改进配置。

相关推荐
taxunjishu3 小时前
DeviceNet 转 Modbus TCP 协议转换在 S7-1200 PLC化工反应釜中的应用
运维·人工智能·物联网·自动化·区块链
迎風吹頭髮4 小时前
UNIX下C语言编程与实践53-UNIX 共享内存控制:shmctl 函数与共享内存管理
服务器·c语言·unix
迎風吹頭髮4 小时前
Linux内核架构浅谈8-Linux内核与UNIX的传承:设计思想与特性差异
linux·运维·架构
黑马金牌编程5 小时前
Linux 服务器常见的性能调优
linux·运维·服务器·性能优化
jieyu11195 小时前
网络、主机安全扫描工具
linux·安全·系统安全
tianyuanwo5 小时前
Linux进程管理中的T状态问题分析与解决体系
linux·运维·进程管理·t状态
liuyao_xianhui6 小时前
Linux_基本指令1
linux·运维·服务器
守望时空336 小时前
Linux挂载NTFS分区指南
linux
shan~~7 小时前
linux达梦数据库操作
linux·数据库·chrome