Cara menggunakan docker php fpm max_execution_time

TeknoCerdas.com – Salam cerdas untuk kita semua. Untuk menjalankan PHP pada Nginx umumnya digunakan PHP-FPM sebagai FastCGI process manager. ngx_php adalah sebuah modul Nginx untuk menjalankan PHP secara langsung. Sebuah alternatif baru dalam menjalankan PHP dengan Nginx. Dengan modul ngx_php maka pengguna dapat melakukan embed script PHP langsung di Nginx. Sehingga tanpa PHP-FPM pun kode PHP dapat berjalan pada Nginx.

Solusi yang dihadirkan oleh ngx_php sebagai modul Nginx, mirip dengan apa yang dilakukan mod_php pada Apache server. mod_php adalah cara paling populer menjalan PHP dengan Apache selama puluhan tahun. Modul ngx_php mencoba menawarkan cara yang sama pada Nginx.

Secara teori harusnya modul ngx_php pada Nginx lebih cepat dari mod_php karena penggunaan arsitektur event-driven pada Nginx dibandingkan penggunaan thread pada Apache.

Daftar Isi

Persiapan Menajalankan ngx_php

Pada artikel ini TeknoCerdas mengasumsikan bahwa anda telah memahami beberapa hal berikut.

  • Memiliki pemahaman dasar tentang Docker
  • Memiliki pemahaman dasar tentang PHP
  • Memiliki pemahaman dasar tentang Nginx

Jika anda tidak memiliki pengetahuan tentang beberapa hal diatas, tetap saja lanjutkan membaca. Karena mungkin ada informasi baru yang berguna bagi anda.

Instalasi ngx_php Lewat Docker

Ada banyak cara melakukan instalasi ngx_php namun pada artikel ini TeknoCerdas akan menggunakan Docker untuk menjalankan ngx_php. Instalasi ngx_php dilakukan dengan melakukan kompilasi Nginx dari kode sumber.

Versi yang akan digunakan.

  • OS Ubuntu 20.04
  • Nginx v1.19.2
  • PHP v7.4
  • ngx_php v0.0.24 untuk PHP 7

Buat sebuah direktori untuk pengerjaan instalasi ini. Sebagai contoh TeknoCerdas akan menggunakan nama direktori

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
2.

$ mkdir ngx-php-module
$ cd ngx-php-module

Kemudian buat Dockerfile yang berisi kompilasi Nginx dengan modul ngx_php. Berikut ini adalah isi dari

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
3.

$ vi Dockerfile
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf

Pertama kita akan melakukan build sebuah docker image dari

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
3 yang sudah dibuat sebelumnya. Image hasil build akan diberi nama
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
5 dengan tag versi
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
6 yang menandakan PHP 7. Base image yang digunakan adalah dari Ubuntu 20.04.

$ sudo docker build -t ngx-php:7

Setelah proses build selesai, cek daftar Docker image yang ada pada local komputer.

$ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ngx-php             7                   be17ca455a9a        12 hours ago        693MB
ubuntu              20.04               9140108b62dc        11 days ago         72.9MB

Dapat terlihat bahwa image untuk ngx_php sudah berhasil dibuat.

Membuat Konfigurasi ngx_php

Setelah modul ngx_php terinstal pada Nginx akan ada beberapa directive baru yang bisa digunakan untuk menjalankan PHP. Pada contoh ini TeknoCerdas akan membuat empat routing untuk pemrosesan file PHP.

  • Routing
    FROM ubuntu:20.04
    
    ARG DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
    RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
    RUN apt-get update -yqq > /dev/null && \
        apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                        zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                        php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null
    
    ADD ./ ./
    
    ENV NGINX_VERSION=1.19.2
    
    RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null
    
    RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
        tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
        cd nginx-${NGINX_VERSION} && \
        export PHP_LIB=/usr/lib && \
        ./configure --user=www --group=www \
                --prefix=/nginx \
                --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
                --add-module=/ngx_php7/third_party/ngx_devel_kit \
                --add-module=/ngx_php7 > /dev/null && \
        make > /dev/null && make install > /dev/null
    
    CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
    7 akan mengembalikan sebuah pesan “Hello World!” dalam bentuk
    FROM ubuntu:20.04
    
    ARG DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
    RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
    RUN apt-get update -yqq > /dev/null && \
        apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                        zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                        php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null
    
    ADD ./ ./
    
    ENV NGINX_VERSION=1.19.2
    
    RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null
    
    RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
        tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
        cd nginx-${NGINX_VERSION} && \
        export PHP_LIB=/usr/lib && \
        ./configure --user=www --group=www \
                --prefix=/nginx \
                --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
                --add-module=/ngx_php7/third_party/ngx_devel_kit \
                --add-module=/ngx_php7 > /dev/null && \
        make > /dev/null && make install > /dev/null
    
    CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
    8.
  • Routing
    FROM ubuntu:20.04
    
    ARG DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
    RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
    RUN apt-get update -yqq > /dev/null && \
        apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                        zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                        php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null
    
    ADD ./ ./
    
    ENV NGINX_VERSION=1.19.2
    
    RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null
    
    RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
        tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
        cd nginx-${NGINX_VERSION} && \
        export PHP_LIB=/usr/lib && \
        ./configure --user=www --group=www \
                --prefix=/nginx \
                --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
                --add-module=/ngx_php7/third_party/ngx_devel_kit \
                --add-module=/ngx_php7 > /dev/null && \
        make > /dev/null && make install > /dev/null
    
    CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
    9 akan mengembalikan sebuah string JSON dengan isi
    $ sudo docker build -t ngx-php:7
    0 dalam bentuk
    $ sudo docker build -t ngx-php:7
    1.
  • Routing
    $ sudo docker build -t ngx-php:7
    2 akan mengembalikan tanggal dan jam hari ini dalam bentuk
    $ sudo docker build -t ngx-php:7
    3.
  • Routing
    $ sudo docker build -t ngx-php:7
    4 akan mengembalikan halaman hasil dari fungsi
    $ sudo docker build -t ngx-php:7
    5 dalam bentuk
    $ sudo docker build -t ngx-php:7
    3.

