You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Apache下Passenger运行Rails应用无法连接PostgreSQL,报错信息无效

排查CentOS7下Passenger启动双Rails应用的错误

我来帮你解决这个在CentOS7上用Passenger运行两个不同数据库Rails应用的启动问题,结合你的环境信息和给出的错误日志片段,咱们一步步排查:

先明确你的环境信息

  • 操作系统:CentOS 7
  • Web服务:Apache 2.4 + Passenger 5.2.3
  • Rails版本:5.1.3,Ruby版本:2.3.1
  • 应用数据库:一个用PostgreSQL 9.6.5,另一个用MySQL

第一步:补全完整错误日志

你给出的Passenger日志是截断的,没办法直接定位具体问题。先获取完整的错误信息:

  • 查看应用自身的日志:进入每个应用的根目录,查看log/production.log(如果是生产环境),里面会有Rails抛出的具体错误
  • 查看Apache的错误日志:执行tail -n 50 /var/log/httpd/error_log,Passenger的详细错误也会输出在这里
  • 或者用Passenger的命令查看应用日志:passenger-status找到应用的进程ID,然后用passenger-log-file <进程ID>查看该应用的完整日志

第二步:检查数据库服务状态

两个应用依赖不同的数据库,先确认数据库服务是否正常运行:

  • 检查PostgreSQL状态:
    systemctl status postgresql-9.6
    # 测试本地连接
    telnet localhost 5432
    
  • 检查MySQL状态:
    systemctl status mysqld
    # 测试本地连接
    telnet localhost 3306
    

如果服务未运行,先启动服务:systemctl start postgresql-9.6 mysqld,并设置开机自启:systemctl enable postgresql-9.6 mysqld

第三步:验证Rails数据库配置

每个应用的数据库连接配置是核心,务必确认正确:

  1. 进入应用根目录,打开config/database.yml,检查**对应环境(比如production)**的配置:
    • PostgreSQL应用的配置示例:
      production:
        adapter: postgresql
        database: app1_prod
        username: app1_user
        password: your_password
        host: localhost
        port: 5432
        pool: 5
      
    • MySQL应用的配置示例:
      production:
        adapter: mysql2
        database: app2_prod
        username: app2_user
        password: your_password
        host: localhost
        port: 3306
        pool: 5
        encoding: utf8mb4
      
  2. 在应用目录下测试数据库连接:
    # 切换到应用目录
    cd /var/www/app1
    # 测试生产环境数据库连接
    RAILS_ENV=production rails db:version
    

如果这个命令报错,会直接给出具体的连接问题(比如密码错误、数据库不存在、权限不足等)

第四步:确认Passenger与应用的隔离配置

确保Passenger为两个应用分配独立的运行环境:

  1. 检查Apache的虚拟主机配置(通常在/etc/httpd/conf.d//etc/httpd/sites-available/目录下),每个应用的<VirtualHost>块要正确配置:
    # 第一个应用(PostgreSQL)的虚拟主机
    <VirtualHost *:80>
      ServerName app1.yourdomain.com
      DocumentRoot /var/www/app1/public
      # 指定Ruby路径(如果用rvm/rbenv,要写完整路径,比如/usr/local/rvm/rubies/ruby-2.3.1/bin/ruby)
      PassengerRuby /usr/bin/ruby2.3
      <Directory /var/www/app1/public>
        AllowOverride all
        Options -MultiViews
        Require all granted
      </Directory>
    </VirtualHost>
    
    # 第二个应用(MySQL)的虚拟主机
    <VirtualHost *:80>
      ServerName app2.yourdomain.com
      DocumentRoot /var/www/app2/public
      PassengerRuby /usr/bin/ruby2.3
      <Directory /var/www/app2/public>
        AllowOverride all
        Options -MultiViews
        Require all granted
      </Directory>
    </VirtualHost>
    
  2. 确认每个应用的Gemfile包含对应数据库的gem:
    • PostgreSQL应用:gem 'pg'
    • MySQL应用:gem 'mysql2'
      然后在每个应用目录下执行bundle install --without development test安装依赖

第五步:检查文件权限问题

Apache/Passenger的运行用户(通常是apache)需要对应用目录有读写权限:

# 更改应用目录的所有者为apache用户
chown -R apache:apache /var/www/app1 /var/www/app2
# 设置目录权限
chmod -R 755 /var/www/app1 /var/www/app2
# tmp目录需要更高的权限,用于Rails的缓存和套接字
chmod -R 775 /var/www/app1/tmp /var/www/app2/tmp

第六步:重启服务生效

完成以上检查后,重启相关服务:

# 重启数据库服务
systemctl restart postgresql-9.6 mysqld
# 重启Apache和Passenger
systemctl restart httpd
# 或者单独重启某个应用(避免影响另一个)
passenger-config restart-app /var/www/app1
passenger-config restart-app /var/www/app2

如果补全错误日志后发现是特定问题(比如gem缺失、数据库用户权限不足),可以针对性处理。

内容的提问来源于stack exchange,提问作者Derrell Durrett

火山引擎 最新活动