• 操作系统: Ubuntu 22.04 LTS (Long Term Support,长期支持版,稳定可靠)
  • Web 服务器: Nginx ( pronounced "Engine X",高性能、低内存消耗)
  • 后端运行时: Node.js (用于构建动态网站和 API)
  • 数据库: MySQL (关系型数据库,存储网站数据)
  • 前端: Nginx 直接提供静态文件服务

第一部分:准备工作

在开始之前,你需要准备以下两样东西:

  1. 一台云服务器: 你可以从阿里云、腾讯云、AWS、DigitalOcean 等服务商购买一台,推荐选择 Ubuntu 22.04 系统,配置建议至少 1核CPU/2GB内存。
  2. 一个域名: 虽然不是必须,但拥有一个域名可以让你的网站更容易被访问和记忆,你需要在域名服务商处购买,并将服务器的 IP 地址指向你的域名(这个过程叫做 DNS 解析)。

第二部分:服务器环境配置

步骤 1: 连接到你的服务器

使用 SSH(Secure Shell)工具连接到你的服务器,在 macOS 或 Linux 的终端中,或者在 Windows 的 PowerShell/命令提示符中,运行以下命令:

# 将 your_server_ip 替换为你的服务器公网 IP 地址
ssh root@your_server_ip

首次连接时,系统会提示你确认服务器的指纹,输入 yes 即可,之后会要求输入你购买服务器时设置的 root 密码。

步骤 2: 更新系统并创建新用户

为了安全性和最佳实践,我们不应该直接使用 root 用户进行日常操作。

# 1. 更新系统软件包列表
sudo apt update
# 2. 升级已安装的软件包
sudo apt upgrade -y
# 3. 创建一个新用户,这里我们创建一个名为 'webadmin' 的用户
sudo adduser webadmin
# 4. 为新用户赋予管理员权限 (sudo)
sudo usermod -aG sudo webadmin

退出当前 SSH 连接,然后用新创建的用户重新登录:

# 退出
exit
# 用新用户登录
ssh webadmin@your_server_ip

步骤 3: 配置防火墙

为了服务器的安全,我们需要只开放必要的端口(如 HTTP 80, HTTPS 443, SSH 22)。

# 安装 UFW (Uncomplicated Firewall)
sudo apt install ufw -y
# 允许 SSH 连接 (非常重要,防止你把自己锁在外面)
sudo ufw allow OpenSSH
# 允许 HTTP 流量 (用于网站访问)
sudo ufw allow 'Nginx Full'
# 启用防火墙
sudo ufw enable
# 系统会提示你确认,输入 y 并回车

步骤 4: 安装 Nginx

Nginx 是一个轻量级、高性能的 Web 服务器和反向代理服务器。

# 安装 Nginx
sudo apt install nginx -y
# 安装完成后,启动 Nginx 服务并设置为开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

验证 Nginx 是否运行成功: 在浏览器中输入你的服务器 IP 地址 http://your_server_ip,如果看到 "Welcome to nginx!" 页面,说明 Nginx 已经成功运行。


第三部分:安装和配置后端与数据库

我们将搭建一个简单的 Node.js 应用,它从 MySQL 数据库中读取数据并通过 Nginx 提供服务。

步骤 5: 安装 Node.js 和 npm

# 使用 NodeSource 仓库安装最新的 LTS 版本 (以 Node.js 20.x 为例)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get install -y nodejs
# 验证安装
node -v
npm -v

步骤 6: 安装 MySQL

# 安装 MySQL 服务器
sudo apt install mysql-server -y
# 运行安全脚本,它会设置 root 密码、移除匿名用户等
sudo mysql_secure_installation

mysql_secure_installation 的交互式过程中,建议:

  • 为 root 用户设置一个强密码。
  • 对于其他选项(如移除匿名用户、禁止 root 远程登录等),直接按 Y (是) 回车即可,这是安全最佳实践。

步骤 7: 创建数据库和用户

# 登录 MySQL
sudo mysql -u root -p
# 输入你刚才设置的 root 密码
# 在 MySQL 命令行中执行以下 SQL 语句
CREATE DATABASE my_website_db;
CREATE USER 'webuser'@'localhost' IDENTIFIED BY 'your_strong_password';
GRANT ALL PRIVILEGES ON my_website_db.* TO 'webuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

请务必将 your_strong_password 替换为一个你自己的、非常安全的密码。


第四部分:部署你的网站

步骤 8: 创建项目目录并上传代码

我们将网站代码存放在 /var/www 目录下,这是 Web 服务器的标准根目录。

