Rails 新手部署 Rails 过程中遇到的 Ubuntu 18.04 安装 Nginx + Passenger 失败问题

jianchixuexi · 2022年06月05日 · 最后由 dingxiaohu2009 回复于 2022年06月10日 · 766 次阅读

我是新手,在练习部署 rails. 其中的关键步骤,安装 Nginx + Passenger

本来是按照教程里这个步骤操作:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 561F9B9CAC40B2F7
sudo apt-get install -y apt-transport-https ca-certificates
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
sudo apt-get update
sudo apt-get install -y nginx-extras passenger

但是第 5 步遇到依赖报错了(类似这样:

epends: perlapi-5.18.2 but it is not installable
Depends: libc6 (>= 2.14) but 2.13-38+deb7u8 is to be installed
Depends: libgd3 (>= 2.1.0~alpha~) but it is not installable
Depends: libperl5.18 (>= 5.18.2) but it is not installable
Recommends: passenger (< 5.0.5) but 1:5.0.4-1~trusty1 is to be installed 

搜了一圈定位到问题:上面适用于 Ubuntu 16.04;而不适用于我在用的 18.04 搜到几个遇到相同的同学说重装到 16.04 才解决问题。 于是我先用独立安装的 Nginx 的方式安装好了: 参考文档 https://www.phusionpassenger.com/library/install/standalone/install/oss/bionic/#

但后面配置了 nginx 之后就又报错了,报错信息:

unknown directive "passenger_show_version_in_header" in /etc/nginx/nginx.conf
configuration file /etc/nginx/nginx.conf test failed

然后把根据报错信息搜到的可能的解决方案都尝试了一遍,都没有搞定: 比如 根据官方的 针对 ubuntu 18.04 来安装 Passenger + Nginx https://www.phusionpassenger.com/library/install/nginx/install/oss/bionic/ 比如 github 的 issue Passenger + Nginx on ubuntu 18.04 is not working https://github.com/phusion/passenger_apt_automation/issues/22 里面两个人提到的可能的办法也试过了

我用 nginx -V 查看了 始终没有 passenger module

请问有什么不改用其他版本的系统的解决办法么? 如果只能改用其他版本系统的话,用比 18.04 更高的版本可以解决这个问题么?

新手就不要用 Passenger 了,几百年前的货了

nginx 报错了 你去 nginx 里面 找一下 passenger_show_version_in_header 删掉试试

3 楼 已删除

你这学习教程有点老哦。多年前开始 rails 自带的 web 服务器就是 puma 了,不折腾

lyb124553153 回复

多谢回复 我尝试了这个办法,会出现新的报错

xianyuit 回复

多谢建议

xianyuit 回复

我以为,就是新手才要用 passenger。 请问,那新手应该要用什么?

@charlie_hsieh

https://gorails.com/deploy/ubuntu/18.04

按这个步骤做,可以部署成功,亲测。

gxlonline 回复

Thanks a lot!

xianyuit 回复

你误解我了。我是真的想知道现在新手,应该要用什么来部属,因为 gorails 教程也是 passenger ??

charlie_hsieh 回复

用 puma 就行了,Rails 新建项目从开发环境就默认 puma。

https://www.phusionpassenger.com/features。看一下这个页面。passenger 免费版不支持 Zero-downtime Rolling Restarts,需要企业版才可以,而 puma 是支持的

同步一下:我最终还是选择了重装 ubuntu16.04 才解决了这个问题,之前搜到的所有办法都试过了无效。

好吧,我告诉你原因,在第三行里的 xenial 是 ubuntu16.04 的代码。18.04 是 bionic
第三行应该是这个样子的
sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger bionic main > /etc/apt/sources.list.d/passenger.list'

https://www.phusionpassenger.com/docs/tutorials/deploy_to_production/ 这里是官网,自己去选择一下对应的一些参数,才可以。

ken 回复

之前尝试过根据官方的 针对 ubuntu 18.04 来安装 Passenger + Nginx https://www.phusionpassenger.com/library/install/nginx/install/oss/bionic/ 还是一样的报错

你 rails 啥版本.5.0 之后的都自带的 5.0 的 puma 吧... 建议直接用 puma 就行了. 部署工具简单用的话可以用 mina https://github.com/mina-deploy/mina

5.0 之后的 puma 可以直接 systemd 的托管. 基于 mina 我有个库可以直接用 https://github.com/Oyaxira/mina-nginx-puma


现在小项目起新服务器,不走 docker 的话基本都只需要安装 rvm/rbenv 装 ruby. 数据库啥的 然后直接装 nginx 默认版本 mina init; mina setup 一下直接 deploy 就行了

用编译方式安装 passenger,先安装 passenger 的 gem 包

gem install passenger

然后用 passenger 安装 nginx

passenger-install-nginx-module

一共 2 条命令全部搞定。安装的过程中会让你选择安装的模块,和安装路径。默认在/opt/nginx 这样安装好的 nginx 是包含 passenger 的。

不赞同某些楼的说法。

passenger 新手和老手用都没问题,很舒服很傻瓜,我们生产环境一直都在用。

不支持 Zero-downtime,直接在部署脚本里写一条 curl,访问一下项目页面激活一下就行了,不是什么事。

jianchixuexi 回复

passenger 有了新的文档。
我等下测试下这个旧的教程是不是不能用了。理论上讲不会,我都部署过很多次了。

nine 回复

passenger 重启时几秒钟的无响应怎么处理

BruceDing 回复

几秒钟夸张了吧,1、2 秒钟差不多

  • passenger_show_version_in_header 这个参数配置没必要。
  • 我完全按照教程安装的,没有问题。
  • 需要自己安装 nginx,运行sudo apt install nginx即可。
  • 我使用的了 RVM,所以对mod-http-passenger.conf这个文件进行了修改。
  • /etc/nginx/nginx.conf 这个文件完全没修改。/etc/nginx/sites-enabled/default 这个文件的 root 修改了,增加了一行passenger_enabled on;

以上。

nine 回复

有啥夸张的,我以前用 passenger 就是几秒的无响应。

dingxiaohu2009 回复
      01 touch /data/www/xxxx/current/tmp/restart.txt
    ✔ 01 [email protected] 0.221s
      02 curl http://xxx
      02   % Total    % Received % Xfe
      02 rd  Average Speed   Time    Time
      02   Time  Current
      02
      02         Dload  U
      02 pload   Total
      02    Spent    Le
      02 ft  Spe
      02 ed
  0   02
      02   0
      02 0     0
      02     0
      02   0
      02     0
      02       0
      02  --:--
      02 :-- -
      02 -:--:--
      02  --:--:
      02 --     0
  0     0    0     0    0     0      0      0 --:--:-
      02 -  0:00:01 --:--:--     0
100  1200    0  1200    0     0    5
      02 54      0 --:--:--  0:00:02 --:--:--   554
100  1200    0  1200    0     0    554
      02     0 --:--:--  0:00:02 --:--:--   554
      02 <!DOCTYPE html>
      02 <html>
      02
      02 <head>
           xxxxxxxx
      02
      02
      02
      02   </div>
      02
      02 </body>
      02
      02 </html>
      02
    ✔ 02 [email protected] 2.450s

普通 4 核云服务器,远程 curl 一下就 2.45 秒

nine 回复

不知道在你的概念里 2.45 秒属不属于几秒的范围,更何况不同规模的 app 用时也不一样。线上环境如果重启的时候如果不用滚动更新的办法,2.45 秒 + 的延迟所有系统都能接受吗?puma 支持 hot reload, phased restart,又是免费开源的官方推荐,不想花钱又不想麻烦时选择 puma 不是很正常的选择吗

我都是部署完自己访问第一次😂

dingxiaohu2009 回复

不知道你的项目线上重启的原因是什么。

我这里一般 2 种情况,1 业务逻辑更新,2bug 修复。

无论那种情况,都应该立即停止错误/过时的版本,避免产生错误的业务数据。而不是为了 2、3 秒钟“用户体验”,盲目追求技术自嗨。

用户不是傻子,无法响应,第一时间会反应是不是自己网络问题,而刷新重试。而所有页面和 API 都是按幂等设计的,提交不成功,重试即可,这才是高可用性系统的设计基本原则。

nine 回复

你说的都对。追究技术就是自嗨;用户都是大聪明;幂等 + 重试就是可用,而且还很高。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号