Buat Host Virtual, Direktori Perlindungan Kata Sandi, dan Sertifikat SSL menggunakan "Nginx Web Server" di Arch Linux


Artikel Arch Linux 'LEMP' sebelumnya hanya membahas hal-hal dasar, mulai dari menginstal layanan jaringan (Nginx, database MySQL, dan PhpMyAdmin) dan mengonfigurasi keamanan minimal yang diperlukan untuk server MySQL dan PhpMyadmin.

Topik ini terkait erat dengan Instalasi LEMP sebelumnya di Arch Linux dan akan memandu Anda dalam mengatur konfigurasi yang lebih kompleks untuk tumpukan LEMP, terutama konfigurasi server web Nginx, seperti membuat Host Virtual , gunakan Direktori yang Dilindungi Kata Sandi, buat dan konfigurasikan Lapisan Soket Aman HTTP, pengalihan HTTP tidak aman ke HTTPS dan juga akan menyajikan kepada Anda beberapa skrip Bash berguna yang akan memudahkan pekerjaan dalam mengaktifkan Host Virtual dan menghasilkan Sertifikat dan Kunci SSL.

Persyaratan

Instal LEMP dengan Database MariaDB di Arch Linux

Langkah 1: Aktifkan Host Virtual di Nginx

Salah satu metode paling sederhana untuk mengaktifkan Virtual Hosts adalah dengan menggunakan pernyataan include pada file konfigurasi utama Nginx, yang membuat pekerjaan konfigurasi lebih lanjut menjadi lebih sederhana dan efisien karena Anda dapat membuat file sederhana untuk setiap host baru dan menjaga file konfigurasi utama tetap bersih.

Pendekatan ini bekerja dengan cara yang sama seperti pada Server Web Apache, hal pertama yang perlu Anda lakukan adalah menentukan jalur URI baru di mana Nginx harus membaca arahan file.

1. Jadi, buka nginx.conf file utama yang terletak di jalur sistem /etc/nginx/ dan di bagian bawah, sebelum tanda kurung kurawal terakhir “ }” tambahkan jalur tempat file konfigurasi Virtual Host masa depan akan berada.

sudo nano /etc/nginx/nginx.conf

Di bagian bawah tambahkan pernyataan berikut.

