在同一台服务器上安装多个AnQiCMS实例(非Docker),如何避免端口冲突?

作为一名资深的安企CMS网站运营人员,我深知在不断发展的数字环境中,灵活且高效地管理多个网站至关重要。安企CMS凭借其Go语言的高并发特性和多站点管理能力,为我们提供了坚实的基础。然而,当我们希望在同一台服务器上部署多个独立的AnQiCMS实例(而非利用单个实例的多站点功能)时,一个核心的技术挑战便是如何有效地避免端口冲突。

这篇文章将详细阐述在非Docker环境下,如何在同一台服务器上安装和运行多个AnQiCMS实例,并确保它们之间不会因端口占用而互相干扰。

理解端口冲突的本质与AnQiCMS的运行机制

安企CMS是一个基于Go语言开发的独立应用程序。当AnQiCMS实例启动时,它会监听一个特定的网络端口,等待来自客户端(如浏览器)的HTTP请求。默认情况下,AnQiCMS通常使用8001端口。在同一台服务器上,任何两个应用程序都不能同时监听同一个端口,否则就会发生端口冲突,导致其中一个或两个程序无法正常启动。

因此,要在同一台服务器上运行多个AnQiCMS实例,最根本的解决方案是为每个实例分配一个独一无二的监听端口。这意味着每个运行中的AnQiCMS进程都将在不同的端口上提供服务。

为每个AnQiCMS实例分配独立端口

每个AnQiCMS实例的监听端口都在其根目录下的config.json文件中进行配置。这是避免端口冲突的关键一步。

首先,您需要将AnQiCMS的程序文件复制多份,为每个您计划部署的实例创建一个独立的应用程序目录。例如,如果您要部署两个实例,您可以创建 anqicms_site1anqicms_site2 两个目录,并将AnQiCMS的完整程序文件分别拷贝到这两个目录中。

接下来,进入每个实例的目录,找到并编辑其 config.json 文件。在该文件中,您会找到一个名为 port 的字段。您需要将每个实例的 port 值修改为不同的、未被占用的端口号。例如:

  • 对于 anqicms_site1config.json 中的 port 可以设置为 8001
  • 对于 anqicms_site2config.json 中的 port 可以设置为 8002
  • 依此类推,每个新的实例都应分配一个递增的端口号(如8003、8004等),确保它们在服务器上是唯一的。

此外,每个AnQiCMS实例还需要一个独立的数据库来存储其数据。在初始化安装过程中,您需要为每个实例配置不同的数据库名称和连接信息,以确保数据互不干扰。如果您选择复用数据库账号,也务必为每个实例指定一个不同的数据库名称。

通过反向代理统一访问入口

虽然每个AnQiCMS实例都运行在不同的内部端口上,但通常我们希望用户通过标准的HTTP(8000)或HTTPS(443)端口以及各自的域名来访问这些网站,而不是直接输入 yourdomain.com:8001 这样的地址。这时,反向代理服务器(如Nginx或Apache)就发挥了关键作用。

反向代理服务器充当了客户端和后端AnQiCMS实例之间的中介。它监听标准的80/443端口,并根据请求的域名(Host头)将请求转发到后端对应端口的AnQiCMS实例。

使用Nginx配置反向代理

Nginx是一种高性能的Web服务器和反向代理服务器,非常适合处理多实例部署。

为每个AnQiCMS实例配置一个独立的Nginx server 块。例如,对于运行在8001端口的 anqicms_site1.com 和运行在8002端口的 anqicms_site2.com

Nginx配置示例 (/etc/nginx/conf.d/anqicms_site1.conf 或类似的路径):

server {
    listen 80;
    server_name anqicms_site1.com www.anqicms_site1.com; # 替换为您的域名

    # 根目录指向实例的 public 文件夹
    root /www/wwwroot/anqicms_site1/public; # 替换为您的实际路径

    location @AnqiCMS {
        proxy_pass http://127.0.0.1:8001; # 指向第一个实例的内部端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    error_page 404 =200 @AnqiCMS; # 确保404错误也能通过AnQiCMS处理

    location / {
       try_files $uri $uri/index.html @AnqiCMS;
    }

    access_log /var/log/nginx/anqicms_site1_access.log;
    error_log /var/log/nginx/anqicms_site1_error.log;
}

Nginx配置示例 (/etc/nginx/conf.d/anqicms_site2.conf):

”`nginx server {

listen 80;
server_name anqicms_site2.com www.anqicms_site2.com; # 替换为您的第二个域名

root /www/wwwroot/anqicms_site2/public; # 替换为您的实际路径

location @AnqiCMS {
    proxy_pass http://127.0.0.1:8002; # 指向第二个实例的内部端口
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

error_page 404 =200 @AnqiCMS;

location / {
   try_files $uri $uri/index.html @AnqiCMS;
}

access_log /var/log/nginx