Membuat nginx_default.conf

Masih dalam direktori kerja yang sekarang, buat sebuah direktori baru bernama deploy.

$ mkdir deploy

Buat sebuah file

$ sudo docker build -t ngx-php:7
7 untuk konfigurasi Nginx dan ngx_php dalam menjalankan PHP secara langsung.

$ vi deploy/nginx_default.conf
user www-data;
worker_cpu_affinity auto;
worker_processes  auto;
error_log /dev/stdout error;
timer_resolution 1s;
daemon off;
pid /run/nginx.pid;
pcre_jit on;

events {
    worker_connections 100000;
    multi_accept off;
}

http {
    #include       /etc/nginx/mime.types;
    access_log off;
    server_tokens off;
    msie_padding off;

    sendfile off;
    tcp_nopush off;
    tcp_nodelay on;
    keepalive_timeout 65s;
    keepalive_disable none;
    keepalive_requests 100000;

    php_ini_path /deploy/php.ini;

    server {
        listen       *:8080 backlog=65535 reuseport;

        root /;
        index  index.html;

        php_keepalive 256;

        location = /text {
            content_by_php_block {
                ngx_header_set('Content-Type', 'text/plain');
                echo 'Hello, World!';
            }
        }

        location = /json {
            content_by_php_block {
                ngx_header_set('Content-Type', 'application/json');
                echo json_encode(['message' => 'Hello, World!']);
            }
        }

        location = /html {
            content_by_php_block {
                require '/deploy/today.php';
            }
        }

        location = /info {
            content_by_php_block {
                ngx_header_set('Content-Type', 'text/html; charset=UTF8');
                phpinfo();
            }
        }
    }
}

Dapat terlihat pada contoh konfigurasi Nginx diatas. Empat routing yang disebutkan sebelumnya menggunakan directive baru yaitu

$ sudo docker build -t ngx-php:7
8. Ini adalah satu diantara banyak directive yang disediakan oleh modul ngx_php.

Fungsi dari directive baru tersebut adalah untuk melakukan interpretasi atau eksekusi kode PHP yang ada dalam blok

$ sudo docker build -t ngx-php:7
9. Sebagai contoh pada routing
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
9, pada blok tersebut dipanggil sebuah fungsi dari PHP yaitu
$ sudo docker image ls
1.

Intinya kode PHP yang valid akan dapat dieksekusi oleh blok directive

$ sudo docker build -t ngx-php:7
8. Fungsi
$ sudo docker image ls
3 adalah fungsi yang disediakan oleh ngx_php untuk melakukan modifikasi HTTP header.

Membuat php.ini

Konfigurasi ini sebenarnya opsional, jika konfigurasi ini tidak dibuat maka PHP akan menggunakan default value.

Masih pada direktori kerja yang sama, sekarang buat sebuah file bernama

$ sudo docker image ls
4 yang berisi konfigurasi untuk PHP runtime. Konfigurasi ini akan dibaca oleh ngx_php menggunakan directive
$ sudo docker image ls
5.

$ vi deploy/php.ini
$ vi Dockerfile
0

Membuat file today.php

File

$ sudo docker image ls
6 digunakan untuk mendemonstrasikan penggunakan
$ sudo docker image ls
7 atau
$ sudo docker image ls
8 pada directive
$ sudo docker image ls
9. Dimana pada routing
$ sudo docker build -t ngx-php:7
2 ngx_php akan memproses file
$ sudo docker image ls
6 menggunakan
$ sudo docker image ls
8.

File akan menampilkan sebuah halaman HTML yang berisi tanggal dan jam hari ini yang digenerate secara dinamis oleh PHP.

$ vi Dockerfile
1
$ vi Dockerfile
2

Melakukan Tes ngx_php

