VPSKnow

Web 服务器搭建指南

中级
45分钟

Web 服务器是网站的核心引擎。本文将帮助您从 Nginx、Apache 和 Caddy 中做出选择,并手把手教您完成安装、配置以及 HTTPS 安全证书的部署。无论是个人博客还是企业应用,您都能在这里找到适合的解决方案。

⚖️ 服务器选型对比

在开始安装前,先了解一下三位"选手"的特点。选择合适的 Web 服务器能让您事半功倍。

Nginx

高性能反向代理
优点
  • 高并发性能极佳
  • 资源占用低
  • 配置灵活
适用场景

静态网站、反向代理、负载均衡

Apache

老牌 Web 服务器
优点
  • 模块丰富
  • 支持 .htaccess 动态配置
  • 生态成熟
适用场景

兼容老旧 PHP 应用 (如 WordPress)

Caddy

现代 Web 服务器
优点
  • 配置极其简单
  • 自动申请续期 SSL
  • 原生支持 HTTP/2+
适用场景

快速部署、个人项目、无需折腾 SSL

💡

选购建议:

  • 生产环境首选 Nginx:除非您有特定的 Apache 依赖(如 .htaccess),否则强烈推荐使用 Nginx。它在高并发场景下表现优异,资源占用低,配置灵活。
  • WordPress 等 PHP 应用:如果要运行传统 PHP 应用且依赖 .htaccess 文件,Apache 是更好的选择。
  • 个人项目或快速原型:Caddy 是最佳选择,零配置自动 HTTPS,配置文件简洁易懂。
  • 微服务架构:Nginx 的反向代理和负载均衡能力非常适合微服务场景。

🟢 Nginx 安装与配置

Nginx (发音为 "engine-x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。它以高并发、低资源消耗著称,是目前最流行的 Web 服务器之一。

1. 安装 Nginx

# Ubuntu / Debian
sudo apt update
sudo apt install nginx -y

# 启动并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 查看运行状态
sudo systemctl status nginx

安装完成后,访问服务器的 IP 地址,如果看到 "Welcome to nginx!" 页面,说明安装成功。

2. 配置文件结构

  • 主配置文件: /etc/nginx/nginx.conf - 全局配置,如工作进程数、日志位置等
  • 站点配置目录: /etc/nginx/conf.d//etc/nginx/sites-available/ - 每个网站一个配置文件
  • 网站根目录: 默认通常在 /var/www/html/ - 存放网站文件的地方
  • 日志目录: /var/log/nginx/ - 访问日志和错误日志
⚠️

重要提示: Ubuntu/Debian 系统使用 sites-availablesites-enabled 目录管理站点,需要创建软链接激活配置。而 CentOS/RHEL 直接使用 conf.d 目录,所有 .conf 文件自动生效。

3. 创建一个静态站点配置

创建一个新文件 /etc/nginx/conf.d/mysite.conf (或 /etc/nginx/sites-available/mysite.conf):

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

    # 日志配置
    access_log /var/log/nginx/mysite_access.log;
    error_log /var/log/nginx/mysite_error.log;

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

    # Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml;
}

如果使用 sites-available 目录,还需要创建软链接激活配置:

sudo ln -s /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/

完成后,测试配置并重载:

sudo nginx -t && sudo systemctl reload nginx

4. 反向代理配置 (常用于 Node.js、Python 应用)

Nginx 最强大的功能之一是反向代理。假设您有一个运行在 3000 端口的 Node.js 应用,可以这样配置:

server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        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_cache_bypass $http_upgrade;
    }
}

这样配置后,访问 api.example.com 时,Nginx 会将请求转发到本地的 3000 端口,同时正确处理 WebSocket 连接。

5. 负载均衡配置 (分散流量到多台服务器)

当单台服务器无法承载所有流量时,可以使用 Nginx 的负载均衡功能:

upstream backend {
    least_conn;  # 最少连接数负载均衡策略
    server backend1.example.com:8080;
    server backend2.example.com:8080;
    server backend3.example.com:8080;
}

