私は最初のNode.js
サーバーをcloud Linux node
上にセットアップしています、そして私はLinux admin
の詳細についてはかなり新しいです。 (ところで私は同時にApacheを使用しようとしていません。)
すべてが正しくインストールされていますが、root login
を使用しない限り、nodeでport 80
をリッスンすることはできません。しかし、セキュリティ上の理由から、rootとしては実行したくありません。
ベストプラクティスは次のとおりです。
ポート80のトラフィックを別のリスニングポートに転送する必要がありますか。
ありがとう
私のクラウドインスタンスで私がしていることは、このコマンドでポート80をポート3000にリダイレクトすることです。
Sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
その後、ポート3000でNode.jsを起動します。ポート80への要求はポート3000にマッピングされます。
/etc/rc.local
ファイルも編集して、その行からSudo
を引いたものを追加する必要があります。マシンが起動したときにリダイレクトが追加されます。 /etc/rc.local
にSudo
は必要ありません。システムの起動時に、そこにあるコマンドがroot
として実行されるからです。
Node.jsを起動するには、 forever モジュールを使用します。クラッシュした場合は再起動し、コンソールログをファイルにリダイレクトします。
Node.js起動スクリプトを、ポートリダイレクト用に編集したファイル/etc/rc.local
に追加します。システム起動時にNode.js起動スクリプトが実行されます。
これは、Linodeだけでなく、Digital Ocean、AWS EC2、およびその他のVPSプロバイダーにも適用されます。ただし、RedHatベースのシステムでは/etc/rc.local
は/ect/rc.d/local
です。
ポート80を使用するための安全なユーザー許可を与える
覚えておいて、私たちはあなたのアプリケーションをrootユーザーとして実行したくない、しかしヒッチがあります:あなたの安全なユーザーはデフォルトのHTTPポート(80)を使う許可を持っていません。あなたの目標は、訪問者が使用できるWebサイトを、http://ip:port/
のような使いやすいURLに移動して公開できるようにすることです。
残念ながら、rootとしてサインオンしない限り、通常はhttp://ip:port
のようなURLを使用する必要があります - ポート番号> 1024。
多くの人がここで立ち往生しますが、解決策は簡単です。いくつかの選択肢がありますが、これは私が好きなものです。次のコマンドを入力してください。
Sudo apt-get install libcap2-bin
Sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``
これで、Node 80アプリケーションをポート80で実行するように指示しても、文句は言われません。
これをチェックしてください 参照リンク
ポート80(または443)にバインドした後にroot権限を削除します。
これにより、ポート80/443を保護したままにしながら、rootとして要求を処理できないようにすることができます。
function drop_root() {
process.setgid('nobody');
process.setuid('nobody');
}
上記の関数を使用した完全な動作例
var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
res.write("Success!");
res.end();
});
server.listen(80, null, null, function() {
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
drop_root();
console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});
詳細はこちら のフルリファレンス をご覧ください。
ポート80(これは最初の質問でした)に関しては、ダニエルはまさに正しいです。私は最近https
に移行し、iptables
からSSL証明書を管理する軽量のnginxプロキシに切り替える必要がありました。 answer と gabrielhpugliese による Gist とそれをどのように処理するかについて私は見つけました。基本的に私は
SSL証明書署名要求(CSR)を作成しました による OpenSSL
openssl genrsa 2048 > private-key.pem
openssl req -new -key private-key.pem -out csr.pem
/etc/nginx/conf.d/example_ssl.conf
のlocation
を に変更
location / {
proxy_pass http://localhost:3000;
proxy_set_header X-Real-IP $remote_addr;
}
個々の証明書を一緒にcat
してnginxの証明書をフォーマットし、それを私のnginx example_ssl.conf
ファイルでリンクしました(そして名前の中の 'example'を取り除きました、...)。
ssl_certificate /etc/nginx/ssl/cert_bundle.cert;
ssl_certificate_key /etc/nginx/ssl/private-key.pem;
うまくいけば、それは他の誰かにいくつかの頭痛を救うことができます。これを行うための純粋なノードの方法があると確信していますが、nginxは速くてうまくいきました。
Linodeはあなたがマシンのためにポートを開かなければならないところにある「前壁」あるいはファイアウォールを提供しますか?たぶんそれはすべてのマシン上でルーティングするよりも良い解決策を見つけるための良い場所でしょうか? Azureにサーバーを展開するときは、いわゆるエンドポイントを定義する必要があります。エンドポイントには、パブリックポート、プライベートポート(マシン上)、およびプロトコル(TCP/UDP)が含まれています。あなたがサーバーのポート3000でアプリを実行しているのであれば、それはポート80で到達可能であり、ルーティングはマシンではなくプラットフォームによって行われます。エンドポイントにACLを設定することもできます。