Nginx Can';在我的web服务器上,无法从教程访问我的Vapor应用程序
我想在我的服务器上部署一个Vapor应用程序,将其用作iOS应用程序的后端 我对这个话题很陌生。我以前做的唯一一件事就是在同一台服务器上部署Django后端。我重建服务器以设置Vapor后端 首先,我想部署一个尽可能基本的Vapor应用程序。 我遵循了本教程(很短): 我按照步骤操作,没有出现错误 问题是,当我像在教程中那样尝试调用Nginx Can';在我的web服务器上,无法从教程访问我的Vapor应用程序,nginx,vapor,Nginx,Vapor,我想在我的服务器上部署一个Vapor应用程序,将其用作iOS应用程序的后端 我对这个话题很陌生。我以前做的唯一一件事就是在同一台服务器上部署Django后端。我重建服务器以设置Vapor后端 首先,我想部署一个尽可能基本的Vapor应用程序。 我遵循了本教程(很短): 我按照步骤操作,没有出现错误 问题是,当我像在教程中那样尝试调用[IP]/hello时,我得到的答案是502坏网关 Nginx给了我这个错误: connect() failed (111: Connection refused)
[IP]/hello
时,我得到的答案是502坏网关
Nginx给了我这个错误:
connect() failed (111: Connection refused) while connecting to upstream, client: [IP], server: _, request: "GET /hello HTTP/1.1", upstream: "http://127.0.0.1:8080/hello", host: "[IP]"
我希望你能在这方面帮助我。:)
更新1: 我将配置更改为:
server {
listen 80;
listen [::]:80;
server_name [DOMAIN];
error_log /var/log/[DOMAIN]_error.log warn;
access_log /var/log/[DOMAIN]_access.log;
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
large_client_header_buffers 8 32k;
location / {
# redirect all traffic to localhost:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_read_timeout 86400;
# enables WS support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;
reset_timedout_connection on;
tcp_nodelay on;
client_max_body_size 10m;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|html|mp4)$ {
access_log off;
expires 30d;
root /home/[AppName]/Public;
}
}
不幸的是,我仍然得到这个:
2019/12/01 14:48:04 [error] 6801#6801: *1 connect() failed (111: Connection refused) while connecting to upstream, client: [IP], server: [DOMAIN], request: "GET /hello HTTP/1.1", upstream: "http://127.0.0.1:8080/hello", host: [DOMAIN]
更新2:
错误与此行有关:
proxy\u passhttp://127.0.0.1:8080/;代码>
我不得不把它改成这样:
proxy\u passhttp://localhost:8080/;代码>
似乎localhost是不一样的
现在我可以通过“vapor run”运行应用程序,并可以访问它。:)
非常感谢@imike的帮助 您可以尝试我的100%works生产配置,支持SSL和WebSocket
server {
listen 443;
listen [::]:443;
server_name mydomain.com;
error_log /var/log/mydomain.com_error.log warn;
access_log /var/log/mydomain.com_access.log;
ssl on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
ssl_ciphers 'HIGH:!aNULL:!MD5:!kEDH';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
ssl_stapling on;
ssl_stapling_verify on;
large_client_header_buffers 8 32k;
location / {
# redirect all traffic to localhost:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_read_timeout 86400;
# enables WS support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;
reset_timedout_connection on;
tcp_nodelay on;
client_max_body_size 10m;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|html|mp4)$ {
access_log off;
expires 30d;
root /apps/myApp/Public;
}
}
在配置的最后,您可以看到,公用文件夹nginx中的静态文件将直接返回,而无需运行Vapor应用程序
在config.swift文件中,您应该仅在macOS上使用FileMiddleware,因为在没有nginx的情况下测试应用程序,因为该中间件非常慢,所以我建议您将其放入编译器检查
#if os(macOS)
middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
#endif
您可以使用SSL和websockets支持尝试我的100%works生产配置
server {
listen 443;
listen [::]:443;
server_name mydomain.com;
error_log /var/log/mydomain.com_error.log warn;
access_log /var/log/mydomain.com_access.log;
ssl on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
ssl_ciphers 'HIGH:!aNULL:!MD5:!kEDH';
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
ssl_stapling on;
ssl_stapling_verify on;
large_client_header_buffers 8 32k;
location / {
# redirect all traffic to localhost:8080;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_read_timeout 86400;
# enables WS support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# prevents 502 bad gateway error
proxy_buffers 8 32k;
proxy_buffer_size 64k;
reset_timedout_connection on;
tcp_nodelay on;
client_max_body_size 10m;
}
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml|html|mp4)$ {
access_log off;
expires 30d;
root /apps/myApp/Public;
}
}
在配置的最后,您可以看到,公用文件夹nginx中的静态文件将直接返回,而无需运行Vapor应用程序
在config.swift文件中,您应该仅在macOS上使用FileMiddleware,因为在没有nginx的情况下测试应用程序,因为该中间件非常慢,所以我建议您将其放入编译器检查
#if os(macOS)
middlewares.use(FileMiddleware.self) // Serves files from `Public/` directory
#endif
错误与配置文件中的此行有关:
proxy\u passhttp://127.0.0.1:8080/;代码>
我不得不把它改成这样:
proxy\u passhttp://localhost:8080/;代码>
似乎localhost是不一样的
现在我可以通过“vapor run”运行应用程序,并可以访问它。:)
非常感谢@imike的帮助!他解决了 错误与配置文件中的此行有关:
proxy\u passhttp://127.0.0.1:8080/;代码>
我不得不把它改成这样:
proxy\u passhttp://localhost:8080/;代码>
似乎localhost是不一样的
现在我可以通过“vapor run”运行应用程序,并可以访问它。:)
非常感谢@imike的帮助!他解决了 你试过我的配置了吗?在这些测试期间,您的vapor应用程序是否正在运行?它是否从服务器启动时打印http://127.0.0.1:8080
在控制台中?首先,我建议您使用--hostname 0.0.0.0参数运行vapor应用程序,并尝试像这样访问它,如果它可以工作,然后继续使用nginx我想localhost:8080和127.0.0.1:8080是不同的,因此,请尝试在nginx config中替换为localhost:8080,或者通过“swift run--hostname 127.0.0.1”启动您的应用程序,不要在0.0.0.0上启动您的应用程序,因为在这种情况下,它可能可以直接通过nginx访问,也可能被不好的人用来攻击您的应用程序。您从其他问题中尝试过我的配置吗?在这些测试期间,您的vapor应用程序是否正在运行?它是否从服务器启动时打印http://127.0.0.1:8080
在控制台中?首先,我建议您使用--hostname 0.0.0.0参数运行vapor应用程序,并尝试像这样访问它,如果它可以工作,然后继续使用nginx我想localhost:8080和127.0.0.1:8080是不同的,因此,请尝试在nginx config中替换为localhost:8080,或者通过“swift run--hostname 127.0.0.1”启动您的应用程序,不要在0.0.0.0上启动您的应用程序,因为在这种情况下,可能可以直接访问nginx,也可能被不好的人用来攻击您的应用程序谢谢您的回答!我必须添加SSL证书才能工作吗?使用文件时,Nginx不会重新启动。我需要做任何特殊的编辑吗?至少你应该更改域名。如果您没有SSL,那么您应该将端口从443更改为80,并删除所有与SSL相关的线路。谢谢!我想我改变了与SSL相关的线路,现在nginx重新启动了。不幸的是,我得到了502。我更新了我的问题。你能再看一眼吗?谢谢你的回答!我必须添加SSL证书才能工作吗?使用文件时,Nginx不会重新启动。我需要做任何特殊的编辑吗?至少你应该更改域名。如果您没有SSL,那么您应该将端口从443更改为80,并删除所有与SSL相关的线路。谢谢!我想我改变了与SSL相关的线路,现在nginx重新启动了。不幸的是,我得到了502。我更新了我的问题。你能再看看吗?