Pastikan masih berada pada direktori kerja yang sama. Direktori

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ngx-php             7                   be17ca455a9a        12 hours ago        693MB
ubuntu              20.04               9140108b62dc        11 days ago         72.9MB
3 akan dimount ke dalam container dengan lokasi
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ngx-php             7                   be17ca455a9a        12 hours ago        693MB
ubuntu              20.04               9140108b62dc        11 days ago         72.9MB
4.

$ vi Dockerfile
3

Pastikan container telah berjalan dengan perintah

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ngx-php             7                   be17ca455a9a        12 hours ago        693MB
ubuntu              20.04               9140108b62dc        11 days ago         72.9MB
5.

$ vi Dockerfile
4
$ vi Dockerfile
5

Sekarang container yang berisi Nginx dengan modul ngx_php sudah berjalan. Lakukan tes satu-per-satu untuk setiap routing yang dibuat. Dimulai dengan routing

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
7.

$ vi Dockerfile
6
$ vi Dockerfile
7

Hasilnya sesuai yang diinginkan. HTTP header

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ngx-php             7                   be17ca455a9a        12 hours ago        693MB
ubuntu              20.04               9140108b62dc        11 days ago         72.9MB
7 dan HTTP body sesusai.

Lanjut ke routing yang kedua yaitu

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
9 dimana harusnya
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ngx-php             7                   be17ca455a9a        12 hours ago        693MB
ubuntu              20.04               9140108b62dc        11 days ago         72.9MB
7 berisi
$ sudo docker build -t ngx-php:7
1 dan HTTP body berisi JSON object.

$ vi Dockerfile
8
$ vi Dockerfile
9

Bagus. Hasilnya juga sesuai. Berikutnya adalah routing

$ sudo docker build -t ngx-php:7
2. Content-type yang dikembalikan harusya adalah
$ sudo docker build -t ngx-php:7
3 dan berisi halaman HTML dari tanggal dan jam sekarang.

FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
0
FROM ubuntu:20.04

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null
RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null
RUN apt-get update -yqq > /dev/null && \
    apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \
                    zlibc zlib1g zlib1g-dev libpcre3 libpcre3-dev libargon2-0-dev libsodium-dev \
                    php7.4 php7.4-common php7.4-dev libphp7.4-embed php7.4-mysql nginx > /dev/null

ADD ./ ./

ENV NGINX_VERSION=1.19.2

RUN git clone -b v0.0.24 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null

RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \
    tar -zxf nginx-${NGINX_VERSION}.tar.gz && \
    cd nginx-${NGINX_VERSION} && \
    export PHP_LIB=/usr/lib && \
    ./configure --user=www --group=www \
            --prefix=/nginx \
            --with-ld-opt="-Wl,-rpath,$PHP_LIB" \
            --add-module=/ngx_php7/third_party/ngx_devel_kit \
            --add-module=/ngx_php7 > /dev/null && \
    make > /dev/null && make install > /dev/null

CMD /nginx/sbin/nginx -c /deploy/nginx_default.conf
1

Dapat dilihat bahwa hasilnya sesuai dengan apa yang ditulis pada file

$ sudo docker image ls
6. Routing terakhir yaitu
$ sudo docker build -t ngx-php:7
4 berisi tentang informasi PHP yang digunakan. Pada routing ini gunakan web browser untuk mendapatkan tampilan yang mudah dilihat.

Buka halaman

$ mkdir deploy
5 pada web browser, tampilan harusnya mirip dengan gambar dibawah.

Cara menggunakan docker php fpm max_execution_time
Menjalankan phpinfo() dari ngx_php

Kekurangan ngx_php

Menurut dokumentasi resmi dari ngx_php terdapat beberapa kekurangan dibandingkan dengan metode tradisional dalam menjalankan PHP.

  • Global variabel tidak bekerja semestinya ($_GET, $_POST dll)
  • Static variabel pada class tidak aman digunakan.
  • Kode dengan desain Singleton tidak aman digunakan.
  • I/O pada PHP berfungsi normal tapi akan memperlambat Nginx.

Jika melakukan pengembangan menggunakan ngx_php maka harus memikirkan dari awal kekurangan diatas. Sebagai contoh kode yang bergantung pada

$ mkdir deploy
6 harus diubah atau memasang bootstrap file khusus untuk melakukan parsing mandiri query string. Hasilnya gunakan untuk melakukan override variabel
$ mkdir deploy
6.

Share

  • Programming
  • #nginx
  • #ngx_php
  • #php
  • #php-fpm

Cara menggunakan docker php fpm max_execution_time

Rio Astamal Follow Adalah penulis utama di TeknoCerdas.com. Rio Astamal seorang yang sangat antusias dengan web development sejak 2003. Sejak November 2021 Rio Astamal bekerja di Amazon Web Services (AWS) sebagai Developer Advocate untuk Indonesia. Dia mengelola TeknoCerdas.com di waktu senggangnya sebagai salah satu sarana untuk ikut mencerdaskan pembaca dalam dunia IT.