web-dev-qa-db-ja.com

Nodeアプリをポート80のPM2経由で実行中

ポート80で実行したいExpressがあります。-> app.listen(80);

_PM2_を使用してアプリを管理しています(再起動、停止、監視など)。最後のコマンドが_PM2 restart index_である展開シェルスクリプトがあります。コンソール出力からエラーが表示されず、_PM2_はコマンドが正常に完了したことを報告します。それでも、_my.ec2.ip.address:80_に到達したとき、サイトは稼働していません。さらに、サーバープロジェクトディレクトリで_node index.js_を実行すると、_Error: listen EACCES 0.0.0.0:80_が表示されます。これは、ポート80が1024未満であり、したがって特権ポートであるため、私にはある程度の意味があります。 _Sudo node index.js_を使用すると、起動が機能します。

私はunix、サーバー、アクセス許可、および展開の初心者なので、解決策に加えて、私の問題の原因となっている基本的な概念の説明をいただければ幸いです。たとえば、ノードアプリをスーパーユーザーとして実行するのは悪いことですか? _PM2_を実行するのは良い習慣ですか(したがって、ノードを実行している可能性があります..?)root/super-user?コマンド_Sudo PM2 restart index_は_Sudo: pm2: command not found_につながります。 _PM2_がパスにある場合、_Sudo PM2_を実行しても_PM2_が見つからないのはなぜですか?

結局のところ、_PM2_を使用する場合、サーバーがポート80で実行されるようにするにはどうすればよいですか?見つかりません。

9
Alex Bollbach

このコマンドを使用して、ポート80を使用せず、8080などの他のポートで実行し、80をそのポートにリダイレクトします。

  Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
7
Ashutosh Jha

誰かがあなたのプログラムを悪用した場合の潜在的な被害を制限したいので、できるだけ特権のあるユーザーとして実行しないことをお勧めします。 Nodeコードをrootとして実行するのは、絶対に必要な場合を除きます)。

したがって、Nodeプログラムを非特権ポート(たとえば、ポート8000​​)で実行し、代わりにNginxなどの軽量Webサーバーをポート80でリッスンして、トラフィックを単に=に転送することをお勧めします。 Nodeプログラム。

Nginxを使いたい場合は、この構成を使用して上記で説明したとおりに実行し、Nodeプログラムをポート3000でリッスンするだけです。

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

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $Host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-for $proxy_add_x_forwarded_for;
  }
}
4
Frxstrem

Nginxの設定に多くの時間を費やした後、最後にそれをアンインストールし、A.J。 iptablesを構成するための提案。ありがとうA.J.

Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

しかし、nginxを設定するための完璧なチュートリアルを知っている人がいれば、とても助かります。

1
Nagaraja Malla

私はubuntuサーバーについても同じ問題を抱えていました。以下のチュートリアルで修正されました。

Sudo apt-get install libcap2-bin
Sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

PM2の別のソリューションもここにあります

Sudo apt-get install authbind
Sudo touch /etc/authbind/byport/80
Sudo chown %user% /etc/authbind/byport/80
Sudo chmod 755 /etc/authbind/byport/80

https://pm2.keymetrics.io/docs/usage/specifics/#listening-on-port-80-w-o-root

0
siniradam

アプリのホームディレクトリにpm2 Ecosystem.config.jsファイルを設定します。

module.exports = {
  apps : [
      {
        name: "myapp",
        script: "./app.js",
        watch: true,
        env: {
            "PORT": 3000,
            "NODE_ENV": "development"
        },
        env_production: {
            "PORT": 3000,
            "NODE_ENV": "production",
        }
      }
  ]
}

コマンドラインでこれを行います:

pm2 start ecosystem.config.js --env <production or develoopment> 

ref: http://pm2.keymetrics.io/docs/usage/environment/

0
Isaac Pak

しかし、あなたは問題を解決したかもしれませんが、同じ問題に直面している人にとって、これは私に役立ちました:

単にトラブルシューティングを行うには、Sudo npm startを使用してアプリを実行します。アプリが正常に実行される場合は、authbindパッケージを使用してポート80をバインドする必要があります。次のコマンドを実行します。

Sudo apt-get install authbind
Sudo touch /etc/authbind/byport/80
Sudo chown %user% /etc/authbind/byport/80
Sudo chmod 755 /etc/authbind/byport/80

%user%を、pm2を実行するユーザーに置き換えます。鉱山はデフォルトでubuntuでした。

package.jsonファイルのstartコマンドをpm2 start <server_file_name>に設定します。 npm startを使用してアプリを実行します。それはうまくいくはずです!

0
John