从零开始:华为云服务器Nginx环境搭建及常见问题排查全流程

218 阅读7分钟

从零开始:华为云服务器Nginx环境搭建及常见问题排查全流程

Nginx Logo

在云服务器部署中,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实例默认有安全组规则限制,需要在华为云控制台配置:

  1. 登录华为云管理控制台
  2. 导航到"弹性云服务器 ECS"
  3. 找到您的服务器并点击名称进入详情页
  4. 点击"安全组"选项卡
  5. 点击"配置规则"或"添加规则"按钮
  6. 添加以下入方向规则:
    • 协议:TCP,端口范围:80(HTTP)
    • 协议:TCP,端口范围:443(HTTPS)
    • 协议:ICMP,端口范围:全部(允许Ping测试)
  7. 保存规则

五、测试网站访问

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的高级特性,如负载均衡、反向代理等功能。

希望本文对您有所帮助!如果在操作过程中遇到任何问题,欢迎在评论区留言讨论。

参考资料

  1. Nginx 官方文档
  2. 华为云官方文档 - 安全组配置
  3. Let's Encrypt 官方文档
  4. Mozilla SSL 配置生成器

作者:技术探索者

本文原创首发于掘金平台,转载请注明出处。