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


Nginx


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.

nginx.conf

/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;
}

Buat Snippet untuk Konfigurasi Umum “Security Headers

/etc/nginx/snippets/security-headers.conf
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";

localhost.conf

/etc/nginx/sites-available/localhost.conf
server {
  listen 80;
  server_name localhost;

  # Security Headers 
  include snippets/security-headers.conf;

  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.

Aktifkan konfigurasi tersebut:

bash
sudo ln -s /etc/nginx/sites-available/localhost.conf /etc/nginx/sites-enabled/

user.conf

/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.
  • Salin fail-fail HTML dari /usr/share/nginx/html ke dalam direktori $HOME/webdev.

  • 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
  • Akses http://localhost/ dari pelayar untuk pengesahan.

PHP


  1. 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
  2. Konfigurasi PHP-FPM. 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
    listen.mode = 0660
    
    security.limit_extensions = .php .html .htm
    Tukarkan <user> kepada nama pengguna.
  3. Buat fail info PHP:

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

    bash
    sudo systemctl enable --now php-fpm 
  5. 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

Penyelesaian Masalah


  1. Jika gagal log masuk ke MariaDB sebagai pengguna root, besar kemungkinan akaun root telah terjejas oleh proses terdahulu, atau plugin unix_socket sedang digunakan bagi pengesahan. Isu ini boleh diselesaikan melalui langkah 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 dan 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.