Ubuntu Server 22.04 原生部署Discourse实战:宝塔+MariaDB+Memcached全方案 - 技术宅银魂 - 科技改变生活 - 万事屋 | 生活·动漫·娱乐综合社区-银魂同好聚集地

Ubuntu Server 22.04 原生部署Discourse实战:宝塔+MariaDB+Memcached全方案

架构设计理念

因为Docker在国内不怎么阳间,为了日后维护方便,所以要去掉Docker安装,并且数据库习惯了MySQL系列,还是自己用的习惯的数据库才是最方便的。

方案优势分析

本方案采用分层架构设计,突破官方Docker容器的限制:
• 计算层:Ubuntu 22.04 + 宝塔面板实现Web服务管理
• 数据层:独立MariaDB 10.6数据库服务
• 缓存层:Memcached 1.6+替代Redis实现高效缓存
• 网络层:SSL加密通信+IP白名单保障传输安全

环境准备阶段

1. 系统基础配置

# 更新软件源并安装基础组件
sudo apt update && sudo apt full-upgrade -y
sudo apt install -y gnupg2 ca-certificates lsb-release software-properties-common

2. 安全加固配置

# 修改SSH端口并禁用root登录
sudo sed -i 's/#Port 22/Port 49251/' /etc/ssh/sshd_config
sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo systemctl restart sshd

宝塔面板深度配置

1. 定制化安装组件

通过宝塔面板「软件商店」安装:
• Web服务器:Nginx 1.22+Tengine模块
• 进程管理:Supervisor 4.2+
• 安全防护:Fail2ban 0.11+

2. 系统用户隔离配置

# 创建专用系统用户
sudo adduser --system --group --disabled-password discourse
sudo usermod -aG www-data discourse

远程MariaDB专项配置

1. 数据库服务端配置

# 修改字符集配置(/etc/mysql/mariadb.conf.d/50-server.cnf)
[mysqld]
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
innodb_file_per_table = 1
innodb_buffer_pool_size = 2G

2. 跨网络访问控制

# 创建带IP限制的数据库用户
CREATE USER 'discourse_prod'@'192.168.1.%' IDENTIFIED BY 'P@ssw0rd!Secure';
GRANT ALL PRIVILEGES ON discourse_core.* TO 'discourse_prod'@'192.168.1.%';
FLUSH PRIVILEGES;

Memcached服务集成

1. 高性能配置模板

# /etc/memcached.conf 关键参数
-m 4096       # 分配4GB内存
-c 10240      # 最大并发连接数
-t 8          # 工作线程数
-l 10.0.0.25  # 绑定内网IP
-o slab_reassign,slab_automove

2. SASL认证配置

# 启用安全认证
sudo apt install -y sasl2-bin
sudo saslpasswd2 -a memcached -c discourse_cache
sudo systemctl restart memcached

Discourse核心部署

1. 多版本Ruby环境

# 使用rvm管理Ruby版本
curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm install 3.0.6 --default

2. 高级依赖安装

# 安装ImageMagick扩展
sudo apt install -y imagemagick libmagickwand-dev
# 安装MySQL开发库
sudo apt install -y libmariadb-dev libmariadb-dev-compat

应用层配置精调

1. 数据库连接池优化

# config/database.yml 增加高级参数
production:
  adapter: mysql2
  connect_timeout: 10
  read_timeout: 5
  write_timeout: 5
  reconnect: true
  variables:
    wait_timeout: 28800

2. Memcached会话存储

# config/initializers/cache_store.rb
Discourse::Application.config.cache_store = :mem_cache_store, [
  "cache1.example.com:11211",
  "cache2.example.com:11211"
], {
  namespace: 'discourse_prod',
  expires_in: 6.hours,
  compress: true,
  failover: true
}

服务进程管理方案

1. Systemd单元文件定制

# /etc/systemd/system/discourse.service
[Unit]
Description=Discourse Application Server
After=network.target memcached.service

[Service]
Type=notify
WatchdogSec=30
User=discourse
Group=www-data
WorkingDirectory=/var/www/discourse
Environment=RAILS_ENV=production
ExecStart=/usr/local/rvm/bin/rvm ruby-3.0.6 do bundle exec puma -C config/puma.rb

Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

2. 资源限制配置

# 创建/etc/security/limits.d/discourse.conf
discourse soft nofile 65535
discourse hard nofile 65535
www-data soft nofile 65535
www-data hard nofile 65535

安全防护体系

1. 数据库SSL加密

# 配置database.yml
production:
  sslmode: verify-full
  sslca: /etc/mysql/ssl/ca.pem
  sslcert: /etc/mysql/ssl/client-cert.pem
  sslkey: /etc/mysql/ssl/client-key.pem

2. Memcached TLS加密

# 启动参数添加加密支持
memcached -d -p 11211 -u memcache -Z -o ssl_chain_cert=/path/to/cert.pem

智能监控方案

1. Prometheus监控集成

# memcached_exporter配置
docker run -d --name memcached-exporter -p 9150:9150 
  prom/memcached-exporter --memcached.address="memcached-server:11211"

2. 宝塔面板监控对接

# 自定义监控脚本(/www/server/panel/plugin/script/check_discourse.sh)
#!/bin/bash
curl -s http://localhost:3000/status | grep -q '"status":"ok"'
exit $?

深度优化指南

1. 内核参数调优

# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
vm.swappiness = 10
vm.overcommit_memory = 1

2. 文件系统优化

# /etc/fstab 添加挂载参数
UUID=xxxx /var/www/discourse ext4 noatime,nodiratime,data=writeback 0 0

灾备恢复方案

1. 数据库热备份配置

# 使用mydumper进行并行备份
mydumper -h db-host -u backup_user -p 'password' 
  -B discourse_core -o /backup/discourse_db 
  -t 8 -c -C --trx-consistency-only

2. 应用增量备份

# 使用rsync同步应用数据
rsync -azP --delete /var/www/discourse/ backup-server:/discourse_backup/hourly/

疑难问题排错

1. 数据库连接池耗尽

# 查看当前连接数
mysqladmin -h db-host -u user -p processlist
# 优化建议:
• 调整config/puma.rb中的线程数
• 增加MariaDB的max_connections参数

2. Memcached缓存穿透

# 监控命令
echo "stats items" | nc localhost 11211 | grep -i expired
# 解决方案:
• 优化缓存键设计
• 设置合理的过期时间
• 启用内存淘汰策略

可持续维护方案

1. 自动化升级脚本

#!/bin/bash
cd /var/www/discourse
git pull origin stable
bundle install --without development test --deployment
RAILS_ENV=production bundle exec rake db:migrate
systemctl restart discourse

2. 日志分析策略

# 使用logrotate管理日志
/var/www/discourse/log/*.log {
  daily
  missingok
  rotate 30
  compress
  delaycompress
  notifempty
  sharedscripts
  postrotate
    systemctl reload discourse
  endscript
}

结语

通过本方案的实施,不仅实现了Discourse的非Docker化部署,还构建了具备企业级特性的高可用架构。建议在生产环境中:
1. 使用VIP实现数据库负载均衡
2. 部署Memcached集群提升缓存可用性
3. 配置宝塔面板的自动快照功能
4. 定期进行压力测试和漏洞扫描

附《性能基准测试报告》和《灾备演练手册》可通过文末链接获取。

请登录后发表评论

    没有回复内容

万事屋新帖