插件窝 干货文章 Nginx虚拟主机配置技巧,高效管理多个网站

Nginx虚拟主机配置技巧,高效管理多个网站

Nginx 配置 server domain 330    来源:    2025-04-02

Nginx虚拟主机配置技巧:高效管理多个网站

基本虚拟主机配置

Nginx通过server块实现虚拟主机功能,每个server块代表一个独立的网站配置:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com;
    index index.html;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
}

高效管理技巧

1. 使用配置文件分割

将不同网站的配置放在单独文件中,然后在主配置文件中包含:

# /etc/nginx/nginx.conf
http {
    include /etc/nginx/sites-enabled/*.conf;
}

2. 标准化目录结构

建议的目录结构:

/etc/nginx/
├── sites-available/  # 所有可用的配置
├── sites-enabled/     # 实际启用的配置(符号链接)
├── templates/         # 配置模板
└── includes/          # 公共配置片段

3. 使用通配符和正则表达式

server {
    listen 80;
    server_name ~^(www\.)?(?<domain>.+)$;
    root /var/www/$domain;
    # ...
}

4. 共享SSL配置

创建共享SSL配置片段:

# /etc/nginx/includes/ssl-common.conf
ssl_certificate /etc/ssl/certs/domain.crt;
ssl_certificate_key /etc/ssl/private/domain.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;

然后在各server块中包含:

server {
    listen 443 ssl;
    include includes/ssl-common.conf;
    # ...
}

5. 自动化配置管理

使用脚本自动创建虚拟主机:

#!/bin/bash
DOMAIN=$1
CONF_FILE="/etc/nginx/sites-available/${DOMAIN}.conf"

cat > $CONF_FILE <<EOF
server {
    listen 80;
    server_name $DOMAIN www.$DOMAIN;
    root /var/www/$DOMAIN;
    index index.html;

    access_log /var/log/nginx/${DOMAIN}.access.log;
    error_log /var/log/nginx/${DOMAIN}.error.log;
}
EOF

ln -s $CONF_FILE "/etc/nginx/sites-enabled/"
mkdir -p "/var/www/$DOMAIN"
nginx -t && systemctl reload nginx

6. 使用变量和映射

map $http_host $root_path {
    default             /var/www/default;
    example.com        /var/www/example;
    blog.example.com   /var/www/blog;
}

server {
    listen 80;
    server_name _;
    root $root_path;
    # ...
}

7. 性能优化配置

# 共享的优化配置
client_max_body_size 10m;
client_body_buffer_size 128k;
keepalive_timeout 15;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
server_tokens off;

高级技巧

1. 动态虚拟主机

server {
    listen 80 default_server;
    server_name ~^(?<subdomain>.+)\.example\.com$;

    set $root_path "/var/www/vhosts/$subdomain";

    if (!-d $root_path) {
        return 404;
    }

    root $root_path;
    # ...
}

2. 使用Ansible等工具管理

示例Ansible playbook片段:

- name: Configure Nginx virtual hosts
  template:
    src: nginx-vhost.j2
    dest: "/etc/nginx/sites-available/{{ item.domain }}.conf"
  with_items: "{{ nginx_vhosts }}"
  notify: reload nginx

3. 日志轮转配置

/etc/logrotate.d/nginx中添加:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

最佳实践

  1. 保持配置简洁:避免过度复杂的配置
  2. 使用注释:为每个配置块添加说明
  3. 定期审核:检查未使用的配置和日志文件
  4. 版本控制:将配置纳入版本控制系统
  5. 测试配置:每次修改后运行nginx -t测试配置
  6. 监控性能:使用工具如GoAccess分析访问日志

通过以上技巧,您可以高效地管理数十甚至数百个Nginx虚拟主机配置,同时保持系统的可维护性和性能。