开始对我的Rails应用程序进行docker化我面临以下问题:
我的想法是让每个带有Wsgi和依赖项的Web应用程序在一个额外的docker容器中运行,并且数据库在使用docker-compose进行设置时也会在单独的容器中运行。
在容器之外,Nginx通过unix套接字将流量路由到特定容器,然后根据域路由。(不希望容器中的nginx降低复杂性并避免在多个容器中运行多个nginx来维护多个webapps) 。
在开始使用docker之前,我的wsgi和nginx通过unix套接字连接。但在停泊后这不再适用了。现在只能将它们与端口连接起来,我希望避免这种情况。
有没有办法通过unix套接字将Nginx与主机内的WSGI连接在主机上?如果不是这里的最佳做法?
我的方法是使用共享卷作为套接字文件的位置,但是nginx无法访问由wsgi unicorn创建的套接字: 由独角兽创建的套接字:
srwxrwxrwx 1 root root 0 Nov 14 14:53 unicorn.sock=
Nginx错误:
*2 connect() to unix:/ruby-webapps/myapp/shared/sockets/unicorn.sock failed (13: Permission denied) while connecting to upstream
Nginx sites-avaible / myapp:
upstream myapp {
# Path to Unicorn SOCK file, as defined previously
server unix:/ruby-webapps/myapp/shared/sockets/unicorn.sock fail_timeout=0;
}
server {
listen 80 default_server;
...
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name myapp.de www.myapp.de;
root /ruby-webapps/myapp;
try_files $uri/index.html $uri @MyApp;
location @MyApp {
proxy_pass http://myapp;
#proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Forwarded-For https;
proxy_redirect off;
}
}
搬运工-compose.yml:
version:'2'
services:
postgresmyapp:
image: postgres
env_file: .env
myapp:
build: .
env_file: .env
command: supervisord -c /myapp/unicorn_supervisord.conf
volumes:
- .:/myapp
ports:
- "3000:3000"
links:
- postgreslberg
config / unicorn.rb:
app_dir = File.expand_path("../..", __FILE__)
shared_dir = "#{app_dir}/shared"
working_directory app_dir
rails_env = ENV['RAILS_ENV'] || 'production'
# Set unicorn options
worker_processes 2
preload_app true
timeout 30
# Set up socket location
listen "#{shared_dir}/sockets/unicorn.sock", :backlog => 64
#listen(3000, backlog: 64)
stderr_path "#{shared_dir}/log/unicorn.stderr.log"
stdout_path "#{shared_dir}/log/unicorn.stdout.log"
pid "#{shared_dir}/pids/unicorn.pid"