# 创建项目目录
sudo mkdir -p /var/www/my-website
# 将目录所有权赋予当前用户
sudo chown -R $USER:$USER /var/www/my-website
# 进入项目目录
cd /var/www/my-website

你需要将你的网站代码上传到这个目录,你可以使用:

  • Git: 如果你的代码托管在 GitHub/GitLab 上,直接 git clone
  • SFTP/SCP: 使用 FileZilla 等工具,或通过 scp 命令从本地电脑上传。

为了演示,我们创建一个最简单的 Node.js 应用。

创建 app.js 文件:

nano app.js

将以下代码粘贴进去,然后按 Ctrl+XYEnter 保存。

const http = require('http');
const mysql = require('mysql2/promise');
// 创建数据库连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'webuser',
  password: 'your_strong_password', // <-- 这里填你设置的密码
  database: 'my_website_db',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});
const server = http.createServer(async (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  try {
    const [rows] = await pool.query('SELECT message FROM greetings LIMIT 1');
    const message = rows[0].message;
    res.end(`
      <html>
        <head><title>我的网站</title></head>
        <body>
          <h1>欢迎来到我的网站!</h1>
          <p>从数据库获取到的消息是: <strong>${message}</strong></p>
        </body>
      </html>
    `);
  } catch (error) {
    res.end('<h1>数据库连接错误</h1><p>' + error.message + '</p>');
  }
});
const PORT = 3000;
server.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
});

创建 package.json 文件:

nano package.json
{
  "name": "my-website",
  "version": "1.0.0",
  "description": "A simple website on Nginx and Node.js",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "mysql2": "^3.6.3"
  }
}

安装依赖:

npm install

步骤 9: 配置 Nginx 反向代理

我们需要配置 Nginx,让它将来自外部的请求(如 http://your_domain.com)转发到我们 Node.js 应用运行的 3000 端口。

# 创建一个新的 Nginx 配置文件
sudo nano /etc/nginx/sites-available/my-website

粘贴进去。请务必将 your_domain.com 替换为你的真实域名

server {
    listen 80;
    server_name your_domain.com www.your_domain.com;
    root /var/www/my-website;
    index index.html index.htm;
    location / {
        # 将请求转发到 Node.js 应用
        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_cache_bypass $http_upgrade;
    }
}

保存文件后,启用这个配置站点:

# 创建一个指向 sites-enabled 目录的符号链接
sudo ln -s /etc/nginx/sites-available/my-website /etc/nginx/sites-enabled/
# 为了安全,删除默认的配置文件
sudo rm /etc/nginx/sites-enabled/default
# 测试 Nginx 配置是否正确
sudo nginx -t
# 如果测试成功,会显示 "syntax is ok" 和 "test is successful"
# 然后重新加载 Nginx 使配置生效
sudo systemctl reload nginx

步骤 10: 使用 PM2 管理你的 Node.js 应用

为了让你的 Node.js 应用在后台稳定运行,并在服务器重启后自动启动,我们使用 PM2 这个进程管理器。

# 全局安装 PM2
sudo npm install pm2 -g
# 在你的项目目录下,启动应用
pm2 start app.js --name "my-website"
# 查看应用状态
pm2 status
# 设置 PM2 开机自启
pm2 startup
# PM2 会提示你运行一个命令,复制并执行它即可

步骤 11: 配置域名解析

登录你的域名服务商后台,找到 DNS 解析设置,添加两条 A 记录:

  • 记录类型: A
  • 主机记录: (代表主域名)
  • 记录值: 你的服务器 IP 地址
  • 记录类型: A
  • 主机记录: www (代表带 www 的域名)
  • 记录值: 你的服务器 IP 地址

等待几分钟到几小时(DNS 生效需要时间),然后在浏览器中访问你的域名 http://your_domain.com

如果一切顺利,你应该能看到你 Node.js 应用渲染的页面,并且显示了从 MySQL 数据库中读取的消息!


恭喜!你已经成功地在 Linux 服务器上搭建了一个完整的网站服务环境,这个流程涵盖了:

  1. 服务器基础: 安全登录、更新系统、配置防火墙。
  2. Web 服务器: 安装并配置 Nginx,使其能够提供静态文件和反向代理。
  3. 后端与数据库: 安装 Node.js 和 MySQL,并创建了数据库和用户。
  4. 应用部署: 将代码上传服务器,使用 PM2 保证应用持续运行。
  5. 域名集成: 通过 DNS 解析,让你的域名指向服务器。

这是一个非常坚实的基础,你可以基于这个环境,继续部署更复杂的网站、配置 HTTPS (使用 Let's Encrypt)、添加更多的安全措施等。