include /etc/nginx/sites-enabled/*.conf;

Direktif ini memberitahu Nginx bahwa ia harus membaca semua file yang ditemukan di /etc/nginx/sites-enabled/ yang diakhiri dengan ekstensi .conf.

2. Langkah selanjutnya adalah membuat direktori sites-enabled dan direktori lainnya, yang disebut sites-available, tempat Anda menyimpan semua konfigurasi Virtual Host Anda file.

sudo mkdir /etc/nginx/sites-available /etc/nginx/sites-enabled

3. Sekarang saatnya membuat Virtual Host baru. Contoh ini akan menggunakan alamat IP sistem sebagai Nama Host Virtual, jadi buatlah file baru bernama name-ip.conf.

sudo nano /etc/nginx/sites-available/name-ip.conf

Tambahkan konten berikut.

## File content ##

server {
    listen 80;
    server_name 192.168.1.33;

    access_log /var/log/nginx/192.168.1.33.access.log;
    error_log /var/log/nginx/192.168.1.33.error.log;

    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }

    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

Arahan yang mengaktifkan Virtual Host adalah pernyataan server_name di bawah port pendengaran. Selain itu, arahan penting lainnya di sini adalah pernyataan root yang mengarahkan Nginx Virtual Host untuk menyajikan konten file dari jalur sistem /srv/http/.

4. Langkah terakhir adalah membuat direktori /srv/http/ dan membuat konfigurasi file name-ip.conf tersedia untuk pembacaan Nginx (menggunakan tautan simbolik), lalu mulai ulang daemon untuk membuat konfigurasi baru terlihat.

sudo mkdir /srv/http/
sudo ln -s /etc/nginx/sites-available/name-ip.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

5. Untuk memverifikasinya, arahkan browser Anda ke alamat IP sistem Arch dan Anda akan melihat bahwa konten web berbeda dari http://localhost. Di sini saya telah menambahkan skrip php kecil yang juga memeriksa konfigurasi FastCGI PHP seperti pada gambar di bawah.

sudo nano /srv/http/info.php
## File content ##

<?php
phpinfo();
?>

6. Metode lain yang saya kembangkan sendiri untuk mengaktifkan atau menonaktifkan Virtual Host di Nginx adalah metode yang lebih elegan dan terinspirasi dari skrip a2eniste Apache.

Untuk menggunakan metode ini, buka editor file dan buat file baru, bernama n2ensite, di jalur $HOME Anda dengan konten di bawah ini, buat file tersebut dapat dieksekusi, jalankan dengan hak akses root dan berikan sebagai opsi pada nama Virtual Host baru Anda tanpa akhiran .conf (isikan dengan bebas untuk mengubahnya sesuai kebutuhan Anda).

sudo nano n2ensite
## File content ##

#!/bin/bash
if test -d /etc/nginx/sites-available && test -d /etc/nginx/sites-enabled  ; then
echo "-----------------------------------------------"
else
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
fi

avail=/etc/nginx/sites-available/$1.conf
enabled=/etc/nginx/sites-enabled/
site=`ls /etc/nginx/sites-available/`

if [ "$#" != "1" ]; then
                echo "Use script: n2ensite virtual_site"
                echo -e "\nAvailable virtual hosts:\n$site"
                exit 0
else

if test -e $avail; then
sudo ln -s $avail $enabled
else
echo -e "$avail virtual host does not exist! Please create one!\n$site"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Success!! Now restart nginx server: sudo systemctl restart nginx"
else
echo  -e "Virtual host $avail does not exist!\nPlease see available virtual hosts:\n$site"
exit 0
fi
fi

Jadikan itu dapat dieksekusi dan jalankan sebagai pertunjukan.

sudo chmod +x n2ensite
sudo ./n2ensite your_virtual_host

7. Untuk menonaktifkan Host Virtual, buat file n2dissite baru dengan konten berikut dan terapkan pengaturan yang sama seperti di atas.

sudo nano n2dissite
## File content ##

#!/bin/bash
avail=/etc/nginx/sites-enabled/$1.conf
enabled=/etc/nginx/sites-enabled
site=`ls /etc/nginx/sites-enabled/`

if [ "$#" != "1" ]; then
                echo "Use script: n2dissite virtual_site"
                echo -e "\nAvailable virtual hosts: \n$site"
                exit 0
else
if test -e $avail; then
sudo rm  $avail
else
echo -e "$avail virtual host does not exist! Exiting!"
exit 0
fi
if test -e $enabled/$1.conf; then
echo "Error!! Could not remove $avail virtual host!"
else
echo  -e "Success! $avail has been removed!\nPlease restart Nginx: sudo systemctl restart nginx"
exit 0
fi
fi

8. Sekarang Anda dapat menggunakan kedua skrip ini untuk mengaktifkan atau menonaktifkan Host Virtual apa pun, tetapi jika Anda ingin menerapkannya sebagai perintah seluruh sistem, cukup salin kedua skrip ke /usr/local/bin/ dan kemudian Anda dapat menggunakannya tanpa menentukan jalur.

sudo cp n2ensite n2dissite /usr/local/bin/

Langkah 2: Aktifkan SSL dengan Virtual Host di Nginx

SSL (Secure Sockets Layer) adalah protokol yang dirancang untuk mengenkripsi koneksi HTTP melalui jaringan atau Internet, yang membuat aliran data dikirim melalui saluran aman menggunakan kunci kriptografi simetris/asimetris dan disediakan di Arch Linux dengan paket OpenSSL.

sudo pacman -S openssl

9. Untuk mengaktifkan koneksi HTTPS dengan Nginx, hal pertama yang perlu Anda lakukan adalah membuat kunci Virtual Hosts. Selain itu, untuk menyederhanakan, saya telah mengembangkan skrip kecil yang secara otomatis menghasilkan kunci kriptografi pada jalur direktori /etc/nginx/ssl, menggunakan penamaan Virtual Host sebagai nama kunci.

Buat file bernama nginx_gen_ssl dan tambahkan konten berikut.

sudo nano nginx_gen_ssl
## File content ##

#!/bin/bash
mkdir /etc/nginx/ssl
cd /etc/nginx/ssl

echo -e "Enter your virtual host FQDN: \nThis will generate the default name for Nginx  SSL certificate!"
read cert

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out $cert.key
chmod 600 $cert.key
openssl req -new -key $cert.key -out $cert.csr
openssl x509 -req -days 365 -in $cert.csr -signkey $cert.key -out $cert.crt

echo -e " The certificate $cert has been generated!\nPlease link it to nginx ssl available website!"
ls -all /etc/nginx/ssl
exit 0

10. Setelah skrip dibuat, tambahkan izin eksekusi, jalankan dan berikan opsi Sertifikat Anda, yang paling penting adalah bidang Nama Umum (tambahkan nama domain resmi di sini) dan biarkan kolom Kata Sandi dan Perusahaan Opsional kosong.

sudo chmod +x nginx_gen_ssl
sudo ./nginx_gen_ssl

Di akhir tugas pembuatan kunci, daftar dengan semua kunci yang tersedia di direktori Nginx ssl akan ditampilkan.

Juga jika Anda ingin skrip ini digunakan sebagai perintah sistem, salin atau pindahkan ke /usr/local/bin/.

sudo mv nginx_gen_ssl  /usr/local/bin

11. Setelah kami membuat kunci yang diperlukan untuk Nginx SSL Virtual Host, inilah waktunya untuk benar-benar membuat file konfigurasi SSL Virtual Host. Gunakan alamat IP sistem yang sama untuk Virtual Host seperti di atas pada direktif server_name tetapi, ubah sedikit nama file Virtual Host dengan menambahkan ssl sebelum .conf, untuk mengingatkan Anda bahwa file ini singkatan dari nama-ip SSL Virtual Host.

sudo nano /etc/nginx/sites-availabe/name-ip-ssl.conf

Pada file ini, ubah pernyataan port listen menjadi 443 ssl dan berikan jalur file kunci SSL dan sertifikat dengan yang dibuat sebelumnya agar terlihat seperti kutipan di bawah ini.

## File content ##

server {
    listen 443 ssl;
    server_name 192.168.1.33;

       ssl_certificate     /etc/nginx/ssl/192.168.1.33.crt;
       ssl_certificate_key  /etc/nginx/ssl/192.168.1.33.key;

       ssl_session_cache    shared:SSL:1m;
       ssl_session_timeout  5m;

       ssl_ciphers  HIGH:!aNULL:!MD5;
       ssl_prefer_server_ciphers  on;

    access_log /var/log/nginx/192.168.1.33-ssl.access.log;
    error_log /var/log/nginx/192.168.1.33-ssl.error.log;
    root /srv/http;
    location / {
    index index.html index.htm index.php;
        autoindex on;
        autoindex_exact_size off;
        autoindex_localtime on;
 }
    location /phpmyadmin {
        rewrite ^/* /phpMyAdmin last;
    }
    location ~ \.php$ {
        #fastcgi_pass 127.0.0.1:9000; (depending on your php-fpm socket configuration)
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

12. Setelah file dibuat, gunakan skrip n2ensite atau baris perintah ln untuk mengaktifkannya (membuat tautan simbolik file di situs -diaktifkan direktori), kemudian restart daemon Nginx untuk menerapkan pengaturan.

sudo ./n2ensite name-ip-ssl
OR
sudo ln -s /etc/nginx/sites-available/name-ip-ssl.conf /etc/nginx/sites-enabled/
sudo systemctl restart nginx

13. Sekali lagi arahkan browser Anda ke URL IP Arch tetapi kali ini menggunakan protokol HTTPS – https://192.168.1.33 di sistem saya- dan kesalahan keamanan Koneksi Tidak Tepercaya akan muncul ( Tambahkan dan Konfirmasi Pengecualian Keamanan untuk melangkah lebih jauh di halaman).

Seperti yang Anda lihat sekarang, Nginx Virtual Host Anda menyajikan konten yang sama seperti host name-ip sebelumnya tetapi kali ini menggunakan koneksi aman HTTP.

Langkah 3: Akses PhpMyAdmin melalui Virtual Host

Jika Virtual Host diaktifkan di Nginx, kami tidak lagi memiliki akses ke konten jalur http://localhost ( localhost biasanya menyajikan konten menggunakan alamat IP loopback atau alamat IP sistem jika tidak dikonfigurasi) karena kami punya menggunakan IP sistem Arch sebagai nama_server sehingga jalur konten kami telah berubah.

14. Metode paling sederhana untuk mendapatkan akses ke PhpMyAdmin melalui web adalah dengan membuat tautan simbolik antara jalur /usr/share/webapps/phpMyAdmin/ dan jalur Virtual Host kami yang baru (/srv/http).

sudo ln -s /usr/share/webapps/phpMyAdmin/ /srv/http/

15. Setelah Anda menjalankan perintah di atas, segarkan halaman Anda dan Anda akan melihat folder baru phpMyAdmin muncul, jika pernyataan autoindex diaktifkan di Nginx Virtual Host atau arahkan URL Anda langsung ke Folder PhpMyAdmin https://arch_IP/phpMyAdmin.

16. Jika Anda ingin membersihkan string phpMyAdmin di browser, edit file Virtual Hosts Anda dan tambahkan konten berikut di bawah blok server.

location /phpmyadmin {
       rewrite ^/* /phpMyAdmin last;
    }

Langkah 4: Aktifkan Direktori yang Dilindungi Kata Sandi di Nginx

Tidak seperti Apache, Nginx menggunakan modul HttpAuthBasic untuk mengaktifkan Direktori yang Dilindungi Kata Sandi tetapi tidak menyediakan alat apa pun untuk membuat file .htpasswd terenkripsi.

17. Untuk mencapai perlindungan kata sandi direktori dengan Nginx di Arch Linux, instal server web Apache dan gunakan alatnya untuk menghasilkan file .htaccess terenkripsi.

sudo pacman -S apache

18. Setelah Anda menginstal Apache, buatlah direktori baru di bawah /etc/nginx/ dengan nama intuitif passwd di mana file .htpasswd akan disimpan dan digunakan Perintah htpasswd dengan –c aktifkan terlebih dahulu pengguna yang ditambahkan untuk menghasilkan file, kemudian jika Anda ingin menambahkan lebih banyak pengguna gunakan htpasswd tanpa – c beralih.

sudo mkdir /etc/nginx/passwd

sudo htpasswd -c /etc/nginx/passwd/.htpasswd first_user
sudo htpasswd /etc/nginx/passwd/.htpasswd second_user
sudo htpasswd /etc/nginx/passwd/.htpasswd third_user

19. Untuk melindungi name-ip-ssl root Host Virtual /srv/http/ jalur yang disajikan dengan semua sub folder dan file di bawahnya itu menambahkan instruksi berikut di dalam blok server Virtual Host Anda di bawah arahan root dan mengarahkannya ke jalur file .htpasswd absolut.

auth_basic "Restricted Website";
auth_basic_user_file /etc/nginx/passwd/.htpasswd;

20. Setelah Anda memulai ulang layanan Nginx, halaman penyegaran dan popup Diperlukan Otentikasi akan muncul yang meminta kredensial Anda.

Sekarang Anda telah berhasil mengaktifkan Direktori yang Dilindungi Kata Sandi Nginx tetapi perlu diketahui bahwa pada saat yang sama server web Apache diinstal di sistem Anda, jadi pastikan bahwa itu tetap dinonaktifkan dan jangan memulainya karena dapat menyebabkan port yang bertentangan dengan Nginx.

Langkah 5: Alihkan HTTP ke HTTPS di Nginx

21. Jika Anda ingin browser secara otomatis mengalihkan semua permintaan HTTP yang tidak aman ke protokol HTTPS, buka dan edit Anda non-ssl Virtual Host dan tambahkan instruksi berikut di bawah nama_server direktif.

rewrite        ^ https://$server_name$request_uri? permanent;

Semua pengaturan yang disajikan pada artikel ini dibuat pada sistem Arch Linux yang bertindak sebagai server, namun sebagian besar pengaturan tersebut, terutama yang berkaitan dengan file konfigurasi Nginx, tersedia di sebagian besar sistem Linux dengan sedikit perbedaan.