为什么在Rails s下服务器可以运行-在Mac上使用Rails + puma + Nginx构建服务器

首先

各位大家好,你们在开发过程中有没有只是简单地运行”rails s”,却不知道Rails服务器究竟是如何启动的呢?可惜的是,直到最近我都一直在开发中没有深入了解其内部处理过程。
因此,这次我调研了一下在执行”rails s”时服务器是如何启动的,以及常用的Rails + puma + Nginx服务器架构。

結論:

概括来说,当我们运行rails s时,会启动一个名为Rack的服务器,并将Rails作为Rack应用程序启动。

Rack的意思是什么?

根据Rack的入门指南,参考链接为 https://leahneukirchen.org/blog/archive/2007/02/introducing-rack.html。

Rack 的目标是为连接 web 服务器和 web 框架提供最简化的 API。

换句话说,Rack是连接Web服务器和Web框架的中介角色。

为什么选择Rails + puma + Nginx的配置?

Rails使用了一个称为Rack的Web服务器和Ruby框架之间的接口来启动服务器,正如之前所提到的。

为什么在Rack和Nginx之间需要puma呢?

总结来说,无法直接将Rack和Nginx连接在一起。

在中国,我们如何将Rack和Nginx连接在一起呢?

这里使用的是puma!!

puma是什么

Puma是Rails中默认指定的应用服务器。

在开发阶段,使用 Puma 作为 Web 服务器是没有问题的。然而,由于 Puma 是用 Ruby 编写的,与用 C 语言编写的 Nginx 相比,由于语言特性的原因,它的处理速度会变慢。

因此,在开发环境中,即使应用程序正常运行,但在生产环境中当大量访问集中时,处理速度会变慢。

因此,在使用Rails进行Web应用程序开发时,需要与Nginx等Web服务器进行协作以推进开发进程。

Nginx是什么意思?

来自维基百科
https://ja.wikipedia.org/wiki/Nginx

nginx(发音为「恩真江(Ēn )」[1] [2])是一个免费且开源的Web服务器。它专注于处理性能、高并发性和低内存使用量,并具有HTTP、HTTPS、SMTP、POP3、IMAP反向代理功能以及负载均衡器、HTTP缓存等功能。

实际上,全球66%的高流量网站使用Nginx进行运营。(来源:Nginx官方网站https://www.nginx.co.jp/)

提到网页服务器就不能忘了Nginx!!

最后,我打算在Mac上尝试使用Rails + puma + Nginx来搭建服务器。

使用Mac构建Rails + puma + Nginx服务器

1. 安装Nginx

# インストール
$ brew install nginx

# バージョン確認
$ nginx -v
nginx version: nginx/1.21.4

2. 检查Nginx的访问情况

# nginx起動
$ sudo nginx

# nginx停止
sudo nginx -s stop

3. Nginx虚拟主机配置

修改nginx的配置文件。
对于Mac用户来说,nginx的配置文件路径是/usr/local/etc/nginx/nginx.conf。

user  nobody;
worker_processes  auto;
error_log  /usr/local/var/log/nginx/error.log;
pid        /usr/local/var/run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /usr/local/var/log/nginx/access.log  main;

    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;
    keepalive_timeout  65;
    types_hash_max_size 2048;

    include            mime.types;
    default_type       application/octet-stream;
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

准备虚拟主机设置文件配置目录

$ mkdir /etc/nginx/sites-available
$ mkdir /etc/nginx/sites-enabled

创建虚拟主机配置文件

nano /etc/nginx/sites-available/{アプリ名}

将以下代码写入/usr/local/etc/nginx/sites-available/{应用名称}的文件中。

upstream Nginx-test-app {
  server unix:/Users/{ユーザー名}/Desktop/work/Nginx-test-app/tmp/sockets/puma.sock;
}

server {
  listen 80;
  server_name .*;

  root /Users/{ユーザー名}/Desktop/work/Nginx-test-app/public;

  location / {
    try_files $uri @app;
  }

  location @app {
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-Host    $host;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_pass http://backend;
  }
}

将虚拟主机配置文件复制到”/usr/local/etc/nginx/sites-enabled”目录中。

$ ln -s /etc/nginx/sites-available/{アプリ名} /etc/nginx/sites-enabled/{アプリ名}

4. Puma配置设置Rails应用程序

请在您创建的Rails应用的/config/puma.rb文件的底部添加以下内容。

bind "unix://#{Rails.root}/tmp/sockets/puma.sock"

5. Nginx验证Rails访问

#nginxの立ち上げ
$ sudo nginx

#railsサーバーの立ち上げ
$ rails s
=> Booting Puma
=> Rails 6.0.3.4 application starting in development 
=> Run `rails server --help` for more startup options
warning ../../../package.json: No license field                                                                                                                                                         
Puma starting in single mode...
* Version 4.3.6 (ruby 2.6.3-p62), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
* Listening on tcp://[::1]:3000
* Listening on unix:///Users/{ユーザー名}/Desktop/work/{アプリ名}/tmp/sockets/puma.sock
Use Ctrl-C to stop

只要达到这种状态就算成功了!

我成功将Rails应用程序的Web服务器切换到了Nginx!!

#railsサーバーの停止
Ctrl + C

#nginxの停止
$ sudo nginx -s stop

最终

通过了解我们平常在开发中使用的框架是如何建立和运行服务器的,我个人对服务器的理解加深,也产生了兴趣。与此同时,也深刻感受到了服务器的复杂性,哈哈。

由于我对服务器的知识还很浅,所以如果这篇文章有错误之处,请随时在评论中指出。我将继续努力学习有关服务器的知识。

希望这篇文章能成为大家对您的服务器产生兴趣的起点。

可供参考的文章

https://qiita.com/NaokiIshimura/items/888d77f924877e5dc5e0
这篇文章的标题是”使用Docker Compose在本地运行Django应用程序”。作者介绍了如何使用Docker Compose来设置和管理一个基于Django的Web应用程序。文章提供了详细的步骤和示例代码来帮助读者快速入门。

https://blog.mothule.com/web/nginx/web-nginx-getting-started-step3-on-mac#web%E3%82%B5%E3%83%BC%E3%83%90%E3%81%A8ap%E3%82%B5%E3%83%BC%E3%83%90%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E9%81%95%E3%81%84
这篇博文的题目是”在Mac上开始使用Nginx – 第三步:Web服务器和AP服务器的差异”。作者讨论了在使用Nginx时,Web服务器和AP服务器之间的差异和特点。文章提供了详细的说明和示例来帮助读者理解和区分这两种服务器。

https://qiita.com/kamohicokamo/items/3ec26ccb8e16b8ba9adb
这篇文章的题目是”Kubernetes命令备忘录”。作者总结了一些常用的Kubernetes命令和操作,以备忘和参考。文章列出了各种命令及其用途,并提供了简洁明了的解释,适合Kubernetes初学者或需要查阅命令的人使用。

广告
将在 10 秒后关闭
bannerAds