You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu18.04下Nginx+Passenger部署Rails应用遇权限及编译问题求助

解决Ubuntu 18.04 Nginx+Passenger部署Rails应用的403/404问题

我来帮你搞定这个困扰已久的问题——你遇到的核心症结是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:53:24