Instal Nginx, MySQL, dan PHP pada Instance ECS dengan kontrol penuh atas konfigurasi dan penguatan keamanan untuk situs web produksi.
Solution architecture
|
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.
Konfigurasikan akses publik.
Pastikan Instance ECS Anda memiliki Alamat IP publik atau Elastic IP Address (EIP). Lihat Enable public access for an instance.
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.
Perbarui paket sistem.
Alibaba Cloud Linux 3 / CentOS 8
Login ke Instance ECS.
Buka ECS console - Instances. Di pojok kiri atas, pilih Wilayah dan kelompok sumber daya untuk resource target.
Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login.
Perbarui semua paket.
sudo dnf update -y
Alibaba Cloud Linux 2 / CentOS 7
Login ke Instance ECS.
Buka ECS console - Instances. Di pojok kiri atas, pilih Wilayah dan kelompok sumber daya untuk resource target.
Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login.
Perbarui semua paket.
sudo yum update -y
Ubuntu
Login ke Instance ECS.
Buka ECS console - Instances. Di pojok kiri atas, pilih Wilayah dan kelompok sumber daya untuk resource target.
Pada halaman detail instans, klik Connect dan pilih Workbench. Ikuti petunjuk di layar untuk login.
Perbarui semua paket.
sudo apt update -y && sudo apt upgrade -y
Step 2: Install Nginx
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 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 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 nginxJalankan Nginx dan aktifkan saat boot.
Flag
enable --nowmenjalankan layanan sekaligus mengaktifkannya saat boot.sudo systemctl enable --now nginxVerifikasi bahwa Nginx sedang berjalan.
Jalankancurl http://127.0.0.1. Jika output berisi HTML halaman selamat datang Nginx, instalasi berhasil.
Step 3: Install MySQL
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-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 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-serverJalankan MySQL dan aktifkan saat boot.
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now mysqldUbuntu
sudo systemctl enable --now mysqlLakukan penguatan keamanan.
Konfigurasi default MySQL mengizinkan pengguna anonim dan login root dari jarak jauh. Jalankan skrip keamanan untuk memperbaiki kerentanan ini.
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.logJalankan skrip keamanan.
Jalankan
sudo mysql_secure_installationdan ikuti petunjuk: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.
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 PHP
Instal PHP, PHP-FPM, dan ekstensi MySQL.
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-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 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-mysqlndUbuntu
# 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-mysqlJalankan PHP-FPM dan aktifkan saat boot.
Alibaba Cloud Linux / CentOS
sudo systemctl enable --now php-fpmUbuntu
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.
Buat cadangan file konfigurasi Nginx default.
sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bakDapatkan 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"Konfigurasikan Nginx untuk meneruskan permintaan
.phpke 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, sepertiunix:/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; } } EOFUji file konfigurasi.
sudo nginx -tJika 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
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.
Verifikasi pemrosesan PHP oleh Nginx.
Buat file uji: Hasilkan file berisi
phpinfo()untuk menampilkan konfigurasi PHP.echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/html/phpinfo.phpVerifikasi 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.
Hapus file uji: Hapus file ini setelah verifikasi. Halaman
phpinfomemaparkan informasi sensitif server.
Verifikasi konektivitas PHP ke MySQL.
Buat skrip PHP untuk menguji konektivitas database dengan ekstensi mysqlnd.
Buat database dan pengguna.
Login ke MySQL dengan kata sandirootyang ditetapkan di Step 3.sudo mysql -u root -pPada prompt
mysql>, buat database bernamawebapp, pengguna bernamawebuser, 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;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!"; ?> EOFVerifikasi 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:
Grup keamanan: Pastikan grup keamanan mengizinkan lalu lintas masuk pada Port 80.
Firewall: Pastikan firewall OS (seperti
firewalldatauufw) mengizinkan lalu lintas pada Port 80.Layanan Nginx: Jalankan
sudo systemctl status nginxuntuk memeriksa apakah Nginx sedang berjalan. Jika tidak, periksa log dengansudo journalctl -xeu nginx.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.
Layanan PHP-FPM: Jalankan
sudo systemctl status php-fpm(atauphp8.2-fpmdi Ubuntu) untuk memeriksa apakah layanan sedang berjalan.Path socket: Pastikan path
unix:dalam direktiffastcgi_passsesuai dengan pathlistendalam konfigurasi PHP-FPM.SELinux/AppArmor: Di CentOS atau Alibaba Cloud Linux, SELinux mungkin memblokir komunikasi antara Nginx dan PHP-FPM. Jalankan
sestatusdan periksa/var/log/audit/audit.loguntuk penolakan akses.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.