ポート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で実行されるようにするにはどうすればよいですか?見つかりません。
このコマンドを使用して、ポート80を使用せず、8080などの他のポートで実行し、80をそのポートにリダイレクトします。
Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
誰かがあなたのプログラムを悪用した場合の潜在的な被害を制限したいので、できるだけ特権のあるユーザーとして実行しないことをお勧めします。 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;
}
}
Nginxの設定に多くの時間を費やした後、最後にそれをアンインストールし、A.J。 iptablesを構成するための提案。ありがとうA.J.
Sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
しかし、nginxを設定するための完璧なチュートリアルを知っている人がいれば、とても助かります。
私はubuntuサーバーについても同じ問題を抱えていました。以下のチュートリアルで修正されました。
Sudo apt-get install libcap2-bin
Sudo setcap cap_net_bind_service=+ep /usr/local/bin/node
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
アプリのホームディレクトリに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>
しかし、あなたは問題を解決したかもしれませんが、同じ問題に直面している人にとって、これは私に役立ちました:
単にトラブルシューティングを行うには、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
を使用してアプリを実行します。それはうまくいくはずです!