从零开始:华为云服务器Nginx环境搭建及常见问题排查全流程
在云服务器部署中,Nginx作为高性能的Web服务器和反向代理受到广泛使用。本文将详细介绍如何在华为云服务器上配置Nginx环境,并系统化地排查解决常见问题。从安装配置到网络访问,一步步带你掌握Nginx的基本运维技能。
一、环境准备
本文基于以下环境进行演示:
- 华为云ECS(弹性云服务器)
- Ubuntu 20.04 LTS
- Nginx 1.18+
- 公网IP地址
二、安装Nginx服务器
2.1 更新系统包
首先,确保系统包列表是最新的:
sudo apt update
sudo apt upgrade -y
2.2 安装Nginx
执行以下命令安装Nginx:
sudo apt install nginx -y
2.3 验证安装成功
安装完成后,查看Nginx状态:
sudo systemctl status nginx
如果看到类似以下输出,表示Nginx安装成功且已经启动:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-09-18 10:24:36 UTC; 2min 3s ago
Docs: man:nginx(8)
Main PID: 12345 (nginx)
Tasks: 2 (limit: 4621)
Memory: 3.8M
CGroup: /system.slice/nginx.service
├─12345 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─12346 nginx: worker process
三、配置网站
Nginx的配置文件默认位于/etc/nginx/目录下。主配置文件是/etc/nginx/nginx.conf,但我们通常会在/etc/nginx/sites-available/目录下创建站点配置,然后通过符号链接启用它们。
3.1 创建网站目录
首先创建存放网站文件的目录:
sudo mkdir -p /var/www/your_domain
3.2 创建示例网页
创建一个简单的HTML文件作为网站首页:
sudo nano /var/www/your_domain/index.html
在编辑器中输入以下HTML内容:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to my website!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to my website!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
按Ctrl+O保存文件,按Ctrl+X退出编辑器。
3.3 设置文件权限
确保Nginx可以访问网站文件:
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain
3.4 创建服务器块配置
创建新的Nginx配置文件:
sudo nano /etc/nginx/sites-available/your_domain.conf
添加以下配置内容:
server {
listen 80;
server_name your_domain.com www.your_domain.com; # 将这里替换为您的域名或IP地址
root /var/www/your_domain;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 日志配置
access_log /var/log/nginx/your_domain_access.log;
error_log /var/log/nginx/your_domain_error.log;
}
保存并退出编辑器。
3.5 启用站点配置
创建一个符号链接到sites-enabled目录来启用配置:
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/
3.6 禁用默认站点
为避免默认站点与我们的新站点冲突,可以禁用默认站点配置:
sudo rm /etc/nginx/sites-enabled/default
如果希望保留默认配置但暂时禁用它,可以使用:
sudo mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.disabled
3.7 测试配置语法
在重启Nginx之前,先检查配置语法是否正确:
sudo nginx -t
如果配置正确,你会看到类似以下输出:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
3.8 重启Nginx服务
应用新的配置:
sudo systemctl restart nginx
四、配置防火墙和安全组
4.1 配置UFW防火墙(Ubuntu系统)
如果服务器上启用了UFW,需要允许Nginx流量:
# 查看UFW状态
sudo ufw status
# 如果UFW活跃,允许Nginx流量
sudo ufw allow 'Nginx Full' # 允许HTTP和HTTPS流量
# 或者分别允许
sudo ufw allow 80/tcp # 允许HTTP
sudo ufw allow 443/tcp # 允许HTTPS
4.2 配置华为云安全组
华为云ECS实例默认有安全组规则限制,需要在华为云控制台配置:
- 登录华为云管理控制台
- 导航到"弹性云服务器 ECS"
- 找到您的服务器并点击名称进入详情页
- 点击"安全组"选项卡
- 点击"配置规则"或"添加规则"按钮
- 添加以下入方向规则:
- 协议:TCP,端口范围:80(HTTP)
- 协议:TCP,端口范围:443(HTTPS)
- 协议:ICMP,端口范围:全部(允许Ping测试)
- 保存规则
五、测试网站访问
5.1 本地测试
在服务器上使用curl命令测试网站是否正常运行:
curl http://localhost
成功的话,你应该看到HTML内容输出。
5.2 远程测试
在浏览器中输入服务器IP地址或域名:
http://your_server_ip
或者使用域名(如果已配置DNS):
http://your_domain.com
5.3 使用ping测试网络连通性
检查服务器是否可访问:
ping your_server_ip
如果ping不通,很可能是安全组配置问题。
六、常见问题排查及解决方案
6.1 无法访问网站
排查步骤:
a. 检查Nginx服务状态
sudo systemctl status nginx
如果服务未运行,启动它:
sudo systemctl start nginx
b. 检查防火墙设置
sudo ufw status
如果需要开放端口:
sudo ufw allow 80/tcp
c. 检查华为云安全组
确保在华为云控制台已配置安全组规则,允许80/443端口的入站流量。
d. 检查Nginx配置
sudo nginx -t
修复任何语法错误。
e. 检查日志文件
sudo tail -n 50 /var/log/nginx/error.log
sudo tail -n 50 /var/log/nginx/access.log
6.2 显示默认页面而非自定义页面
排查步骤:
a. 检查站点配置是否启用
ls -la /etc/nginx/sites-enabled/
如果没有您的配置,创建符号链接:
sudo ln -s /etc/nginx/sites-available/your_domain.conf /etc/nginx/sites-enabled/
b. 确认默认站点是否禁用
ls -la /etc/nginx/sites-enabled/default
如果存在,删除或禁用它:
sudo rm /etc/nginx/sites-enabled/default
c. 验证server_name设置
编辑配置文件:
sudo nano /etc/nginx/sites-available/your_domain.conf
确保server_name指令正确配置为您的IP地址或域名。
d. 重启Nginx
sudo systemctl restart nginx
6.3 Bash中感叹号(!)引起的错误
在使用echo命令创建HTML文件时,如果内容包含感叹号,可能会出现错误提示类似"event not found"。这是因为在Bash中,感叹号(!)是历史命令扩展的特殊字符。
解决方法:
a. 使用单引号
echo '<html><body><h1>Welcome to your_domain.com!</h1></body></html>' | sudo tee /var/www/your_domain/index.html
b. 使用反斜杠转义
echo "<html><body><h1>Welcome to your_domain.com\!</h1></body></html>" | sudo tee /var/www/your_domain/index.html
c. 直接使用编辑器
sudo nano /var/www/your_domain/index.html
6.4 权限问题
如果遇到"Permission denied"错误:
# 检查目录权限
ls -la /var/www/
# 修复权限
sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain
6.5 虚拟主机配置冲突
如果多个配置文件具有相同的server_name指令:
# 查找所有启用的配置
grep -r "server_name" /etc/nginx/sites-enabled/
# 确保每个站点的server_name配置不同,或使用IP地址
七、高级配置:优化Nginx性能
7.1 启用Gzip压缩
编辑Nginx主配置文件:
sudo nano /etc/nginx/nginx.conf
确保启用并配置Gzip:
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
7.2 配置浏览器缓存
编辑站点配置:
sudo nano /etc/nginx/sites-available/your_domain.conf
添加缓存控制指令:
server {
# 已有配置...
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
}
7.3 限制连接数
编辑Nginx主配置文件:
sudo nano /etc/nginx/nginx.conf
在http区块中添加:
http {
# 已有配置...
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
server {
# 已有配置...
location / {
limit_conn conn_limit_per_ip 10; # 限制每个IP最多10个并发连接
limit_req zone=req_limit_per_ip burst=20 nodelay; # 限制请求速率
# 其他配置...
}
}
}
八、配置HTTPS(SSL/TLS)
8.1 使用Let's Encrypt获取免费SSL证书
安装Certbot:
sudo apt install certbot python3-certbot-nginx -y
获取证书并自动配置Nginx:
sudo certbot --nginx -d your_domain.com -d www.your_domain.com
按照提示完成配置。
8.2 SSL参数优化
创建SSL参数文件:
sudo nano /etc/nginx/snippets/ssl-params.conf
添加以下内容:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
在站点配置中包含此文件:
server {
listen 443 ssl http2;
server_name your_domain.com www.your_domain.com;
ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
include /etc/nginx/snippets/ssl-params.conf;
# 其他配置...
}
server {
listen 80;
server_name your_domain.com www.your_domain.com;
return 301 https://$host$request_uri;
}
九、总结
通过本文的详细指导,您应该已经成功在华为云服务器上搭建了Nginx环境,并了解了如何解决常见问题。从安装配置、网站部署到网络问题排查,我们覆盖了Nginx运维中的关键环节。随着实践的深入,您可以进一步探索Nginx的高级特性,如负载均衡、反向代理等功能。
希望本文对您有所帮助!如果在操作过程中遇到任何问题,欢迎在评论区留言讨论。
参考资料
作者:技术探索者
本文原创首发于掘金平台,转载请注明出处。