第96课:实战:搭建 Nginx/Apache Web 服务器
难度: intermediate 标签: nginx, apache, web
1. 学习目标
完成本课后,你将能够:
- 在Linux系统中独立完成Nginx和Apache Web服务器的安装、基本配置和启停管理。
- 理解Nginx与Apache的核心架构差异,并根据需求选择合适的服务器。
- 配置基于域名的虚拟主机,实现一个服务器托管多个网站。
- 对服务器进行基础的安全与性能优化,如设置访问权限、开启gzip压缩。
2. 核心概念
Web服务器是互联网基础设施的核心,负责接收用户的HTTP请求,并将对应的网页文件(HTML、图片、CSS等)返回给用户的浏览器。
Apache 是历史最悠久、市场占有率极高的Web服务器。它像一位经验丰富的“管家”,采用进程/线程驱动的模型。每当一个请求到来,它就可能会派生或分配一个独立的“工作人员”(进程或线程)去处理,稳定可靠,模块极其丰富。
Nginx 则是一位更年轻、高效的“运动员”。它采用事件驱动、异步非阻塞的架构,能用少量的“工作人员”高效处理海量并发连接,尤其擅长处理静态文件和反向代理,在性能上通常优于Apache。
简单比喻:Apache像一家雇佣了大量员工的餐厅,服务周到但成本高;Nginx则像一家高效的自动化餐厅,用更少的员工就能服务大量客人,速度更快。
对于初学者和中小型网站,两者都是优秀的选择。Nginx在性能和资源消耗上往往更有优势。
3. 代码示例
示例1:安装并启动Nginx
# 1. 更新软件包索引(以Ubuntu/Debian为例)
sudo apt update
# 2. 安装Nginx
sudo apt install nginx -y
# 3. 检查Nginx服务状态
sudo systemctl status nginx
# 你应该会看到 “active (running)” 的绿色字样。
# 4. 测试默认页面
curl http://localhost
# 或者直接在浏览器访问服务器的IP地址。
# 5. 管理Nginx服务
sudo systemctl stop nginx # 停止
sudo systemctl start nginx # 启动
sudo systemctl restart nginx # 重启
sudo systemctl reload nginx # 重新加载配置(不中断服务,推荐)
示例2:配置Nginx虚拟主机
目标:让 www.site1.com 和 www.site2.com 指向服务器上的不同目录。
# 1. 创建网站根目录
sudo mkdir -p /var/www/site1.com /var/www/site2.com
# 2. 为两个站点分别创建一个简单的HTML文件
echo "<h1>Welcome to Site1!</h1>" | sudo tee /var/www/site1.com/index.html
echo "<h1>Welcome to Site2!</h1>" | sudo tee /var/www/site2.com/index.html
# 3. 创建虚拟主机配置文件
# 对于 Site1
sudo tee /etc/nginx/sites-available/site1.com > /dev/null <<EOF
server {
listen 80;
server_name www.site1.com site1.com;
root /var/www/site1.com;
index index.html;
location / {
try_files \$uri \$uri/ =404;
}
}
EOF
# 对于 Site2
sudo tee /etc/nginx/sites-available/site2.com > /dev/null <<EOF
server {
listen 80;
server_name www.site2.com site2.com;
root /var/www/site2.com;
index index.html;
location / {
try_files \$uri \$uri/ =404;
}
}
EOF
# 4. 启用站点(创建符号链接)
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
# 5. 测试配置语法并重载Nginx
sudo nginx -t
# 输出 “syntax is ok” 和 “test is successful” 后:
sudo systemctl reload nginx
示例3:安装并配置Apache
# 1. 安装Apache
sudo apt update
sudo apt install apache2 -y
# 2. 启动并设置开机自启
sudo systemctl start apache2
sudo systemctl enable apache2
# 3. 配置Apache虚拟主机
# 禁用默认站点,启用我们的新站点
sudo a2dissite 000-default.conf
# 为 site1 创建配置文件
sudo tee /etc/apache2/sites-available/site1.com.conf > /dev/null <<EOF
<VirtualHost *:80>
ServerName www.site1.com
ServerAlias site1.com
DocumentRoot /var/www/site1.com
<Directory /var/www/site1.com>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
EOF
# 为 site2 创建配置文件(类似,只需修改ServerName和DocumentRoot)
# ...
# 4. 启用新站点并重载Apache
sudo a2ensite site1.com.conf
sudo a2ensite site2.com.conf
sudo systemctl reload apache2
4. 实践练习
练习1(基础)
在你的Ubuntu服务器上安装Nginx,并成功通过浏览器访问到它的默认欢迎页面。截图证明。
练习2(进阶)
使用Nginx配置一个虚拟主机,域名为 myblog.local,网站根目录为 /var/www/myblog。在该目录下创建一个简单的 index.html,内容为“我的第一个博客”。使用 curl 命令验证配置是否成功:
# 假设你已将 myblog.local 指向 127.0.0.1 (或服务器IP) 在本地hosts文件中
curl -H "Host: myblog.local" http://127.0.0.1
练习3(挑战)
在Nginx的 server 块配置中添加以下优化指令,并解释其作用:
# 启用gzip压缩
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
# 禁止访问隐藏文件 (如 .htaccess, .env)
location ~ /\. {
deny all;
}
5. 常见错误
- 配置文件语法错误:修改配置后,务必先运行
sudo nginx -t(Nginx) 或sudo apachectl configtest(Apache) 检查语法,否则直接重启会导致服务启动失败。 - 目录权限问题:Web服务器的运行用户(如
www-data)需要对你网站根目录及其文件有读取和执行权限。使用sudo chown -R www-data:www-data /var/www/your-site和sudo chmod -R 755 /var/www/your-site修复。 - 域名未生效:在配置虚拟主机后,如果在本地测试,请确保在客户端电脑的
/etc/hosts文件中添加了域名到IP的映射,例如:192.168.1.100 myblog.local。 - 端口冲突:确保没有其他服务(如另一个Web服务器、Docker容器)占用了80或443端口。可以使用
sudo ss -tlnp | grep :80命令检查。 - 防火墙拦截:确保服务器的防火墙(如
ufw)允许了HTTP(80)和HTTPS(443)流量。sudo ufw allow 'Nginx Full'或sudo ufw allow 'Apache'。
6. 小结
本节课我们进行了Web服务器搭建的实战演练:
- 核心技能:掌握了Nginx和Apache的安装、基本配置、服务管理以及虚拟主机的配置方法,这是托管多个网站的关键。
- 架构认知:理解了Nginx(事件驱动)与Apache(进程驱动)的模型差异,明白了Nginx在处理高并发静态请求时的性能优势。
- 运维要点:学会了配置后的语法检查、权限设置、防火墙管理等基本但至关重要的运维步骤。
- 下一步:配置好Web服务器后,通常下一步是为网站配置SSL/TLS证书实现HTTPS加密,以及使用Nginx/Apache作为反向代理来部署后端应用(如PHP、Python)。
动手实践是掌握这些知识的最佳途径,请务必完成练习题。下一课,我们将学习如何通过自动化脚本来简化这些重复性的运维工作。