こんにちは。よっしーです(^^)
今日は、nginx と php-fpm を UNIXドメインソケット で通信する方法についてご紹介します。
背景
Dockerで構築したslimアプリの開発環境において、nginx と php-fpm を UNIXドメインソケット で通信する方法に修正したときの方法を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
修正ファイル
下記のファイルを修正もしくは作成しました。
modified: app/compose.yml
modified: app/nginx/default.conf
new file: app/php-fpm/www.conf
app/compose.yml
@@ -22,6 +22,7 @@ services:
container_name: nginx
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
+ - php-fpm-socket:/var/run/php-fpm
ports:
- 8080:80
depends_on:
@@ -36,6 +37,8 @@ services:
- ./php-fpm/slim_app:/var/www/slim_app
- ./php-fpm/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
- ./php-fpm/xdebug:/tmp/xdebug
+ - ./php-fpm/www.conf:/usr/local/etc/php-fpm.d/zzz-www.conf
+ - php-fpm-socket:/var/run/php-fpm
networks:
- net
@@ -117,3 +120,6 @@ services:
networks:
net:
+
+volumes:
+ php-fpm-socket:
app/nginx/default.conf
@@ -21,7 +21,7 @@ server {
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_index index.php;
- fastcgi_pass php-fpm:9000;
+ fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
}
app/php-fpm/www.conf
[www]
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0666
動作確認
下記のコマンドを実施します。
# ビルド
make build
# 起動
make up
下記のコマンドを実施します。
curl -k https://localhost
下記のような出力になっていればOKです。
% curl -k https://localhost
Hello world!
解説
ソケット通信の確認
UNIXドメインソケットでリッスンしているかどうかを下記のコマンドで確認できます。
make login_php_fpm
apt install iproute2
ss -anp | grep php-fpm.sock
下記のような出力になっていればOKです。
root@2b3750f3c3ba:/var/www# ss -anp | grep php-fpm.sock
u_str LISTEN 0 4096 /var/run/php-fpm/php-fpm.sock 344024 * 0 users:(("php-fpm",pid=7,fd=8))
UNIXドメインソケット通信とは
UNIXドメインソケット通信は、UNIXまたはUNIX系のオペレーティングシステムで使用されるプロセス間通信(IPC)メカニズムの一つです。この方式は、ネットワークソケット通信(TCP/IPやUDPを使用する通信)とは異なり、同一のマシン上で動作するプロセス間でデータをやり取りするためのものです。UNIXドメインソケット通信は、性能とセキュリティの向上を提供することができ、さまざまなシナリオで利用されます。
UNIXドメインソケット通信の主な特徴と用途について説明します:
- ローカル通信:UNIXドメインソケットは、同じコンピュータ内で動作するプロセス間の通信に使用されます。通常、ネットワークを介した通信よりも高速で効率的です。例えば、ウェブサーバーとデータベースサーバー間の通信、またはローカルプロセス間でのコミュニケーションなどに使用されます。
- セキュリティ:UNIXドメインソケット通信は、通信のセキュリティを強化するために使用できます。通信はファイルシステムの権限に依存し、必要なプロセスのみがアクセスできるため、外部からのアクセスや攻撃を防ぐのに役立ちます。
- プログラム間通信:UNIXドメインソケットは、異なるプログラム間でのデータ共有や制御情報の受け渡しに使用できます。例えば、コントロールプロセスとデーモンプロセスの間での通信、またはプロセス間でのファイルデータの転送などがあります。
UNIXドメインソケット通信を使用するには、通信を確立するプロセスがソケットを作成し、ソケットファイルへのパスを指定します。通信を受けるプロセスも同じソケットファイルへのパスを指定してソケットに接続します。その後、双方向のデータ転送が可能となります。
プログラミング言語によってUNIXドメインソケットを使用する方法は異なりますが、C言語やPythonなどの多くの言語でサポートされています。通信の確立、データの送受信、接続の切断など、基本的なソケット操作を実行するためのAPIが提供されています。
UNIXドメインソケット通信は、高性能でセキュアなプロセス間通信の手段として非常に有用であり、多くのアプリケーションで活用されています。
おわりに
今日は、nginx と php-fpm を UNIXドメインソケット で通信する方法についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント