Nginx作为反向代理,但不通过套接字将流量传递给Puma

时间:2016-06-08 20:26:49

标签: sockets nginx reverse-proxy puma

我有一个由Nginx作为Web服务器的Web应用程序。当它配置如下时,它的工作原理。点击http://192.168.33.10:9174/会产生" 402需要付款"

# /etc/nginx/sites-enabled/myapp

server {
  listen  9174;
  server_name 127.0.0.1;
  location /status {
    stub_status on;
    access_log off;
  }
  return 402;
}

有效。

然后我试图让它将流量转发到Puma应用服务器,但它失败了。然后我按如下方式设置了一堆代理:

# /etc/nginx/sites-enabled/myapp
upstream sqlitething {
  server www.sqlite.org;
}

upstream hwacithing {
  server www.hwaci.com;
}

upstream appthing {
  #server unix:///home/deployer/myapp/shared/sockets/socktest.sock 
  server unix:/home/deployer/myapp/shared/sockets/puma.sock fail_timeout=0;
}

server {
  listen   80;
  server_name 192.168.33.10;
  location / {
     proxy_pass http://sqlitething;
  }
}

server {
  listen   8080;
  server_name 192.168.33.10;
  location / {
     proxy_pass http://hwacithing;
  }
}

server {
  listen   8099;
  server_name 192.168.33.10;
  location / {
     proxy_set_header X-Forwarded-For $remote_addr;
     proxy_set_header Host $http_host;
     proxy_redirect off;
     proxy_pass http://appthing;
  }
}

server {
  listen  9175;
  server_name 192.168.33.10;
  return 402;
}

以下是使用浏览器点击网址时的结果:

存在套接字文件,其权限如下:

srwxrwxrwx 1 deployer deployer 0 Jun  8 19:15 /home/deployer/myapp/shared/sockets/puma.sock

--------更新6月8日5:57 EST --------------------

我为失败的网址尝试了以下内容:

$ curl -isL http://192.168.33.10:8099
HTTP/1.1 301 Moved Permanently
Server: nginx/1.1.19
Date: Wed, 08 Jun 2016 21:52:54 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Location: https://appthing/
Vary: Accept-Encoding

我尝试了以下成功的网址

$ curl -isL http://192.168.33.10:8080
HTTP/1.1 200 OK
Server: nginx/1.1.19
Date: Wed, 08 Jun 2016 21:54:46 GMT
Content-Type: text/html
Content-Length: 1167
Connection: keep-alive
Vary: Host
Last-Modified: Wed, 13 Dec 2006 14:54:32 GMT
ETag: "88047-48f-4247d938f5a00"
Accept-Ranges: bytes

<html><head><title>Hwaci Homepage</title></head><body bgcolor="white">
    <font size="7"><b>Hwaci</b></font><br>



...etc...

-----更新6月9日美国东部时间上午11:24 --------------

我添加了

proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_redirect off;

连接到Unix套接字的端口8099的服务器/监听块。我得到了相同的结果。

然后我去了http://blog.honeybadger.io/how-unicorn-talks-to-nginx-an-introduction-to-unix-sockets-in-ruby/并设置了一个小套接字服务器,因为它们已指定但是使用套接字

unix:///home/deployer/myapp/shared/sockets/socktest.sock 

然后我修改了nginx.conf,以便它不会进行守护,并且错误会转到stdout。

daemon off;
error_log /dev/stdout info;

然后我将nginx作为

运行
> sudo nginx -c nginx.conf

当我运行curl来打nginx / socket组合时,我得到了这个:

$ curl -isL http://192.168.33.10:8099
HTTP/1.1 502 Bad Gateway
Server: nginx/1.1.19
Date: Thu, 09 Jun 2016 15:13:57 GMT
Content-Type: text/html
Content-Length: 173
Connection: keep-alive

<html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.1.19</center>
</body>
</html>

nginx日志看起来像这样:

2016/06/09 15:13:34 [notice] 9885#0: start worker process 9889
2016/06/09 15:13:49 [info] 9886#0: *1 client 192.168.33.1 closed keepalive connection
2016/06/09 15:13:57 [crit] 9886#0: *3 connect() to unix:/home/deployer/myapp/shared/sockets/socktest.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.33.1, server: 192.168.33.10, request: "GET / HTTP/1.1", upstream: "http://unix:/home/deployer/myapp/shared/sockets/socktest.sock:/", host: "192.168.33.10:8099"
2016/06/09 15:13:57 [info] 9886#0: *3 client 192.168.33.1 closed keepalive connection

----- 6月9日结束更新------------------- - - - - - - - ---

Puma进程正在运行

deployer@host0:/etc/nginx/sites-enabled$ ps -ef | grep puma
deployer 21319     1  0 19:15 ?        00:00:00 puma 2.16.0 (unix:///home/deployer/myapp/shared/sockets/puma.sock) [20160608191112]                                                                                                                                                                                                                                                                                                                                    
deployer 21322 21319  0 19:15 ?        00:00:09 puma: cluster worker 0: 21319 [20160608191112]                                                                                                                                                                                                                                                                                                                                                                              
deployer 21326 21319  0 19:15 ?        00:00:10 puma: cluster worker 1: 21319 [20160608191112] 

我正在配置上游到Puma,如各种配置指南中所指定。我做错了什么?

有没有办法查看Puma流程是否真正为我的网络应用程序提供服务?

有没有办法使用curl或wget以及通过Unix套接字访问Puma进程(unix:/home/deployer/myapp/shared/sockets/puma.sock)?

2 个答案:

答案 0 :(得分:1)

在我看来,您的puma应用程序正在尝试将连接从http升级到https。它通过发出重定向来实现。要保留便携式应用程序,它会使用请求标头中的HOST字段来确定其名称。

在您的位置块中,您没有指定任何proxy_set_header指令,因此nginx已为HOST和CONNECTION插入了默认值。 HOST的值是“appthing”。

您可能需要设置自己的一些proxy_set_header指令,让应用程序知道它的真实名称,可能会让应用程序相信该连接已经是安全的,并且可能会设置一些proxy_redirect指令来映射虚假重定向到可接受的值。

有关详细信息,请参阅this document

答案 1 :(得分:1)

最后,我通过执行

让套接字服务器正常工作
> chmod 777 /home/deployer/myapp/shared/sockets/socktest.sock

那告诉我,我的Nginx设置很好。

但是Puma插座仍然失败了。

原来,Puma应用服务器背后的Web应用程序已配置:

config.force_ssl = true

一旦我意识到这一点,我将Nginx配置为侦听端口443,打开SSL,设置一些自签名证书,以及.........它有效。

所有这一切的教训是,我对Nginx,Puma,套接字,权限和SSL的了解同时都很薄弱,这就是为什么我无法弄清楚出了什么问题。