NGINX将请求错误地转发到默认位置

时间:2020-01-07 06:50:20

标签: nginx https

我有一个React Web应用程序,正在尝试在AWS EC2实例上进行部署,并且正在使用NGINX。我正在尝试进行设置,以便所有http请求都重定向到https。现在,它似乎确实将所有http请求重定向到https,但是NGINX将请求转发到默认路径/ usr / share / nginx / html /,而不是转发到我在localhost上运行的Web应用程序。我已经阅读了数十篇文章,并且已经尝试了好几天了。指针将不胜感激。预先感谢。

这是我的NGINX服务器配置,位于/ etc / nginx / sites-available / default:

server {

  listen 80;

  if ($http_x_forwarded_proto = "http") {
    return 301 https://$host$request_uri;
  }
}

server {

  listen 443 ssl http2 default_server;
  listen 443 ssl http2 default_server;

  ssl on;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
  ssl_session_cache shared:SSL:50m;
  ssl_session_timeout 1h;

  location / {
    proxy_pass http://127.0.0.1:3839;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
  }
}

此外,该应用程序正在运行,并且可以在我的位置块中指定的端口上访问。我可以在卷曲为127.0.0.1:3839的计算机上毫无问题地到达它。我可以在/var/log/nginx/error.log中看到nginx试图处理/ usr / share / nginx / html /目录中的请求,这就是我发现问题所在的方式。我只是不知道为什么它在那里发送请求,而不是发送到我在位置块中指定的localhost上的端口。如果我转到应用程序的根URL,则会看到“欢迎使用NGINX”页面。如果我转到根URL下的任何子路径(例如example.com/login),则会得到404和error.log,例如,它找不到资源/ usr / share / nginx / html / login。谢谢:)

更新:

在我添加的listen 80服务器块内

location / { 
  proxy_pass http://127.0.0.1:3839; 
} 

现在它似乎可以正常工作,但是我不知道为什么如果要重定向另一个服务器定义侦听捕获的块中的请求,为什么我需要在监听80服务器定义中定义一个位置块在443上。知道为什么现在可以正常工作吗?

1 个答案:

答案 0 :(得分:0)

我弄清楚了http服务器定义中的位置块起作用的原因。在AWS中,我意外地使负载均衡器将所有请求转发到EC2实例上的端口80。因此,即使我的http服务器定义重定向到该站点的https版本,那些https请求仍最终由该相同的http服务器定义处理,并且由于它之前根本没有位置限制,因此导致了该请求失败。最后,我从http服务器定义中删除了位置块,然后正确更新了负载均衡器,以将https请求转发到EC2实例上的端口443,现在一切正常。