【发布时间】:2020-05-09 06:54:53
【问题描述】:
环境:RubyOnRails + Puma + nginx + Docker + Kubernetes
我在 k8s 中进行了部署。我做了一个吊舱,包括 3 个容器。
一个用于 ruby on rails,另一个用于 webpacker,另一个用于 nginx。
但问题是,当我通过curl http://localhost 检查我的 nginx 容器中的本地主机时,它会返回:
502 网关错误
curl http://localhost:3000 的结果没有问题。
我认为 nginx 设置可能有问题。
请告诉我问题出在哪里。
Kubernetes yaml
apiVersion: v1
kind: Service
metadata:
namespace: line-manager
name: web
labels:
app: web
spec:
selector:
app: web
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: line-manager
name: web
spec:
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: khjoo19/nginx:v2
imagePullPolicy: Always
command: ["/usr/sbin/nginx", "-g", "daemon off;", "-c", "/etc/nginx/nginx.conf"]
ports:
- containerPort: 80
volumeMounts:
- name: mysql-pv
mountPath: /var/lib/mysql
- name: webpacker
image: khjoo19/fullout-line:v2
imagePullPolicy: Always
command: ["bundle", "exec", "bin/webpack-dev-server"]
ports:
- containerPort: 8080
- name: web
image: khjoo19/fullout-line:v2
imagePullPolicy: Always
command: ["bundle", "exec", "puma", "-C", "config/puma.rb"]
env:
- name: MYSQL_DATABASE
value: lineManage_db
- name: MYSQL_USER
value: root
- name: MYSQL_HOST
value: mysql
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3000
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 30
volumeMounts:
- name: mysql-pv
mountPath: /var/lib/mysql
volumes:
- name: mysql-pv
persistentVolumeClaim:
claimName: mysql-pvc
nginx.conf
upstream line_manager {
server unix:///line_manager/tmp/sockets/puma.sock;
}
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
root /line_manager/public;
client_max_body_size 100m;
error_page 404 /404.html;
error_page 505 502 503 504 /500.html;
try_files $uri/index.html $uri @line_manager;
keepalive_timeout 30;
location @line_manager {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://line_manager;
}
}
puma.rb
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
port ENV.fetch("PORT") { 3000 }
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart
app_root = File.expand_path("../..", __FILE__)
bind "unix://#{app_root}/tmp/sockets/puma.sock"
stdout_redirect "#{app_root}/log/puma.stdout.log", "#{app_root}/log/puma.stderr.log", true
【问题讨论】:
-
你做过 -b 参数吗,我没有像那样使用 puma 但是在普通的rails中我们
CMD ["rails", "server", "-b", "0.0.0.0"]在docker中绑定ip。 -
我之前试过这个命令,但没有用。我认为我的 nginx 设置有问题。无论如何,我感谢您的评论。
-
另外一种方法是将
port ENV.fetch...行替换为port ENV.fetch("PORT") { 3000 }, ENV.fetch("HOST") { '0.0.0.0' }只是猜测无法运行真实环境来测试问题所在。 -
@Realpro,你能确认 Suren 的回答对你有用吗?
-
是的,它成功了!我发现 puma 的命令就是为什么看起来像这样。如果我使用命令“bundle exec rails s”,它不会听 puma.sock。好吧,我想让它听 puma.sock 以便我可以链接 nginx 和 puma。也感谢您的支持!
标签: ruby-on-rails docker nginx kubernetes puma