我正在使用Puma和Nginx来运行我的Rubinius应用程序。我想分离我的URL请求。第一个用于API请求,第二个用于其他请求。我认为Puma已经实现了线程化,但我想确保Web请求不会阻塞线程,这会导致我的API请求停止。我假设如果一个线程很忙碌,Puma会创建另一个线程,但我想确保这个线程始终可用于API请求。我这里的主要观点是为URL请求“保存”一个线程,这是我的用户最需要的。
yhuiod9q1#
由于Puma在单独的线程中考虑每个请求,因此这里唯一的瓶颈是这些线程对数据库的访问。除此之外,你不能保证某些线程比其他线程“更好”。这里值得注意的一个可能的解决方案是使用nginx处理它。假设您的应用正在http://some_host.com上提供内容,而API在http://some_host.com/api中可用。您可以将nginx配置为分别处理http://some_host.com和http://some_host.com/api的请求。在本例中,您需要Puma服务器的两个独立示例。一个用于基础应用程序,一个用于API请求。我这里的意思是,当一个请求来到http://some_host.com时,它由Puma A处理,当到达http://some_host.com/api/...时,它由Puma B处理。请记住一件事,您可以通过单独的示例处理请求,但您仍然只有一个数据库,除非您正在缓存内容。又来了一个问题你缓存你的内容吗?如果没有,那么首先从缓存开始不是更好的主意吗?
nginx
http://some_host.com
API
http://some_host.com/api
Puma
Puma A
http://some_host.com/api/...
Puma B
p1tboqfb2#
为什么不将主应用程序和API分开?使用Nginx很容易服务两个不同的应用程序:
location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://puma1; } location /api/ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://puma2/; }
请注意第二个位置proxy_pass的尾部斜杠,它有助于重写请求并省略'/API'前缀。
2条答案
按热度按时间yhuiod9q1#
由于Puma在单独的线程中考虑每个请求,因此这里唯一的瓶颈是这些线程对数据库的访问。除此之外,你不能保证某些线程比其他线程“更好”。
这里值得注意的一个可能的解决方案是使用
nginx
处理它。假设您的应用正在http://some_host.com
上提供内容,而API
在http://some_host.com/api
中可用。您可以将nginx
配置为分别处理http://some_host.com
和http://some_host.com/api
的请求。在本例中,您需要Puma
服务器的两个独立示例。一个用于基础应用程序,一个用于API请求。我这里的意思是,当一个请求来到http://some_host.com
时,它由Puma A
处理,当到达http://some_host.com/api/...
时,它由Puma B
处理。请记住一件事,您可以通过单独的示例处理请求,但您仍然只有一个数据库,除非您正在缓存内容。又来了一个问题你缓存你的内容吗?如果没有,那么首先从缓存开始不是更好的主意吗?
p1tboqfb2#
为什么不将主应用程序和API分开?使用Nginx很容易服务两个不同的应用程序:
请注意第二个位置proxy_pass的尾部斜杠,它有助于重写请求并省略'/API'前缀。