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数据库配置
每个应用的数据库连接配置是核心,务必确认正确:
- 进入应用根目录,打开
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
- PostgreSQL应用的配置示例:
- 在应用目录下测试数据库连接:
# 切换到应用目录 cd /var/www/app1 # 测试生产环境数据库连接 RAILS_ENV=production rails db:version
如果这个命令报错,会直接给出具体的连接问题(比如密码错误、数据库不存在、权限不足等)
第四步:确认Passenger与应用的隔离配置
确保Passenger为两个应用分配独立的运行环境:
- 检查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> - 确认每个应用的
Gemfile包含对应数据库的gem:- PostgreSQL应用:
gem 'pg' - MySQL应用:
gem 'mysql2'
然后在每个应用目录下执行bundle install --without development test安装依赖
- PostgreSQL应用:
第五步:检查文件权限问题
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




