全部产品
Search
文档中心

Elastic Compute Service:Deploy an LNMP stack

更新时间:Dec 10, 2025

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

  1. Browser pengguna mengirim permintaan HTTP ke Port 80 Instance ECS melalui jaringan publik.

  2. Sebagai server web, Nginx menerima dan mengarahkan permintaan tersebut. Jika permintaan tersebut ditujukan untuk resource statis (seperti HTML, CSS, atau citra), Nginx membaca dan mengembalikannya secara langsung. Jika permintaan tersebut ditujukan untuk skrip PHP (seperti file .php), Nginx meneruskannya ke PHP-FPM untuk diproses menggunakan protokol FastCGI.

  3. PHP-FPM (FastCGI Process Manager) menerima dan mengeksekusi kode PHP. Jika kode tersebut perlu berinteraksi dengan database, PHP-FPM terhubung ke database MySQL.

  4. MySQL menyimpan dan mengelola data, mengeksekusi kueri SQL yang dikirim dari skrip PHP, lalu mengembalikan hasilnya ke PHP-FPM.

  5. PHP-FPM menghasilkan konten HTML dari hasil tersebut dan mengembalikannya ke Nginx, yang kemudian mengirimkan respons akhir ke browser pengguna.

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.

  1. 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.

  2. 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.

  3. Perbarui komponen sistem dan paket perangkat lunak.

    Alibaba Cloud Linux 3 / CentOS 8

    1. Login ke Instance ECS.

      1. Buka ECS console - Instances. Pada bilah navigasi atas, pilih Wilayah dan kelompok sumber daya yang dituju.

      2. Buka halaman detail instans. Klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login dan membuka terminal.

    2. Perbarui indeks paket dan tingkatkan semua paket ke versi terbaru.

      sudo dnf update -y

    Alibaba Cloud Linux 2 / CentOS 7

    1. Login ke Instance ECS.

      1. Buka ECS console - Instances. Pada bilah navigasi atas, pilih Wilayah dan kelompok sumber daya yang dituju.

      2. Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login dan membuka terminal.

    2. Perbarui semua paket ke versi terbaru.

      sudo yum update -y

    Ubuntu

    1. Login ke Instance ECS.

      1. Buka ECS console - Instances. Pada bilah navigasi atas, pilih Wilayah dan kelompok sumber daya yang dituju.

      2. Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login dan membuka terminal.

    2. Perbarui semua paket ke versi terbaru.

      sudo apt update -y && sudo apt upgrade -y

Step 2: Install and configure Nginx

  1. 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 nginx

    Alibaba 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 nginx

    Ubuntu

    # 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 nginx
  2. Jalankan Nginx dan aktifkan agar otomatis berjalan saat boot.

    Flag enable --now menjalankan layanan segera sekaligus mengaktifkannya saat boot.

    sudo systemctl enable --now nginx
  3. Verifikasi layanan Nginx.
    Jalankan curl http://127.0.0.1. Jika terminal menampilkan kode HTML halaman selamat datang Nginx, instalasi berhasil.

Step 3: Install and harden MySQL

  1. 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-server

    Alibaba 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-server

    Ubuntu

    # 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-server
  2. Jalankan MySQL dan aktifkan agar otomatis berjalan saat boot.

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now mysqld

    Ubuntu

    sudo systemctl enable --now mysql
  3. Lakukan 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.

    1. 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.log
    2. Jalankan skrip penguatan keamanan.

      Jalankan perintah sudo mysql_secure_installation dan ikuti prompt untuk menyelesaikan konfigurasi yang direkomendasikan:

      1. 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.
      2. Hapus pengguna anonim: Masukkan Y.

      3. Larang login root dari jarak jauh: Masukkan Y.

      4. Hapus database uji coba: Masukkan Y.

      5. Muat ulang tabel hak istimewa: Masukkan Y.

Step 4: Install and configure PHP

Instal PHP, PHP-FPM (untuk menangani permintaan web), dan driver MySQL.

  1. 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-mysqlnd

    Alibaba 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-mysqlnd

    Ubuntu

    # 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-mysql
  2. Jalankan PHP-FPM dan aktifkan agar otomatis berjalan saat boot.

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now php-fpm

    Ubuntu

    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.

  1. Buat cadangan file konfigurasi Nginx.

    sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
  2. Dapatkan 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"
  3. Konfigurasikan Nginx untuk meneruskan permintaan .php ke 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 adalah unix:FILE_PATH, seperti unix:/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;
        }
    }
    EOF
  4. Periksa file konfigurasi.

    sudo nginx -t
    • Jika 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
  5. 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.

  1. Verifikasi pemrosesan Nginx.

    1. 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.php
    2. Verifikasi 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 found atau file langsung diunduh.

    3. Bersihkan file uji coba: Setelah verifikasi berhasil, Anda harus menghapus file ini. Halaman phpinfo berisi informasi sensitif yang menimbulkan risiko keamanan jika terpapar ke publik.

  2. Verifikasi koneksi antara PHP dan MySQL.

    Buat skrip PHP untuk menguji apakah PHP dapat terhubung ke database menggunakan ekstensi mysqlnd.

    1. Buat database dan pengguna.
      Login ke MySQL dengan akun root (masukkan kata sandi root yang Anda tetapkan di Step 3.

      sudo mysql -u root -p

      Pada prompt mysql>, jalankan perintah berikut untuk membuat database bernama webapp dan pengguna bernama webuser, 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;
    2. 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!";
      ?>
      EOF
      • Verifikasi 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:

  1. Security Group: Periksa apakah aturan masuk security group instans mengizinkan traffic pada Port 80.

  2. Firewall: Periksa apakah firewall internal sistem operasi (seperti firewalld atau ufw) dinonaktifkan atau memiliki aturan yang mengizinkan traffic pada Port 80.

  3. Layanan Nginx: Jalankan sudo systemctl status nginx untuk memeriksa apakah layanan Nginx sedang berjalan. Jika tidak, periksa log dengan sudo journalctl -xeu nginx untuk mendiagnosis masalah.

  4. 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.

  1. Layanan PHP-FPM: Jalankan sudo systemctl status php-fpm (atau php8.2-fpm untuk Ubuntu) untuk memeriksa apakah layanan sedang berjalan.

  2. Path socket: Verifikasi bahwa path setelah unix: dalam direktif fastcgi_pass pada file konfigurasi Nginx persis sama dengan path listen pada file konfigurasi PHP-FPM.

  3. SELinux/AppArmor: Pada CentOS/Alibaba Cloud Linux, kebijakan SELinux mungkin memblokir komunikasi antara Nginx dan PHP-FPM. Jalankan sestatus untuk memeriksa statusnya dan tinjau log penolakan di /var/log/audit/audit.log.

  4. 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.