Topik ini memandu Anda dalam membangun stack LNMP (Linux, Nginx, MySQL, PHP) pada Instance Elastic Compute Service (ECS) menggunakan manajer paket. Solusi ini mendukung berbagai sistem operasi, termasuk Alibaba Cloud Linux, CentOS, dan Ubuntu. Deployment manual memungkinkan Anda mengatasi keterbatasan citra prakonfigurasi yang sering menyulitkan penyesuaian file konfigurasi, sekaligus memberikan kontrol penuh atas lingkungan dasar dan memungkinkan penguatan keamanan guna memenuhi persyaratan produksi untuk situs web dinamis seperti WordPress dan Magento.
Solution architecture
|
Procedure
Untuk pengalaman yang lancar, kami merekomendasikan Instance ECS dengan memori minimal 2 GiB.
Step 1: Prepare the instance
Konfigurasikan Alamat IP publik dan security group agar instans dapat diakses dari internet, serta perbarui komponen sistem untuk memperbaiki potensi kerentanan keamanan.
Konfigurasikan akses jaringan publik.
Pastikan Instance ECS Anda memiliki Alamat IP publik yang ditetapkan atau Elastic IP Address (EIP) yang terikat padanya. Untuk petunjuk lengkap, lihat Configure public bandwidth.
Tambahkan aturan security group.
Pada security group yang terkait dengan Instance ECS Anda, tambahkan aturan masuk untuk mengizinkan traffic pada Port TCP 80 (untuk akses HTTP). Untuk petunjuk lengkap, lihat Add a security group rule.
Perbarui komponen sistem dan paket perangkat lunak.
Alibaba Cloud Linux 3 / CentOS 8
Login ke Instance ECS.
Buka ECS console - Instances. Pada bilah navigasi atas, pilih Wilayah dan kelompok sumber daya yang dituju.
Buka halaman detail instans. Klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login dan membuka terminal.
Perbarui indeks paket dan tingkatkan semua paket ke versi terbaru.
sudo dnf update -y
Alibaba Cloud Linux 2 / CentOS 7
Login ke Instance ECS.
Buka ECS console - Instances. Pada bilah navigasi atas, pilih Wilayah dan kelompok sumber daya yang dituju.
Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login dan membuka terminal.
Perbarui semua paket ke versi terbaru.
sudo yum update -y
Ubuntu
Login ke Instance ECS.
Buka ECS console - Instances. Pada bilah navigasi atas, pilih Wilayah dan kelompok sumber daya yang dituju.
Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login dan membuka terminal.
Perbarui semua paket ke versi terbaru.
sudo apt update -y && sudo apt upgrade -y
Step 2: Install and configure Nginx
Tambahkan repositori resmi Nginx dan instal Nginx.
Alibaba Cloud Linux 3 / CentOS 8
# Tambahkan repositori resmi Nginx. sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF' [nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/8/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF # Instal Nginx. sudo dnf -y install nginxAlibaba Cloud Linux 2 / CentOS 7
# Tambahkan repositori resmi Nginx. sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF' [nginx-stable] name=nginx stable repo baseurl=https://nginx.org/packages/centos/7/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true EOF # Instal Nginx. sudo yum -y install nginxUbuntu
# Instal dependensi Nginx. sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring # Impor kunci tanda tangan resmi Nginx untuk memverifikasi sumber paket. curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null # Siapkan repositori APT untuk Nginx. echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list # Instal Nginx. sudo apt update sudo apt install -y nginxJalankan Nginx dan aktifkan agar otomatis berjalan saat boot.
Flag
enable --nowmenjalankan layanan segera sekaligus mengaktifkannya saat boot.sudo systemctl enable --now nginxVerifikasi layanan Nginx.
Jalankancurl http://127.0.0.1. Jika terminal menampilkan kode HTML halaman selamat datang Nginx, instalasi berhasil.
Step 3: Install and harden MySQL
Instal dan jalankan MySQL.
Alibaba Cloud Linux 3 / CentOS 8
# Alibaba Cloud Linux 3 memerlukan compat-openssl10 untuk kompatibilitas dengan versi OpenSSL lama. if [ -f /etc/os-release ]; then . /etc/os-release if [ "$ID" = "alinux" ] && [ "$VERSION_ID" = "3" ]; then sudo yum install -y compat-openssl10 fi fi # Tambahkan repositori YUM untuk MySQL 8.4. sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm # Instal layanan MySQL. sudo dnf install -y mysql-serverAlibaba Cloud Linux 2 / CentOS 7
# Tambahkan repositori untuk MySQL 8.4. sudo rpm -Uvh https://repo.mysql.com/mysql84-community-release-el7-1.noarch.rpm # Instal layanan MySQL. sudo yum install -y mysql-serverUbuntu
# Repositori default Ubuntu sudah menyertakan MySQL, sehingga Anda dapat menginstalnya langsung. # Ubuntu 20.04 dan versi setelahnya menginstal MySQL 8.0 secara default. # Ubuntu 18.04 dan versi sebelumnya menginstal MySQL 5.x secara default. sudo apt install -y mysql-serverJalankan MySQL dan aktifkan agar otomatis berjalan saat boot.
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now mysqldUbuntu
sudo systemctl enable --now mysqlLakukan penguatan keamanan.
Konfigurasi default MySQL tidak aman karena mengizinkan pengguna anonim dan login root dari jarak jauh. Jalankan skrip keamanan bawaan untuk mengatasi kerentanan ini.
Dapatkan kata sandi root awal.
Langkah ini hanya berlaku untuk Alibaba Cloud Linux/CentOS, karena Ubuntu menggunakan autentikasi tanpa kata sandi secara default. Gunakan kata sandi sementara ini pada langkah berikutnya untuk mengatur ulang kata sandi root.
# Ekstrak dan tampilkan kata sandi sementara dari log. sudo grep 'temporary password' /var/log/mysqld.logJalankan skrip penguatan keamanan.
Jalankan perintah
sudo mysql_secure_installationdan ikuti prompt untuk menyelesaikan konfigurasi yang direkomendasikan:Atur ulang kata sandi root: Gunakan kata sandi sementara dari langkah sebelumnya untuk login dan menetapkan kata sandi baru.
Kami merekomendasikan penggunaan kata sandi kuat yang terdiri dari minimal 12 karakter serta mencakup huruf besar, huruf kecil, angka, dan simbol khusus.
Hapus pengguna anonim: Masukkan Y.
Larang login root dari jarak jauh: Masukkan Y.
Hapus database uji coba: Masukkan Y.
Muat ulang tabel hak istimewa: Masukkan Y.
Step 4: Install and configure PHP
Instal PHP, PHP-FPM (untuk menangani permintaan web), dan driver MySQL.
Tambahkan repositori PHP dan instal PHP.
Alibaba Cloud Linux 3 / CentOS 8
# Tambahkan repositori PHP. cat > /etc/yum.repos.d/remi.repo << 'EOF' [remi] name=Remi\'s RPM Repository for Enterprise Linux 8 - x86_64 baseurl=https://rpms.remirepo.net/enterprise/8/remi/x86_64/ enabled=1 gpgcheck=1 gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024 [remi-safe] name=Remi Safe Repository baseurl=https://rpms.remirepo.net/enterprise/8/safe/x86_64/ enabled=1 gpgcheck=1 gpgkey=https://rpms.remirepo.net/RPM-GPG-KEY-remi2024 EOF # Impor Kunci GPG. rpm --import https://rpms.remirepo.net/RPM-GPG-KEY-remi2024 # Instal tool dan aktifkan modul. dnf install -y yum-utils # Instal PHP. dnf install -y php php-fpm php-mysqlndAlibaba Cloud Linux 2 / CentOS 7
# Instal repositori Remi. sudo yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm # Instal yum-utils dan aktifkan PHP 8.2. sudo yum install -y yum-utils sudo yum-config-manager --enable remi-php82 # Instal PHP, PHP-FPM, dan ekstensi MySQL. sudo yum install -y php php-fpm php-mysqlndUbuntu
# Instal tool manajemen PPA. sudo apt install -y software-properties-common # Tambahkan repositori PPA ondrej/php. sudo add-apt-repository -y ppa:ondrej/php # Instal PHP 8.2, PHP-FPM, dan ekstensi MySQL. sudo apt install -y php8.2 php8.2-fpm php8.2-mysqlJalankan PHP-FPM dan aktifkan agar otomatis berjalan saat boot.
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now php-fpmUbuntu
sudo systemctl enable --now php8.2-fpm
Step 5: Configure Nginx to support PHP processing
Secara default, Nginx hanya dapat menyajikan halaman web statis (seperti HTML dan citra). Untuk mendukung situs web dinamis seperti WordPress, Anda harus mengonfigurasi Nginx agar meneruskan permintaan file .php ke PHP-FPM untuk diproses. Jika tidak, saat Anda mengakses halaman PHP, file tersebut mungkin langsung diunduh atau gagal ditampilkan.
Buat cadangan file konfigurasi Nginx.
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bakDapatkan alamat komunikasi layanan PHP.
Nginx menggunakan alamat ini untuk meneruskan permintaan PHP ke PHP-FPM untuk diproses.
Alibaba Cloud Linux / CentOS
PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php-fpm.d/www.conf | head -n 1) echo "$PHP_FPM_LISTEN"Ubuntu
PHP_FPM_LISTEN=$(sudo sed -n 's/^\s*listen\s*=\s*//p' /etc/php/8.2/fpm/pool.d/www.conf | head -n 1) echo "$PHP_FPM_LISTEN"Konfigurasikan Nginx untuk meneruskan permintaan
.phpke layanan PHP.Berdasarkan output dari langkah sebelumnya, ganti
<PHP_COMMUNICATION_ADDRESS>dalam perintah di bawah dengan alamat komunikasi aktual, lalu jalankan perintah tersebut:Jika output berupa path file (misalnya,
/run/php-fpm/www.sock): Metode komunikasinya adalah Unix socket (hanya untuk komunikasi lokal, menawarkan performa dan keamanan lebih baik). Format alamatnya adalahunix:FILE_PATH, sepertiunix:/run/php-fpm/www.sock.Jika output berupa alamat IP dan port (misalnya,
127.0.0.1:9000): Metode komunikasinya adalah TCP (mendukung komunikasi lintas host, cocok untuk skenario di mana PHP-FPM dan Nginx di-deploy pada host terpisah). Anda dapat langsung menggunakan alamat ini sebagai alamat komunikasi.
sudo tee /etc/nginx/conf.d/default.conf <<-'EOF' server { listen 80; server_name localhost; root /usr/share/nginx/html; # Tetapkan file indeks default. index index.php index.html index.htm; location / { try_files $uri $uri/ /index.php?$query_string; } # Teruskan permintaan .php ke PHP-FPM. location ~ \.php$ { fastcgi_pass <PHP-communication-address>; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } EOFPeriksa file konfigurasi.
sudo nginx -tJika output berisi kata kunci successful, konfigurasi benar. Anda dapat melanjutkan ke langkah berikutnya.
Jika output berisi failed, konfigurasi salah. Periksa apakah Anda telah mengganti path dalam perintah dengan benar, atau jalankan perintah berikut untuk memulihkan konfigurasi dari cadangan:
sudo mv /etc/nginx/conf.d/default.conf.bak /etc/nginx/conf.d/default.conf
Restart Nginx untuk menerapkan konfigurasi baru.
sudo systemctl restart nginx
Step 6: Verify the LNMP stack
Buat file uji coba untuk memverifikasi bahwa Nginx dapat memproses PHP dan PHP dapat terhubung ke database MySQL. Hal ini memastikan bahwa semua komponen stack LNMP bekerja sama dengan benar.
Verifikasi pemrosesan Nginx.
Buat file uji coba: Hasilkan file yang berisi fungsi
phpinfo()untuk menampilkan konfigurasi detail lingkungan PHP.echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.phpVerifikasi di browser: Kunjungi
http://<ECS-public-IP-address>/phpinfo.php.Berhasil: Halaman ditampilkan dengan benar dan menampilkan informasi detail tentang lingkungan PHP.
Gagal: Halaman menampilkan
File not foundatau file langsung diunduh.
Bersihkan file uji coba: Setelah verifikasi berhasil, Anda harus menghapus file ini. Halaman
phpinfoberisi informasi sensitif yang menimbulkan risiko keamanan jika terpapar ke publik.
Verifikasi koneksi antara PHP dan MySQL.
Buat skrip PHP untuk menguji apakah PHP dapat terhubung ke database menggunakan ekstensi mysqlnd.
Buat database dan pengguna.
Login ke MySQL dengan akun root (masukkan kata sandirootyang Anda tetapkan di Step 3.sudo mysql -u root -pPada prompt
mysql>, jalankan perintah berikut untuk membuat database bernamawebappdan pengguna bernamawebuser, lalu berikan hak akses penuh atas database tersebut.CREATE DATABASE webapp; /* Ganti <YourPassword> dengan kata sandi kuat. */ CREATE USER 'webuser'@'localhost' IDENTIFIED BY '<YourPassword>'; GRANT ALL PRIVILEGES ON webapp.* TO 'webuser'@'localhost'; FLUSH PRIVILEGES; EXIT;Buat file uji coba koneksi database.
Ganti<YourPassword>dalam perintah di bawah dengan kata sandi pengguna yang Anda tetapkan pada langkah sebelumnya, lalu jalankan perintah tersebut.sudo tee /usr/share/nginx/html/test.php <<-'EOF' <?php $servername = "localhost"; $username = "webuser"; $password = "<YourPassword>"; $dbname = "webapp"; // Buat koneksi $conn = new mysqli($servername, $username, $password, $dbname); // Periksa koneksi if ($conn->connect_error) { die("Database connection failed: " . $conn->connect_error); } echo "Database connection successful!"; ?> EOFVerifikasi di browser: Kunjungi http://<ECS-public-IP-address>/test.php. Jika halaman menampilkan Database Connection Successful!, pengujian berhasil.
Bersihkan file uji coba: Skrip ini berisi username dan kata sandi database dalam teks biasa. Anda harus segera menghapusnya setelah pengujian untuk mencegah kebocoran kredensial.
FAQ
The browser times out or displays "This site can't be reached"
Ini biasanya merupakan masalah konektivitas jaringan. Lakukan troubleshooting dengan urutan berikut:
Security Group: Periksa apakah aturan masuk security group instans mengizinkan traffic pada Port 80.
Firewall: Periksa apakah firewall internal sistem operasi (seperti
firewalldatauufw) dinonaktifkan atau memiliki aturan yang mengizinkan traffic pada Port 80.Layanan Nginx: Jalankan
sudo systemctl status nginxuntuk memeriksa apakah layanan Nginx sedang berjalan. Jika tidak, periksa log dengansudo journalctl -xeu nginxuntuk mendiagnosis masalah.Konflik Port: Periksa apakah Port 80 sedang digunakan oleh program lain. Untuk langkah troubleshooting lengkap, lihat Troubleshoot port connectivity issues for an ECS instance.
The browser displays "502 Bad Gateway"
Error ini menunjukkan bahwa Nginx tidak dapat berkomunikasi dengan PHP-FPM secara tepat.
Layanan PHP-FPM: Jalankan
sudo systemctl status php-fpm(atauphp8.2-fpmuntuk Ubuntu) untuk memeriksa apakah layanan sedang berjalan.Path socket: Verifikasi bahwa path setelah
unix:dalam direktiffastcgi_passpada file konfigurasi Nginx persis sama dengan pathlistenpada file konfigurasi PHP-FPM.SELinux/AppArmor: Pada CentOS/Alibaba Cloud Linux, kebijakan SELinux mungkin memblokir komunikasi antara Nginx dan PHP-FPM. Jalankan
sestatusuntuk memeriksa statusnya dan tinjau log penolakan di/var/log/audit/audit.log.Izin socket: Periksa izin file socket untuk memastikan pengguna yang menjalankan Nginx memiliki akses baca dan tulis.
How do I allow remote access to MySQL?
Secara default, MySQL melarang login dari jarak jauh. Jika Anda perlu mengaktifkannya, kami merekomendasikan pembuatan pengguna khusus untuk akses jarak jauh daripada mengizinkan pengguna root terhubung dari jarak jauh. Untuk petunjuk lengkap, lihat Add a user for remote MySQL access.