为什么在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初学者或需要查阅命令的人使用。