Ubuntu18.04下Nginx+Passenger部署Rails应用遇权限及编译问题求助
我来帮你搞定这个困扰已久的问题——你遇到的核心症结是Ubuntu 18.04官方Nginx包未集成Passenger模块,再加上旧环境的残留配置干扰,导致Nginx没有把请求交给Rails应用处理,而是自己尝试解析静态文件,才出现了403(找不到目录索引)和404(找不到对应静态文件)的错误。自己编译Nginx确实会遇到systemctl管理的麻烦,咱们换用Passenger官方提供的预编译Nginx包就能完美解决,具体步骤如下:
1. 清理旧Nginx环境(关键步骤)
首先要彻底清除旧的Nginx安装和配置,避免干扰新环境:
- 停止当前Nginx服务:
sudo systemctl stop nginx - 卸载所有相关Nginx包:
sudo apt remove --purge nginx nginx-core nginx-full nginx-light - 删除残留的配置和日志目录:
sudo rm -rf /etc/nginx /var/log/nginx - 如果之前自己编译过Nginx,找到安装目录(通常是
/usr/local/nginx)并删除,同时清理可能存在的自定义systemd服务文件:sudo rm -rf /usr/local/nginx sudo rm -f /etc/systemd/system/nginx.service
2. 安装Passenger官方预编译的Nginx包
Passenger官方提供了带预编译模块的Nginx包,完美适配Ubuntu 18.04,且自带正确的systemd配置:
- 导入Passenger的GPG密钥:
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7 - 添加Passenger的APT源:
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list' - 更新APT缓存并安装Nginx+Passenger:
sudo apt update sudo apt install nginx-extras passenger - 验证Passenger模块是否成功加载:
输出内容中应该能看到类似sudo nginx -V--add-module=/usr/src/passenger/nginx_module的行,说明模块已集成。
3. 配置Passenger和Rails应用
3.1 配置Passenger全局参数
编辑Passenger的全局配置文件:
sudo nano /etc/nginx/conf.d/passenger.conf
确保文件包含以下内容(用你之前确认过的正确Ruby路径):
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini; passenger_ruby /usr/bin/ruby2.5; passenger_instance_registry_dir /var/run/passenger-instreg;
3.2 修改站点配置文件
备份并修改你的/etc/nginx/sites-available/cennik.conf,移除不必要的反向代理配置(Passenger是直接嵌入Nginx的,不需要反向代理),最终配置如下:
server { listen 80; server_name cennik.leczymed.pl; include snippets/letsencrypt.conf; return 301 https://cennik.leczymed.pl$request_uri; } server { listen 443 ssl http2; server_name cennik.leczymed.pl; # 指定Rails应用的public目录 root /var/www/html/cennik/public; access_log /var/log/nginx/cennik.leczymed.pl.access.log; error_log /var/log/nginx/cennik.leczymed.pl.error.log; # 开启Passenger passenger_enabled on; passenger_ruby /usr/bin/ruby2.5; # 确保Rails能正确识别HTTPS请求(避免生成HTTP链接) passenger_set_cgi_param HTTP_X_FORWARDED_PROTO https; passenger_set_cgi_param HTTP_X_FORWARDED_SSL on; # SSL配置 ssl_certificate /etc/letsencrypt/live/cennik.leczymed.pl/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/cennik.leczymed.pl/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/cennik.leczymed.pl/chain.pem; include snippets/letsencrypt.conf; include snippets/ssl.conf; # 静态资源缓存配置 location ^~ /assets/ { gzip_static on; expires max; add_header Cache-Control public; } }
4. 修复应用权限(更安全的设置)
不需要把public目录设为777,调整为更安全的权限,同时确保Nginx运行用户(www-data)能读取应用文件:
- 将
www-data加入cennik用户组:sudo usermod -aG cennik www-data - 统一应用目录和文件权限:
sudo chmod 755 /var/www/html/cennik sudo chmod 755 /var/www/html/cennik/public sudo find /var/www/html/cennik -type f -exec chmod 644 {} \; sudo find /var/www/html/cennik -type d -exec chmod 755 {} \;
5. 验证配置并重启服务
- 测试Nginx配置是否正确:
sudo nginx -t - 如果配置无错误,重启Nginx:
sudo systemctl restart nginx - 查看Passenger状态,确认应用是否正常启动:
sudo passenger-status
为什么之前的方法不行?
你自己编译Nginx时,默认不会生成适配systemd的服务文件,所以无法用systemctl管理。而Passenger官方提供的Nginx包自带了正确的systemd配置,既能保证Passenger模块正常工作,又能像官方Nginx一样用systemctl管理服务,是最适合生产环境的方案。
内容的提问来源于stack exchange,提问作者ArtLion

