All Products
Search
Document Center

Elastic Compute Service:Deploy an LNMP stack

Last Updated:Apr 28, 2026

Instal Nginx, MySQL, dan PHP pada Instance ECS dengan kontrol penuh atas konfigurasi dan penguatan keamanan untuk situs web produksi.

Solution architecture

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

  2. Nginx menerima dan meneruskan permintaan. Nginx menyajikan aset statis seperti HTML, CSS, dan gambar secara langsung, serta meneruskan permintaan PHP (file yang berakhiran .php) ke PHP-FPM melalui FastCGI.

  3. PHP-FPM mengeksekusi kode PHP. Jika kode tersebut memerlukan akses database, PHP-FPM terhubung ke MySQL.

  4. MySQL mengeksekusi kueri SQL dari skrip PHP dan mengembalikan hasilnya.

  5. PHP-FPM menghasilkan HTML dari hasil tersebut dan mengembalikannya ke Nginx, yang kemudian mengirim respons ke browser.

Procedure

Kami merekomendasikan Instance ECS dengan memori minimal 2 GiB.

Step 1: Prepare the instance

Konfigurasikan akses publik dan aturan grup keamanan, lalu perbarui paket sistem.

  1. Konfigurasikan akses publik.

    Pastikan Instance ECS Anda memiliki Alamat IP publik atau Elastic IP Address (EIP). Lihat Enable public access for an instance.

  2. Tambahkan aturan grup keamanan.

    Pada grup keamanan Instance ECS Anda, tambahkan aturan masuk untuk mengizinkan lalu lintas TCP pada Port 80. Lihat Add a security group rule.

  3. Perbarui paket sistem.

    Alibaba Cloud Linux 3 / CentOS 8

    1. Login ke Instance ECS.

      1. Buka ECS console - Instances. Di pojok kiri atas, pilih Wilayah dan kelompok sumber daya untuk resource target.

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

    2. Perbarui semua paket.

      sudo dnf update -y

    Alibaba Cloud Linux 2 / CentOS 7

    1. Login ke Instance ECS.

      1. Buka ECS console - Instances. Di pojok kiri atas, pilih Wilayah dan kelompok sumber daya untuk resource target.

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

    2. Perbarui semua paket.

      sudo yum update -y

    Ubuntu

    1. Login ke Instance ECS.

      1. Buka ECS console - Instances. Di pojok kiri atas, pilih Wilayah dan kelompok sumber daya untuk resource target.

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

    2. Perbarui semua paket.

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

Step 2: Install Nginx

  1. Tambahkan repositori 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 untuk Nginx.
    sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
    
    # Impor kunci tanda tangan resmi Nginx untuk memverifikasi keaslian 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 saat boot.

    Flag enable --now menjalankan layanan sekaligus mengaktifkannya saat boot.
    sudo systemctl enable --now nginx
  3. Verifikasi bahwa Nginx sedang berjalan.
    Jalankan curl http://127.0.0.1. Jika output berisi HTML halaman selamat datang Nginx, instalasi berhasil.

Step 3: Install MySQL

  1. Instal 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 secara 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 saat boot.

    Alibaba Cloud Linux / CentOS

    sudo systemctl enable --now mysqld

    Ubuntu

    sudo systemctl enable --now mysql
  3. Lakukan penguatan keamanan.

    Konfigurasi default MySQL mengizinkan pengguna anonim dan login root dari jarak jauh. Jalankan skrip keamanan untuk memperbaiki kerentanan ini.

    1. Dapatkan kata sandi root awal.

      Langkah ini hanya berlaku untuk Alibaba Cloud Linux dan CentOS. Ubuntu menggunakan autentikasi berbasis socket untuk root secara default.

      # Ekstrak dan tampilkan kata sandi sementara dari log.
      sudo grep 'temporary password' /var/log/mysqld.log
    2. Jalankan skrip keamanan.

      Jalankan sudo mysql_secure_installation dan ikuti petunjuk:

      1. Atur ulang kata sandi root: Gunakan kata sandi sementara untuk login dan tetapkan kata sandi baru.

        Gunakan kata sandi kuat minimal 12 karakter yang mencakup huruf besar, huruf kecil, angka, dan karakter 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 PHP

Instal PHP, PHP-FPM, dan ekstensi MySQL.

  1. Tambahkan repositori PHP dan instal PHP.

    Alibaba Cloud Linux 3 / CentOS 8

    # Tambahkan repositori Remi.
    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 yum-utils.
    dnf install -y yum-utils
    
    # Instal PHP, PHP-FPM, dan ekstensi MySQL.
    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 repositori 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 untuk mengelola 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 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 process PHP

