Skip to content

基于端口的虚拟主机

基于端口的虚拟主机通过不同的端口访问不同的网站,适用于测试环境或需要通过端口区分服务的场景。

基本配置

配置示例

nginx
# 端口80
server {
    listen 80;
    server_name localhost;

    root /var/www/site1;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

# 端口8080
server {
    listen 8080;
    server_name localhost;

    root /var/www/site2;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

# 端口8081
server {
    listen 8081;
    server_name localhost;

    root /var/www/site3;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }
}

访问方式

完整配置示例

多端口配置

nginx
# 站点1 - 端口80
server {
    listen 80;
    server_name localhost;

    root /var/www/site1;
    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;
    }

    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 - 端口8080
server {
    listen 8080;
    server_name localhost;

    root /var/www/site2;
    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;
    }
}

# 站点3 - 端口8081
server {
    listen 8081;
    server_name localhost;

    root /var/www/site3;
    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;
    }
}

监听多个端口

单个server监听多个端口

nginx
server {
    listen 80;
    listen 8080;
    server_name localhost;

    root /var/www/site1;
    index index.html index.htm;
}

使用default_server

nginx
server {
    listen 80 default_server;
    server_name localhost;

    root /var/www/default;
    index index.html index.htm;
}

端口与域名结合

域名+端口配置

nginx
# example.com:80
server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;
    index index.html index.htm;
}

# example.com:8080
server {
    listen 8080;
    server_name example.com;

    root /var/www/example.com-admin;
    index index.html index.htm;
}

# test.com:80
server {
    listen 80;
    server_name test.com;

    root /var/www/test.com;
    index index.html index.htm;
}

# test.com:8080
server {
    listen 8080;
    server_name test.com;

    root /var/www/test.com-admin;
    index index.html index.htm;
}

SSL端口配置

HTTPS端口443

nginx
# HTTP
server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;
    index index.html index.htm;
}

# HTTPS
server {
    listen 443 ssl;
    server_name 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;
}

自定义HTTPS端口

nginx
server {
    listen 8443 ssl;
    server_name 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;
}

防火墙配置

开放端口

Ubuntu (UFW)

bash
# 开放80端口
sudo ufw allow 80/tcp

# 开放8080端口
sudo ufw allow 8080/tcp

# 开放8081端口
sudo ufw allow 8081/tcp

# 开放443端口
sudo ufw allow 443/tcp

CentOS (firewalld)

bash
# 开放80端口
sudo firewall-cmd --permanent --add-port=80/tcp

# 开放8080端口
sudo firewall-cmd --permanent --add-port=8080/tcp

# 开放8081端口
sudo firewall-cmd --permanent --add-port=8081/tcp

# 开放443端口
sudo firewall-cmd --permanent --add-port=443/tcp

# 重载防火墙
sudo firewall-cmd --reload

检查端口监听

bash
# 查看端口监听
netstat -tlnp | grep nginx

# 或使用ss命令
ss -tlnp | grep nginx

常见应用场景

开发环境

nginx
# 开发环境
server {
    listen 8000;
    server_name localhost;

    root /var/www/dev;
    index index.html index.htm;
}

# 测试环境
server {
    listen 8001;
    server_name localhost;

    root /var/www/test;
    index index.html index.htm;
}

# 生产环境
server {
    listen 80;
    server_name example.com;

    root /var/www/prod;
    index index.html index.htm;
}

管理后台

nginx
# 前台
server {
    listen 80;
    server_name example.com;

    root /var/www/frontend;
    index index.html index.htm;
}

# 后台
server {
    listen 8080;
    server_name example.com;

    root /var/www/backend;
    index index.html index.htm;

    # IP限制
    allow 192.168.1.0/24;
    deny all;
}

API服务

nginx
# Web站点
server {
    listen 80;
    server_name example.com;

    root /var/www/web;
    index index.html index.htm;
}

# API服务
server {
    listen 8080;
    server_name api.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

端口跳转

HTTP跳转HTTPS

nginx
server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name:443$request_uri;
}

server {
    listen 443 ssl;
    server_name 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;
}

端口跳转

nginx
server {
    listen 80;
    server_name example.com;
    return 301 http://$server_name:8080$request_uri;
}

server {
    listen 8080;
    server_name example.com;

    root /var/www/example.com;
    index index.html index.htm;
}

配置文件组织

独立配置文件

/etc/nginx/
├── nginx.conf
└── conf.d/
    ├── site1.conf
    ├── site2.conf
    └── site3.conf

site1.conf

nginx
server {
    listen 80;
    server_name localhost;

    root /var/www/site1;
    index index.html index.htm;
}

site2.conf

nginx
server {
    listen 8080;
    server_name localhost;

    root /var/www/site2;
    index index.html index.htm;
}

site3.conf

nginx
server {
    listen 8081;
    server_name localhost;

    root /var/www/site3;
    index index.html index.htm;
}

测试配置

测试配置文件

bash
nginx -t

重载配置

bash
nginx -s reload

测试端口访问

bash
# 测试80端口
curl http://localhost:80

# 测试8080端口
curl http://localhost:8080

# 测试8081端口
curl http://localhost:8081

常见问题

端口无法访问

检查项:

  1. Nginx配置是否正确
  2. 防火墙是否开放端口
  3. 端口是否被其他程序占用
  4. SELinux是否阻止访问

端口被占用

查看占用端口的进程:

bash
netstat -tlnp | grep :8080

停止占用端口的进程:

bash
kill -9 <PID>

或修改Nginx监听端口:

nginx
listen 8081;

总结

基于端口的虚拟主机配置要点:

  • listen指令:指定监听端口
  • 防火墙配置:开放相应端口
  • 端口检查:确保端口未被占用
  • 访问方式:通过 http://域名:端口 访问
  • 应用场景:适合开发环境、管理后台等

基于端口的虚拟主机配置简单,适合测试环境和特殊场景使用。