我有一个由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)?
答案 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的了解同时都很薄弱,这就是为什么我无法弄清楚出了什么问题。