Konfigurasi LEMP dalam Arch Linux
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.
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;
}
$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
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
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
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.Buat fail info PHP:
$HOME/webdev/info.php
<?php phpinfo(); ?>
Mulakan servis:
bash
sudo systemctl enable --now php-fpm
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
Jika gagal log masuk ke
MariaDB
sebagai penggunaroot
, besar kemungkinan akaunroot
telah terjejas oleh proses terdahulu, atauplugin 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;
Akses sebagai root:
sudo mariadb -uroot -p
Tips Pengurusan Fail
Tetapkan pemilikan direktori:
bash
sudo chown -R "$USER":http /home/<user>/webdev
(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.