Nginx unable to serve the node.js POST requests

放肆的年华 提交于 2019-12-12 05:24:32

问题


I've a VM Ubuntu15.04 server and I've configured nginx to listen requests on port 80 and forward them to respective applications on different ports. I have a simple node.js service running over port 3000 which has one GET and POST service. I have started it by using PM2 and added a proxy_pass to localhost:3000/ in my nginx default conf. The problem is when i try to use a GET request it is working fine but in case of POST it is showing 404 error. I've tried to use the POST service through postman client.

This is my default conf file of nginx

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a   clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

upstream my_nodejs_upstream {
server 127.0.0.1:3000;
keepalive 64;                                                         
}

server {
listen 80 default_server;
listen [::]:80 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    root /var/www/face_rec/ServerTest;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    server_name localhost;

    location / {
            # First attempt to serve request as file, then
            # as directory, then fall back to displaying a 404.
            try_files $uri $uri/ =404;

    proxy_pass http://localhost:3000;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-Proto $scheme;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #       include snippets/fastcgi-php.conf;
    #
    #       # With php5-cgi alone:
    #       fastcgi_pass 127.0.0.1:9000;
    #       # With php5-fpm:
    #       fastcgi_pass unix:/var/run/php5-fpm.sock;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #       deny all;
    #}}
  # Virtual Host configuration for example.com
  #
  # You can move that to a different file under sites-available/ and symlink 
  that
  # to sites-enabled/ to enable it.
  #
  #server {
  #       listen 80;
  #       listen [::]:80;

  #       server_name example.com;

  #       root /var/www/example.com;
  #       index index.html;

  #       location / {
  #               try_files $uri $uri/ =404;
  #       }
  #}

Any reference, tutorial, suggestions or solutions please let me know how to do it.


回答1:


Using try_files and proxy_pass in the same location block is probably not going to work.

If you want nginx to test for the presence of a static file and proxy everything else, use a named location:

root /path/to/root;
location / {
    try_files $uri $uri/ @proxy;
}
location @proxy {
    proxy_pass ...;
    ...
}

Test the configuration using nginx -t as your question appears to be missing a closing }.

See this document for details.




回答2:


It's impossible to tell you what's wrong with your code if you didn't include even a single line of your Node program that your question is about.

Also "404 error" is not enough to know what's wrong because nginx shows a different error message than Express and knowing the exact message would let us know where the error originated.

What you should do is first to make sure that both your GET and POST handlers are working correctly by using:

curl -v http://localhost:3000/your/get/path

and:

curl -v -X POST -d 'somedata' http://localhost:3000/your/post/path

from the same host where your app is running.

Then add the nginx proxy, restart nginx to make sure that the config is reloaded, and do the same with port 80. If anything is different then work from there and diagnose the difference.

But if the POST handler doesn't work on localhost:3000 then you first need to fix that.



来源:https://stackoverflow.com/questions/43586112/nginx-unable-to-serve-the-node-js-post-requests

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!