Secara default, Nginx hanya menyajikan file statis. Konfigurasikan agar Nginx meneruskan permintaan .php ke PHP-FPM. Tanpa konfigurasi ini, halaman PHP akan diunduh atau memicu error.

  1. Buat cadangan file konfigurasi Nginx default.

    sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
  2. Dapatkan alamat komunikasi untuk layanan PHP-FPM.

    Nginx menggunakan alamat ini untuk meneruskan permintaan PHP ke PHP-FPM.

    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 PHP-FPM.

    Ganti <PHP_FPM_ADDRESS> dengan alamat komunikasi dari langkah sebelumnya dan jalankan perintah.

    • Jika output berupa path file (misalnya, /run/php-fpm/www.sock), layanan menggunakan Unix socket. 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), layanan menggunakan TCP socket. Gunakan alamat IP dan port tersebut secara langsung 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_FPM_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. Uji file konfigurasi.

    sudo nginx -t
    • Jika output berisi successful, konfigurasi sudah benar. Lanjutkan ke langkah berikutnya.

    • Jika output berisi failed, pastikan Anda telah mengganti alamat dengan benar, atau kembalikan file 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 stack

Buat file uji untuk memverifikasi bahwa Nginx memproses PHP dan PHP terhubung ke MySQL.

  1. Verifikasi pemrosesan PHP oleh Nginx.

    1. Buat file uji: Hasilkan file berisi phpinfo() untuk menampilkan konfigurasi PHP.

      echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.php
    2. Verifikasi di browser: Buka http://<ECS_PUBLIC_IP>/phpinfo.php.

      • Berhasil: Halaman menampilkan detail lingkungan PHP.

      • Gagal: Halaman menampilkan "File not found" atau browser mengunduh file tersebut.

    3. Hapus file uji: Hapus file ini setelah verifikasi. Halaman phpinfo memaparkan informasi sensitif server.

  2. Verifikasi konektivitas PHP ke MySQL.

    Buat skrip PHP untuk menguji konektivitas database dengan ekstensi mysqlnd.

    1. Buat database dan pengguna.
      Login ke MySQL dengan kata sandi root yang ditetapkan di Step 3.

      sudo mysql -u root -p

      Pada prompt mysql>, buat database bernama webapp, pengguna bernama webuser, dan berikan semua hak istimewa kepada pengguna tersebut pada 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 koneksi database.
      Ganti <YourPassword> dengan kata sandi pengguna dari langkah sebelumnya dan jalankan perintah.

      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: Buka http://<ECS_PUBLIC_IP>/test.php. Jika halaman menampilkan Database connection successful!, koneksi berhasil.

      • Hapus file uji: Skrip ini berisi kredensial database dalam teks biasa. Segera hapus setelah pengujian.

FAQ

Browser timeout atau "site can't be reached"

Error ini biasanya menunjukkan masalah jaringan. Lakukan troubleshooting dalam urutan berikut:

  1. Grup keamanan: Pastikan grup keamanan mengizinkan lalu lintas masuk pada Port 80.

  2. Firewall: Pastikan firewall OS (seperti firewalld atau ufw) mengizinkan lalu lintas pada Port 80.

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

  4. Konflik port: Periksa apakah Port 80 digunakan oleh aplikasi lain. Lihat Troubleshoot port connectivity issues for an ECS instance.

Browser menampilkan "502 Bad Gateway"

Error ini berarti Nginx tidak dapat berkomunikasi dengan PHP-FPM.

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

  2. Path socket: Pastikan path unix: dalam direktif fastcgi_pass sesuai dengan path listen dalam konfigurasi PHP-FPM.

  3. SELinux/AppArmor: Di CentOS atau Alibaba Cloud Linux, SELinux mungkin memblokir komunikasi antara Nginx dan PHP-FPM. Jalankan sestatus dan periksa /var/log/audit/audit.log untuk penolakan akses.

  4. Izin socket: Pastikan pengguna Nginx memiliki akses baca/tulis ke file socket.

Aktifkan akses jarak jauh ke MySQL

Secara default, MySQL melarang login dari jarak jauh. Untuk mengaktifkannya, buat pengguna khusus untuk akses jarak jauh alih-alih menggunakan root. Lihat Add a user for remote MySQL access.