2017-05-03 9 views
2

ApacheアプリケーションとNginxをリバースプロキシとして使用するサービスでノードアプリケーションを実行しています。NginxをNode.js REST API用に正しく設定する方法は?

同じサーバー上に、ノードREST APIも実行されています。

次のようにJavaScriptコードが見えます:

index index.html index.htm; 

upstream api { 
    server 127.0.0.1:3000; 
} 

server { 
    listen 80; 
    server_name example.com; 
    return 301 https://$server_name$request_uri; 
} 

server { 
    listen 443; 
    root /var/www; 

    ssl on; 
    ssl_prefer_server_ciphers On; 
    ssl_protocols TLSv1.2; 
    ssl_session_cache shared:SSL:10m; 
    ssl_session_timeout 10m; 
    ssl_ciphers AES256+EECDH:AES256+EDH:!aNULL; 

    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"; 
    add_header X-Frame-Options DENY; 
    add_header X-Content-Type-Options nosniff; 

    ssl_dhparam /etc/nginx/ssl/dhparam.pem; 
    ssl_certificate /etc/letsencrypt/live/example.com/cert.pem; 
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 

    server_name example.com; 

    location/{ 
      proxy_pass http://127.0.0.1:8000; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      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 $scheme; 

    } 

    location /api { 
      proxy_pass http://api; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      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 $scheme; 
      rewrite ^/api/?(.*) /$1 break; 
      proxy_redirect off; 
    } 
} 
次のように

var models = require('../models'); 
var express = require('express'); 
var router = express.Router(); 

// get all users 
router.get('/users', function(req, res) { 
    models.Beekeeper.findAll({}).then(function(users) { 
    res.json(users); 
    }); 
}); 

module.exports = router; 

// Express 
const express = require('express'); 
const bodyParser = require('body-parser'); 
const cors = require('cors'); 

// Express App 
const app = express(); 

// Env 
const PORT  = process.env.PORT || 3000; 
const NODE_ENV = process.env.NODE_ENV || 'development'; 

// Config 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cors()); 

// Routes 
const users = require('./routes/users'); 

// Angular Http content type for POST etc defaults to text/plain at 
app.use(bodyParser.text(), function ngHttpFix(req, res, next) { 
    try { 
    req.body = JSON.parse(req.body); 
    next(); 
    } catch(e) { 
    next(); 
    } 
}); 

app.use('/api', users); 

app.listen(PORT, function() { 
    console.log('Listen on http://localhost:' + PORT + ' in ' + NODE_ENV); 
}); 

/routes/users.jsはnginxの構成が見え

api.jsを

Proble私の開発サーバー(例えば、localhost:3000/api/users)でAPI呼び出しを行うと、期待どおりに動作します。私は私の本番サーバー上でAPI呼び出しを行う場合

しかし、例えば、https://example.com/api/usersのために、私はそれぞれ、得ることができない/ユーザー404が見つからないを取得します。

Nginxの設定に何か問題があると思われますが、私は既にStackoverflowで同様の問題について他の多くの記事を読んでいますが、私は問題を解決できませんでした。

+0

「http:// api」を直接押すと、ブラウザに表示される内容は? –

+0

@FazalRaselあなたはhttps://example.com/apiを意味しますか? – mian

+0

いいえ、proxy_passは設定として 'http:// api'だけを呼び出します。私はその行を削除してhttps://example.com/api/usersを要求すると404 –

答えて

2

あなたがこれを要求していることに注意してください:

https://example.com/api/users 

しかし、エラーは、この意見:

だから/api接頭辞が取り除かれている/ユーザー

を取得することはできませんノード・サーバーに渡される前に要求パスをオフにします。この行によって行われ

rewrite ^/api/?(.*) /$1 break; 

策:その行を削除します。

+0

が返ってくると思います。404が見つかりませんでした。nginx/1.10.2は、APIにもう到達できません。 – mian

+0

非常に似たセットアップとそれは私のためにうまく動作します。 Expressサーバーがリクエストをログに記録しているのですか、NGINXがリクエストを渡していませんか? – robertklep

+1

あなたの答えはいいです、私はいくつかのデバッグを行って、私のORMが欠落している環境変数のためにエラーを投げたことがわかりました。混乱させて申し訳ありません。 – mian

関連する問題