Setup Environment

Setup PHP on Nginx with fastCGI (PHP-FPM)

sudo apt-get update -y
sudo apt-get upgrade -y

sudo apt-get install nginx -y
sudo systemctl status nginx

sudo apt-get install php8.1-fpm -y
sudo systemctl status php8.1-fpm

sudo vim /etc/nginx/sites-available/default

server {
  # Example PHP Nginx FPM config file
  listen 80 default_server;
  listen [::]:80 default_server;
  root /var/www/html;

  # Add index.php to setup Nginx, PHP & PHP-FPM config
  index index.php index.html index.htm index.nginx-debian.html;

  server_name _;

  location / {
    try_files $uri $uri/ =404;
  }

  # pass PHP scripts on Nginx to FastCGI (PHP-FPM) server
  location ~ \.php$ {
    include snippets/fastcgi-php.conf;

    # Nginx php-fpm sock config:
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    # Nginx php-cgi config :
    # Nginx PHP fastcgi_pass 127.0.0.1:9000;
  }

  # deny access to Apache .htaccess on Nginx with PHP, 
  # if Apache and Nginx document roots concur
  location ~ /\.ht {
    deny all;
  }
} # End of PHP FPM Nginx config example
sudo nginx -t
sudo systemctl restart nginx

sudo chmod -R 777 /var/www/html
echo "<?php phpinfo(); ?>" >> /var/www/html/info.php
#check with localhost/info.php
  • Đầu tiên cần share thư mục trên máy host vào Ubuntu VM
  • Sau đó link từ thư mục đó trên máy host đến /var/www/html/index.php

ln -s /mnt/hgfs/share-folder/index.php /var/www/html/index.php

detail

Use Dockerfile

Nginx Dockerfile

  • Dockerfile
FROM nginx:alpine
COPY default.conf /etc/nginx/conf.d
# COPY /data /var/www/html
  • config file
server {
    listen 0.0.0.0:80;
    root /var/www/html;
    location / {
        index index.php index.html;
    }
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}

PHP Dockerfile

FROM php:fpm-alpine
# To connect to MySQL, add mysqli
RUN docker-php-ext-install mysqli pdo pdo_mysql
# COPY ./data /var/www/html

Docker compose

version: "3.8"
services:
  nginx:
    build: ./nginx
    ports:
      - "8080:80"
    volumes:
      - ./Share-Folder:/var/www/html
  php:
    build: ./php
    volumes:
      - ./Share-Folder:/var/www/html
# add Mysql 

Debugging PHP on Docker with VS Code

with Xdebug

ref

  • install ping: apt-get update && apt-get install -y iputils-ping
  • check port: netstat -an | find "9300"
  • launch.json:
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Listen for Xdebug",
            "type": "php",
            "request": "launch",
            "port": 9003,
            "pathMappings": {
                "/var/www/html": "d:/PHP/nginx-php-mysql/data"
            },
            "log": true
        },
    ]
}

Docker

  • nginx:
FROM nginx:alpine
COPY default.conf /etc/nginx/conf.d

  • default.conf:
server {
    listen 0.0.0.0:80;

    root /var/www/html;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
}

  • Php dockerfile:
FROM php:fpm
RUN pecl install xdebug
RUN docker-php-ext-enable xdebug

# Thêm cấu hình Xdebug vào php.ini
RUN echo "xdebug.mode=debug" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
    echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
    echo "xdebug.client_host=host.docker.internal" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
    echo "xdebug.client_port=9003" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini && \
    echo "xdebug.log=/tmp/xdebug.log" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

WORKDIR /var/www/html