アプリケーション開発ポータルサイト
ServerNote.NET
カテゴリー【Node.jsJavaScriptApache
ファイアウォール内部のNode.js+Socket.ioを外部からProxyPassを通して使う
POSTED BY
2025-04-10

Node.jsにおいてhttpリクエストをexpress、データ通信をsocket.ioで受け付ける場合、localhostにサーバが立ち上がるが、外部からhttps通信によりアクセスしたい場合。

http://localhost:3000
ws://localhost:3000

を、外から

https://aaa.myserver333.jp/socket_test/
wss://aaa.myserver333.jp/socket_test/socket_io/

などとアクセスする。以下、設定

Apache2のconf

ProxyPass /socket_test/ http://localhost:3000/
ProxyPassReverse /socket_test/ http://localhost:3000/
ProxyPass /socket_test/socket.io/ ws://localhost:3000/socket.io/
ProxyPassReverse /socket_test/socket.io/ ws://localhost:3000/socket.io/

などとし、/etc/apache2/mods-enabled/{proxy_http.load, proxy_http2.load, proxy_wstunnel.load}を有効にする。

サーバーのNode.js側app.jsは変更必須なところはないが、ioを生成するところで

const io = new Server(server, {
  cors: {
    origin: '*', // セキュリティ強化したいなら正確なoriginを書く
    methods: ['GET', 'POST']
  }
})

としておくほうが無難

クライアント側ファイル置き場であるpublic/{client.js, index.html}はそれぞれ以下のように修正すればOK

client.js

const socket = io({
  path: '/socket_test/socket.io/'  // Apacheに合わせる
})

index.html

<script src="/socket_test/socket.io/socket.io.js"></script>

これで、app.jsの3000番がブラウザからアクセスできるようになる。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

【キーワード検索】