Skip to content

部署

Heroku

建议您只有在进行游戏原型设计阶段使用 Heroku. 通过点击下面的按钮就能部署 colyseus-examples 项目:

Deploy

注意: 开发环境要设置 NPM_CONFIG_PRODUCTION=false, 以便引用开发依赖包, 如 ts-node, ts-node-dev 等.

建议您在商用环境中使用 pm2nginx.

PM2

安装 pm2.

npm install -g pm2

然后使用它启动服务器:

pm2 start your-server.js

Nginx配置

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:2567;
        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;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

为 Nginx 配置 SSL

建议您通过 LetsEncrypt 获取证书.

server {
    listen 80;
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /path/to/your/cert.crt;
    ssl_certificate_key /path/to/your/cert.key;

    location / {
        proxy_pass http://localhost:2567;
        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;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

Apache

下面介绍了如何使用 Apache 作为 Node.js Colyseus 程序的代理. (感谢 tomkleine!)

需要安装的 Apache 模块:

sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_html
sudo a2enmod proxy_wstunnel

虚拟托管配置:

<VirtualHost *:80>
    ServerName servername.xyz

    # 把从 80 端口收到的请求全部转发至 HTTPS 端口 (强制使用 ssl)
    RewriteEngine On
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]

</VirtualHost>

<VirtualHost *:443>
    ServerName servername.xyz

    # 开启 SSL
    SSLEngine On
    SSLCertificateFile          /PATH/TO/CERT/FILE
    SSLCertificateKeyFile       /PATH/TO/PRIVATE/KEY/FILE

    #
    # 让代理把 websocket 协议的请求转发给 websocket 服务器
    # 反之亦然, 这样就不用修改 colyseus 库和程序了)
    #
    # (注意: 代理会自动把 websocket 转换为加密版本 (wss)

    RewriteEngine On
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$           [NC,OR]
    RewriteCond %{HTTP:CONNECTION} ^Upgrade$          [NC]
    RewriteRule .* ws://127.0.0.1:APP-PORT-HERE%{REQUEST_URI}  [P,QSA,L]

    # 让代理把 https 协议的请求转发给 http 服务器
    # (同样自动把 https 转换为 http, 反之亦然)

    ProxyPass "/" "http://localhost:APP-PORT-HERE/"
    ProxyPassReverse "/" "http://localhost:APP-PORT-HERE/"

</VirtualHost>

greenlock-express

想快速配置好 SSL, 而又不想要反向代理, Greenlock 是一个很好的选择.

使用 greenlock-express 时, 不应 再为它配置任何反向代理, 如 NginxApache.

npm install --save greenlock-express

详情请参考 greenlock-express 的 README.

下面是官方推荐的配置, 开发环境和商用环境都适用:

import http from "http";
import express from "express";
import { Server } from "colyseus";

function setup(app: express.Application, server: http.Server) {
  const gameServer = new Server({ server });

  // TODO: 按需配置 `app` 和 `gameServer`.
  // gameServer.define("room", YourRoom);

  return app;
}

if (process.env.NODE_ENV === "production") {
  require('greenlock-express')
    .init(function () {
      return {
        greenlock: require('./greenlock'),
        cluster: false
      };
    })
      .ready(function (glx) {
          const app = express();

      // 服务于 80 和 443 端口
      // 神奇地自动获取 SSL 证书!
      glx.serveApp(setup(app, glx.httpsServer(undefined, app)));
    });

} else {
  // 开发环境端口
  const PORT = process.env.PORT || 2567;

  const app = express();
  const server = http.createServer(app);

  setup(app, server);
  server.listen(PORT, () => console.log(`Listening on http://localhost:${PORT}`));
}

Docker

准备工作:

  • 确保项目里有 package.jsonpackage-lock.json.

  • 配置 npm start 脚本以便启动服务器.

步骤:

第1步 安裝 Docker

第2步 在 colyseus 项目的根目录新建 Dockerfile

FROM node:14

ENV PORT 8080

WORKDIR /usr/src/app

# 使用通配符确保 package.json 和 package-lock.json 文件都能被复制
COPY package*.json ./

RUN npm ci
# 只在商用环境下启动
# npm ci --only=production

COPY . .

EXPOSE 8080

CMD [ "npm", "start" ]

第3步 在上述目录下新建 .dockerignore 文件

node_modules
npm-debug.log

这样可以防止将本地模块和调试日志错被复制到 Docker 镜像上覆盖掉镜像内的模块.

第4步 在 Dockerfile 目录下执行以下命令執行以下指令来编译镜像. -t 参数用以设置镜像的类目, 以便日后查找方便:

docker build -t <your username>/colyseus-server .

第5步 用以下命令列出 Docker 镜像:

docker images

输出:

# 类似
REPOSITORY                      TAG     ID              CREATED
node                            14      1934b0b038d1    About a minute ago
<your username>/colseus-server  latest  d64d3505b0d2    About a minute ago

第6步 用以下命令运行 Docker 镜像:

docker run -p 8080:8080 -d <your username>/colyseus-server

用 -d 参数使用脱离模式, 在后台运行镜像. -p 参数把公开端口映射到容器内的私有端口.

第7步 完成. 现在就可以通过 localhost:8080 访问服务器了.

更多参考:

Back to top