Berpandukan ArchWiki

Assalamu’alaikum.

LEMP dalam catatan ini merangkumi empat komponen berikut:

  • L = Linux sebagai sistem operasi dan distro utama pembangunan web ;
  • E = nginx sebagai pelayan (server) web HTTP ;
  • M = MariaDB sebagai pelayan pangkalan data ; &
  • P = PHP sebagai bahasa skrip yang digunakan dalam pembangunan laman web dinamik.
"M" boleh juga merujuk kepada MySQL, manakala "P" boleh merujuk kepada bahasa lain seperti Python atau Perl dalam konteks tertentu.

Penulisan ini menghimpunkan konfigurasi tiga komponen penting dalam pembangunan aplikasi web dinamik (juga dikenali sebagai “back-end development”), iaitu Nginx, PHP dan MariaDB.

Pemasangan


Pasang pakej-pakej berikut:

bash
sudo pacman -S nginx-mainline mariadb php-fpm php-gd php-sqlite

Konfigurasi Nginx dan PHP


Tujuan konfigurasi ini adalah untuk membolehkan pelayan Nginx dijalankan sepenuhnya oleh pengguna biasa tanpa memerlukan keistimewaan root, termasuklah akses kepada direktori laman web dan fail log.

  1. Sunting fail konfigurasi nginx:

    /etc/nginx/nginx.conf
    #user http;
    worker_processes  auto;
    worker_cpu_affinity  auto;
    
    # Load all installed modules
    include modules.d/*.conf;
    
    events {
      worker_connections  1024;
    }
    
    
    http {
      charset  utf-8;
      sendfile  on;
      tcp_nopush  on;
      tcp_nodelay  on;
      server_tokens  off;
      log_not_found  off;
      types_hash_max_size  4096;
      server_names_hash_bucket_size  128;
      client_max_body_size  16M;
    
      # MIME
      include  mime.types;
      default_type  application/octet-stream;
    
      # Enable all configs from sites-enabled/
      include /etc/nginx/sites-enabled/*;
    
      # logging
      access_log  /var/log/nginx/_access.log;
      error_log  /var/log/nginx/_error.log warn;
    
      keepalive_timeout  65;
    }
  2. Tambahkan konfigurasi server :

    /etc/nginx/sites-available/localhost
    server {
      listen 80;
      server_name localhost;
    
      # Security Headers
      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
      add_header X-Frame-Options "SAMEORIGIN";
      add_header X-Content-Type-Options "nosniff";
      add_header Referrer-Policy "no-referrer-when-downgrade";
    
      root /home/<user>/webdev;
      index index.html index.htm;
    
      location ~ \.(php|html?|htm)$ {
        try_files $uri =404;
    
        # fastcgi settings
        include  fastcgi_params;
        fastcgi_pass  unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
    
        fastcgi_buffers  8 16k;
        fastcgi_buffer_size  32k;
    
        fastcgi_param  DOCUMENT_ROOT  $realpath_root;
        fastcgi_param  SCRIPT_FILENAME  $realpath_root$fastcgi_script_name;
      }
    
      # Avoid directory listing
      location / {
        try_files $uri $uri/ =404;
        autoindex off;
      }
    
      # redirect server error pages to the static page /50x.html
      error_page 500 502 503 504 /50x.html;
    
      error_log /var/log/nginx/localhost_error.log;
      access_log /var/log/nginx/localhost_access.log;
    }
    Direktori-direktori projek ditempatkan di $HOME/webdev. Gantikan <user> kepada nama pengguna pada baris root di bawah blok"server {".
  3. Aktifkan konfigurasi tersebut:

    /etc/nginx/nginx.conf
    sudo ln -s /etc/nginx/sites-available/localhost /etc/nginx/sites-enabled/
  4. Jalankan Nginx sebagai pengguna biasa.

    bash
    sudo mkdir /etc/systemd/system/nginx.service.d

    Tambah fail berikut:

    /etc/systemd/system/nginx.service.d/user.conf
    [Service]
    User=<user>
    Group=http
    NoNewPrivileges=yes
    CapabilityBoundingSet=
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE
    AmbientCapabilities=
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    
    RuntimeDirectory=nginx
    PIDFile=/run/nginx/nginx.pid
    ExecStart=
    ExecStart=/usr/bin/nginx -g 'pid /run/nginx/nginx.pid; error_log stderr;'
    ExecReload=
    ExecReload=/usr/bin/nginx -s reload -g 'pid /run/nginx/nginx.pid; error_log stderr;'
    
    StateDirectory=nginx
    LogsDirectory=nginx
    Tukarkan <user> kepada nama pengguna.
  5. Salin fail-fail HTML dari /usr/share/nginx/html ke dalam direktori $HOME/webdev.

  6. Mulakan servis.

    bash
    # Semak status fail konfigurasi
    sudo nginx -t
    
    # Jika konfigurasi berjaya, anda akan melihat mesej seperti ini:
    #nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    #nginx: configuration file /etc/nginx/nginx.conf test is successful
    
    sudo systemctl enable --now nginx
  7. Akses http://localhost/ dari pelayar untuk pengesahan.

  8. Konfigurasi PHP. Nyahkomen baris-baris di bawah:

    /etc/php/php.ini
    [PHP]
    display_errors = On
    ...
    extension=gd
    extension=mysqli
    extension=pdo_mysql
    extension=pdo_sqlite
    extension=sqlite3
    
    ...
    
    [Date]
    date.timezone = Asia/Kuala_Lumpur
  9. Nyahkomen dan sunting baris-baris dari fail berikut:

    /etc/php/php-fpm.d/www.conf
    [www]
    user = <user>
    group = http
    
    listen.owner = <user>
    listen.group = http
    security.limit_extensions = .php .html .htm
    Tukarkan <user> kepada nama pengguna.
  10. Buat fail info PHP:

    $HOME/webdev/info.php
    <?php phpinfo(); ?>
    
  11. Mulakan servis:

    bash
    sudo systemctl enable --now php-fpm 
  12. Layari: http://localhost/info.php

Konfigurasi MariaDB


Ikuti panduan rasmi MariaDB di ArchWiki. Langkau bab berkaitan keselamatan (bab 3.3 - 3.5) jika perlu.

Mulakan servis:

bash
sudo systemctl enable --now mariadb 

Konfigurasi Tambahan (Opsyenal)


  • Benarkan port 3306 untuk akses luar:
    bash
    sudo ufw allow 3306

Troubleshooting


  1. Jika root bermasalah, jalankan operasi berikut:

    bash
    sudo mariadb -uroot
    sql
    DROP USER 'root'@'localhost';
    CREATE USER 'root'@'localhost' IDENTIFIED BY 'new_password';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;
  2. Akses sebagai root:

    sudo mariadb -uroot -p
    

Tips Pengurusan Fail


  1. Tetapkan pemilikan direktori:

    bash
    sudo chown -R "$USER":http /home/<user>/webdev
  2. (Opsyenal) Tambah hak akses spesifik:

    bash
    sudo setfacl -R -m u:http:rwx /home/<user>/webdev

Alhamdulillah, selesai sudah konfigurasi pelayan LEMP secara lokal. Bolehlah bersedia membina laman web dan aplikasi menggunakan PHP dan MariaDB.

Sekian.


Kali terakhir dikemaskini:

Tentang Blog & Penulis

Topik perbincangan dalam blog ini merangkumi Linux & perisian sumber terbuka, Virtual Machine, serta Typesetting system.
Fokus semasa: Full Stack Development
Minat sampingan: Analisis Data
Bakat tersembunyi hamba: Menyanyi dan melukis.

Sumber dari Wallpaper Cave.