server {
    listen 80;
    server_name app.example.com;

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

Nginx 支持多种负载均衡策略,包括轮询(默认)、最少连接(least_conn)、IP 哈希(ip_hash)等。

6. 性能优化建议

  • 启用 Gzip 压缩

    可以将文本类文件压缩 70-90%,显著减少传输时间。在 http 块中添加 gzip on;

  • 调整工作进程数

    nginx.conf 中设置 worker_processes auto; 让 Nginx 自动匹配 CPU 核心数

  • 启用缓存

    对于静态资源,可以设置浏览器缓存头,减少重复请求

  • 使用 HTTP/2

    listen 指令中添加 http2 参数,需配合 HTTPS 使用

🔴 Apache 安装与配置

Apache HTTP Server 是世界上使用最广泛的 Web 服务器软件之一。它的模块化设计、丰富的功能和强大的社区支持使其成为许多 PHP 应用的首选。

1. 安装 Apache

# Ubuntu / Debian (软件包名为 apache2)
sudo apt update
sudo apt install apache2 -y

# CentOS / RHEL (软件包名为 httpd)
sudo yum install httpd -y

# 启动并设置开机自启
sudo systemctl start apache2  # 或 httpd
sudo systemctl enable apache2

# 查看运行状态
sudo systemctl status apache2

安装完成后,访问服务器 IP 地址,应该能看到 Apache 的默认欢迎页面。

2. 虚拟主机配置

Apache 使用虚拟主机(Virtual Host)来托管多个网站。创建配置文件 /etc/apache2/sites-available/mysite.conf (Ubuntu) 或 /etc/httpd/conf.d/mysite.conf (CentOS):

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/mysite

    <Directory /var/www/mysite>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    # 日志配置
    ErrorLog ${APACHE_LOG_DIR}/mysite_error.log
    CustomLog ${APACHE_LOG_DIR}/mysite_access.log combined
</VirtualHost>

在 Ubuntu 系统上,需要启用站点配置:

sudo a2ensite mysite.conf && sudo systemctl reload apache2

3. .htaccess 文件配置

Apache 的一大特色是支持 .htaccess 文件,允许在目录级别进行配置而无需重启服务器。这对于共享主机环境非常有用。

创建 /var/www/mysite/.htaccess 文件:

# 开启 Rewrite 引擎
RewriteEngine On

# 强制使用 HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

# 去除 www 前缀
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

# PHP 伪静态规则示例
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?route=$1 [L,QSA]
💡

性能提示: 虽然 .htaccess 很方便,但它会降低性能(因为 Apache 需要在每个请求中检查目录树)。在生产环境中,建议将规则写入虚拟主机配置文件,并将 AllowOverride 设置为 None

4. 常用模块管理

  • 启用 Rewrite 模块 (URL 重写)

    sudo a2enmod rewrite
  • 启用 SSL 模块

    sudo a2enmod ssl
  • 启用 Headers 模块 (自定义 HTTP 头)

    sudo a2enmod headers
  • 启用压缩模块

    sudo a2enmod deflate
  • 重启服务使更改生效

    sudo systemctl restart apache2

5. PHP 集成

Apache 与 PHP 的集成非常成熟。安装 PHP 和相关模块:

sudo apt install php libapache2-mod-php php-mysql -y

安装完成后,Apache 会自动加载 PHP 模块。创建一个 info.php 文件测试:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/mysite/info.php

🔵 Caddy 安装与配置

Caddy 是最简单、最现代的 Web 服务器。它的最大亮点是零配置自动 HTTPS —— 您只需指定域名,Caddy 会自动申请、配置和续期 SSL 证书。对于个人项目和快速原型开发来说,这是最省心的选择。

1. 安装 Caddy

不同系统的安装方式略有差异。以 Ubuntu 为例:

# 添加 Caddy 官方源
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

# 安装
sudo apt update
sudo apt install caddy -y

# 查看状态
sudo systemctl status caddy

其他系统请参考 Caddy 官方安装文档

2. 最简单的 Caddyfile 配置

Caddy 的配置文件通常位于 /etc/caddy/Caddyfile。配置一个 HTTPS 站点极其简单:

# 简单的 HTTPS 静态网站
example.com {
    root * /var/www/mysite
    file_server
}

没错,就这三行。Caddy 会自动为您申请 Let's Encrypt SSL 证书并开启 HTTPS!

Caddy 的魔法:

  • 自动从 Let's Encrypt 申请 SSL 证书
  • 自动续期证书(无需手动干预)
  • 自动将 HTTP 重定向到 HTTPS
  • 原生支持 HTTP/2 和 HTTP/3

3. 高级配置示例

虽然 Caddy 以简单著称,但它也支持复杂的配置需求:

# 高级配置示例
example.com {
    # 指定根目录
    root * /var/www/mysite
    
    # 开启文件服务器
    file_server
    
    # 启用 Gzip 压缩
    encode gzip
    
    # 自定义日志
    log {
        output file /var/log/caddy/example.log
        format console
    }
    
    # 反向代理到后端应用
    reverse_proxy /api/* localhost:3000
    
    # 自定义响应头
    header {
        X-Content-Type-Options "nosniff"
        X-Frame-Options "DENY"
        Referrer-Policy "no-referrer-when-downgrade"
    }
}

# 多个子域名
blog.example.com {
    root * /var/www/blog
    file_server
    php_fastcgi unix//run/php/php-fpm.sock
}

api.example.com {
    reverse_proxy localhost:8080
}

4. 重载配置

修改 Caddyfile 后,需要重载配置:

sudo systemctl reload caddy

Caddy 支持优雅重载,不会中断现有连接。

⚠️

重要提示: 使用 Caddy 的自动 HTTPS 功能时,请确保:
1. 域名已正确解析到服务器 IP
2. 服务器的 80 和 443 端口对外开放
3. 服务器能访问互联网(用于与 Let's Encrypt 通信)

🔒 配置 HTTPS (SSL 证书)

HTTPS 已成为现代网站的标配。它不仅能保护用户数据安全,还能提升 SEO 排名和用户信任度。对于 Nginx 和 Apache,我们推荐使用 Certbot 来免费申请 Let's Encrypt 证书。

1. 安装 Certbot

# Ubuntu / Debian
sudo apt update
sudo apt install certbot python3-certbot-nginx python3-certbot-apache -y

# CentOS / RHEL (需要 EPEL 源)
sudo yum install epel-release -y
sudo yum install certbot python3-certbot-nginx python3-certbot-apache -y

2. 申请证书

Certbot 提供了针对不同 Web 服务器的自动配置插件:

对于 Nginx

sudo certbot --nginx

Certbot 会自动检测 Nginx 配置,修改相关文件,并开启 HTTPS

对于 Apache

sudo certbot --apache

Certbot 会自动修改 Apache 虚拟主机配置,启用 SSL 模块

按照提示输入邮箱、同意服务条款、选择要加密的域名,Certbot 会自动完成以下操作:

  • 验证域名所有权
  • 从 Let's Encrypt 获取 SSL 证书
  • 修改 Web 服务器配置文件
  • 设置 HTTP 到 HTTPS 的自动重定向
  • 配置自动续期任务

3. 手动模式 (适用于不支持自动配置的情况)

如果您的 Web 服务器配置比较特殊,或者想手动控制配置,可以使用 certonly 模式:

sudo certbot certonly --webroot -w /var/www/mysite -d example.com -d www.example.com

证书文件会保存在 /etc/letsencrypt/live/example.com/ 目录下,然后您需要手动在 Web 服务器配置中引用这些文件。

4. 证书续期管理

Let's Encrypt 证书有效期为 90 天,但 Certbot 会自动设置定时任务进行续期。您可以测试续期功能:

# 测试自动续期
sudo certbot renew --dry-run

# 查看已安装的证书
sudo certbot certificates

# 手动续期所有证书
sudo certbot renew

# Certbot 会自动添加定时任务,查看
sudo systemctl list-timers | grep certbot
💡

续期提示: Certbot 会在证书到期前 30 天开始尝试续期。您无需担心证书过期问题,系统会自动处理。如果续期失败,Certbot 会发送邮件通知您。

5. SSL 安全配置最佳实践

获得证书只是第一步,还需要确保 SSL 配置足够安全。以下是 Nginx 的推荐安全配置:

# 安全配置示例 - 添加到 http 块或 server 块

# 隐藏 Nginx 版本号
server_tokens off;

# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN" always;

# 防止 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff" always;

# XSS 保护
add_header X-XSS-Protection "1; mode=block" always;

# 推荐的 SSL 配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;

# DDoS 防护基础配置
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_req zone=one burst=20 nodelay;

# 限制请求体大小
client_max_body_size 10M;

您可以使用 SSL Labs 测试您的 SSL 配置质量,争取获得 A+ 评级。

🔧 常见问题排查

在配置 Web 服务器的过程中,难免会遇到各种问题。以下是一些常见问题及其解决方案:

Q: 启动 Nginx 失败,提示端口被占用?

可能是 Apache 或其他服务已经占用了 80/443 端口。解决方法:

  1. 查看端口占用:sudo lsof -i :80sudo netstat -tlnp | grep :80
  2. 停止占用端口的服务:sudo systemctl stop apache2
  3. 或者修改 Nginx 配置使用其他端口(不推荐)
Q: 访问网站显示 403 Forbidden?

通常是权限问题或索引文件缺失。检查以下几点:

  1. 确保 Web 服务器用户有读取权限:sudo chown -R www-data:www-data /var/www/mysite (Nginx) 或 sudo chown -R apache:apache /var/www/mysite (Apache)
  2. 确保目录权限正确:sudo chmod -R 755 /var/www/mysite
  3. 确保目录中有索引文件 (index.html 或 index.php)
  4. 检查 SELinux 是否阻止访问:sudo setenforce 0 (临时禁用测试)
Q: Certbot 申请证书失败?

Let's Encrypt 需要验证域名所有权,常见失败原因:

  1. DNS 未正确解析: 使用 nslookup example.comdig example.com 确认域名解析正确
  2. 防火墙阻止 80/443 端口: 检查防火墙规则,确保这两个端口对外开放
  3. Web 服务器未运行: 确保 Nginx/Apache 正在运行且监听 80 端口
  4. 频率限制: Let's Encrypt 对同一域名有申请频率限制,如果超限需等待一周
  5. 网站根目录权限问题: Certbot 需要在网站根目录创建验证文件
Q: 访问网站显示 502 Bad Gateway?

这个错误通常出现在反向代理场景中,表示 Nginx 无法连接到后端应用。检查:

  1. 后端应用是否运行: 使用 curl http://localhost:3000 直接访问后端
  2. 端口号是否正确: 确认 proxy_pass 中的端口与后端应用监听端口一致
  3. 防火墙规则: 如果后端在其他服务器上,检查防火墙是否允许连接
  4. 查看错误日志: sudo tail -f /var/log/nginx/error.log
Q: 修改配置后不生效?

配置文件修改后需要重载或重启服务:

  • Nginx: 先测试配置 sudo nginx -t,然后重载 sudo systemctl reload nginx
  • Apache: 先测试配置 sudo apachectl configtest,然后重启 sudo systemctl restart apache2
  • Caddy: 重载配置 sudo systemctl reload caddy
  • 浏览器缓存: 清除浏览器缓存或使用无痕模式测试
Q: 如何查看 Web 服务器日志?

日志是排查问题的最佳工具:

  • Nginx 错误日志: sudo tail -f /var/log/nginx/error.log
  • Nginx 访问日志: sudo tail -f /var/log/nginx/access.log
  • Apache 错误日志: sudo tail -f /var/log/apache2/error.log
  • Caddy 日志: sudo journalctl -u caddy -f

🚀 下一步行动

恭喜!您已经成功搭建了 Web 服务器并配置了 HTTPS。接下来,让我们继续完善您的服务器环境:

准备好部署您的应用了吗?

选择一个高性能的 VPS,让您的 Web 服务器跑得飞快。