まずはメンテナンス性の確保のためにオレオレフレームワークからLaravelに載せ替える。
また、1台サーバーを使用して動かしていたが、あまり大きなアプリではないので、kubernetesで動作させることにします。
そして合わせて将来的な技術投資としてWebサーバーをApacheからnginx + FastCGI Process Manager(FPM)を試してみることにしました。
その際のdokcerとkubernetesの設定の備忘録になります。
nginxのconfファイルの作成
まずはLaravelとphp-fpm用にしたnginxのconfファイルを作成。default.conf
server { listen 80; listen [::]:80; server_name example.com; access_log /var/log/nginx/host.access.log; error_log /var/log/nginx/host.error.log; location / { root /usr/share/nginx/html; index index.php index.html index.htm; # リクエストされたファイルが存在しなければ、Laravelのフロントコントローラーに内部リダイレクトさせる try_files $uri /index.php?$query_string; } # 400番台のエラーページの設定 error_page 404 /404.html; # 500番台のエラーページの設定 # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # Apacheの設定なので今回はコメントアウトのまま # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # FastCGIの設定 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { # Laravelのルートディレクトリ root /var/www/html/public; # nginxからphp-fpmに受け渡すIPアドレスとポート番号の設定 fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; # 全てのリクエストをLaravelのフロントコントローラーで実行させる fastcgi_param SCRIPT_FILENAME $document_root/index.php; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }ここでの注意点はnginxからphp-fpmに受け渡すIPアドレスとポート番号の設定
ローカル環境で動作させる場合はdokcerのphp-fpmのコンテナを指定してください。
fastcgi_pass php-fpm:9000;kubernetesで動作させる場合は1pod内でnginxのコンテナとphp-fpmのコンテナを動作させるため
127.0.0.1:9000
で受け取ることができますnginxのDockerfileの作成
Docker Hubから最新のものを使用。Dockerfile
FROM nginx:1.23.3 COPY docker/nginx/default.conf /etc/nginx/conf.d/default.conf EXPOSE 80 443 STOPSIGNAL SIGQUIT CMD ["nginx", "-g", "daemon off;"]
php-fpmのDockerfileの作成
こちらもDocker Hubから最新のものを使用。注意点はnginxがアクセスできるようにLaravelのプロジェクトを配置しているディレクトリの所有ユーザーを変更すること。
アクセスしてくるのはnginxなので所有ユーザーを
www-data
に変更しておかないと404エラーになります。Dockerfile
FROM php:8.1.16-fpm #PHPの拡張機能のインストール RUN apt update \ && apt install -y libonig-dev libxml2-dev libcurl4-openssl-dev libssl-dev libzip-dev \ && docker-php-ext-install pdo pdo_mysql mysqli simplexml curl phar zip ftp \ && pecl install xdebug redis \ && docker-php-ext-enable xdebug redis # nginxがアクセスできるように所有ユーザーを変更 COPY project /var/www/html RUN chown -R www-data:www-data /var/www/html EXPOSE 9000 ENTRYPOINT ["docker-php-entrypoint"] CMD ["php-fpm"]
kubernetesの設定の作成
kubernetesに反映させるdeployment、service、ingressを作成します。deployment.yaml
1pod内で動作させるためcontainersにnginxとphp-fpmのコンテナを記載します。
apiVersion: apps/v1 kind: Deployment metadata: name: example-deployment labels: app: example spec: replicas: 1 selector: matchLabels: app: example template: metadata: labels: app: example spec: containers: - image: php-fpm:latest name: example-php-fpm ports: - containerPort: 9000 protocol: TCP - image: nginx:latest name: example-nginx ports: - containerPort: 80 protocol: TCPservice.yaml
外からのアクセスはnginxが受けるのでポートは80番。
kind: Service apiVersion: v1 metadata: name: example-service spec: type: NodePort selector: app: example ports: - port: 80 targetPort: 80 protocol: TCPingress.yaml
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: example-service port: number: 80
kubernetesに反映を実行。 これで動作できました。