Menginstal FcgiWrap dan Mengaktifkan Bahasa Dinamis Perl, Ruby dan Bash di Gentoo LEMP


Tutorial ini sangat terkait dengan tutorial sebelumnya tentang Instalasi LEMP di Gentoo dan menangani masalah perluasan server lainnya seperti mengaktifkan bahasa skrip dinamis seperti Perl atau Bash atau Ruby melalui Fcgiwrap Gateway, dan mengedit file konfigurasi Nginx Virtual Hosts ke menyajikan konten dinamis menggunakan skrip .pl, .rb dan .cgi.

Persyaratan

  1. Tumpukan LEMP diinstal di Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Langkah 1: Aktifkan FCGIWRAP di Gentoo LEMP

Fcgiwrap adalah bagian dari Nginx FastCGI Common Gateway Interface yang memproses bahasa skrip dinamis lainnya, seperti skrip Perl atau Bash atau Ruby, bekerja dengan memproses permintaan yang diterima dari Nginx, melalui TCP atau Unix Sockets, secara independen dan mengembalikan hasil yang dihasilkan ke Nginx, yang, pada gilirannya, akan meneruskan tanggapan kembali ke klien akhir.

1. Mari kita mulai dengan menginstal proses FCcgiwrap di Gentoo Linux menggunakan perintah berikut.

emerge --ask www-misc/fcgiwrap

2. Secara default, paket Fcgiwrap tidak menyediakan skrip init apa pun di Gentoo untuk mengelola prosesnya. Setelah paket dikompilasi dan diinstal, buat skrip init berikut yang membantu Anda mengelola proses Fcgiwrap menggunakan tiga pendekatan: meluncurkan proses menggunakan Unix Domain Sockets atau menggunakan lokal < b>Soket TCP atau menggunakan keduanya secara bersamaan.

Menggunakan Skrip Soket TCP

Buat file init di jalur /etc/init.d/ dengan konten file berikut.

nano /etc/init.d/fcgiwrap

Tambahkan konten file berikut.

#!/sbin/runscript

ip="0.0.0.0"
port="12345"

start() {
ebegin "Starting fcgiwrap process..."
       /usr/sbin/fcgiwrap -s tcp:$ip:$port &
        tcp_sock=`netstat -tulpn | grep fcgiwrap`
        echo "Socket details: $tcp_sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap process..."
                pid=`ps a | grep fcgiwrap | grep tcp | cut -d" " -f1`
kill -s 1 $pid
                tcp_sock=`netstat -tulpn | grep fcgiwrap`
                 if test $tcp_sock =  2> /dev/null ; then
                 echo "Fcgiwrap process successfully stoped"
                tcp_sock=`netstat -atulpn | grep $port`
                if test $tcp_sock =  2> /dev/null ; then
                echo "No open fcgiwrap connection found..."
                else
                echo "Wait to close fcgiwrap open connections...please verify with 'status'"
                echo -e "Socket details: \n$tcp_sock"
                 fi
                else
                echo "Fcgiwarp process is still running!"
        echo "Socket details: $tcp_sock"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap process..."
      tcp_sock=`netstat -atulpn | grep $port`
    if test $tcp_sock =  2> /dev/null ; then
                       echo "Fcgiwrap process not running"
                     else
                echo "Fcgiwarp process is running!"
                 echo -e "Socket details: \n$tcp_sock"
                fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

Seperti yang Anda lihat, file skrip menampung dua variabel di awal, masing-masing ip dan port. Ubah variabel ini sesuai kebutuhan Anda dan pastikan variabel tersebut tidak tumpang tindih dengan layanan lain di sistem Anda, terutama variabel port – default di sini adalah 12345 – ubahlah sesuai kebutuhan.

Menggunakan 0.0.0.0 pada variabel IP memungkinkan proses untuk mengikat dan mendengarkan IP apa pun (di luar dapat diakses jika Anda tidak memiliki firewall), tetapi untuk alasan keamanan Anda harus mengubahnya untuk mendengarkan secara lokal saja, pada 127.0.0.1, kecuali Anda memiliki alasan lain seperti mengatur gateway Fcgiwrap dari jarak jauh pada node yang berbeda untuk kinerja atau penyeimbangan beban.

3. Setelah file dibuat, tambahkan izin eksekusi dan kelola proses daemon menggunakan tombol mulai, berhenti, atau status. Sakelar status akan menampilkan informasi soket yang relevan seperti pasangan IP-PORT yang didengarkannya dan apakah ada koneksi aktif yang diinisialisasi. Selain itu, jika proses memiliki koneksi aktif dalam status TIME_WAIT Anda tidak dapat memulai ulang proses tersebut hingga semua koneksi TCP ditutup.

chmod +x /etc/init.d/fcgiwrap
service start fcgiwrap
/etc/init.d/fcgiwrap status

Menggunakan Skrip Soket Unix

Seperti yang disajikan sebelumnya, Fcgiwrap dapat berjalan secara bersamaan menggunakan kedua soket, sehingga akan sedikit mengubah nama skrip kedua menjadi fcgiwrap-unix-socket, untuk memastikan keduanya dapat dimulai dan dijalankan pada waktu yang bersamaan.

nano /etc/init.d/fcgiwrap-unix-socket

Gunakan konten file berikut untuk soket UNIX.

#!/sbin/runscript
sock_detail=`ps a | grep fcgiwrap-unix | head -1`

start() {
ebegin "Starting fcgiwrap-unix-socket process..."
        /usr/sbin/fcgiwrap -s unix:/run/fcgiwrap-unix.sock &
        sleep 2
        /bin/chown nginx:nginx /run/fcgiwrap-unix.sock
        sleep 1
        sock=`ls -al /run/fcgiwrap-unix.sock`
        echo "Socket details: $sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap-unix-socket process..."
                pid=`ps a | grep fcgiwrap | grep unix | cut -d" " -f1`
                rm -f /run/fcgiwrap-unix.sock                 
                kill -s 1 $pid
                echo "Fcgiwrap process successfully stoped"
                #killall /usr/sbin/fcgiwrap
        sleep 1
        echo "Socket details: $sock"
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap-unix-socket process..."
  if test -S /run/fcgiwrap-unix.sock; then
       echo "Process is started with socket: $sock_detail"
        else
        echo "Fcgiwrap process not running!"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

4. Sekali lagi pastikan bahwa file ini dapat dieksekusi dan gunakan saklar layanan yang sama: mulai, berhenti atau status. Saya telah menetapkan jalur default untuk soket ini di jalur sistem /run/fcgiwrap-unix.sock. Mulai proses dan verifikasi menggunakan saklar status atau daftar isi direktori /jalankan dan temukan soketnya, atau gunakan ps -a | perintah grep fcgiwrap.

chmod +x /etc/init.d/fcgiwrap-unix-socket
service start fcgiwrap-unix-socket
/etc/init.d/fcgiwrap-unix-socket status
ps -a | grep fcgiwrap

Seperti disebutkan sebelumnya, Fcgiwrap dapat berjalan dengan soket TCP dan UNIX secara bersamaan, namun jika Anda tidak memerlukan koneksi gateway eksternal, gunakan Soket Domain Unix saja, karena menggunakan komunikasi antarproses, yang lebih cepat daripada komunikasi melalui Koneksi loopback TCP, dan menggunakan lebih sedikit overhead TCP.

Langkah 2: Aktifkan Skrip CGI di Nginx

5. Agar Nginx dapat mengurai dan menjalankan skrip Perl atau Bash melalui Fast Common Gateway Interface, Virtual Host harus dikonfigurasi dengan definisi Fcgiwrap pada jalur root atau pernyataan lokasi.

Contohnya disajikan di bawah ini (localhost), yang mengaktifkan skrip Perl dan CGI pada semua file yang ditempatkan di jalur root (/var/www/localhost/htdocs/) dengan .pl dan ekstensi .cgi menggunakan Fcgiwrap TCP Sockets untuk jalur dokumen root default, lokasi kedua menggunakan Unix Domain Sockets, dengan file index.pl dan lokasi ketiga menggunakan soket TCP dengan file index.cgi.

Tempatkan konten berikut, atau hanya beberapa bagian saja, ke file konfigurasi Virtual Host yang Anda inginkan. Anda ingin mengaktifkan skrip Perl atau Bash dinamis dengan Soket UNIX atau TCP di lokasi berbeda, dengan memodifikasi pernyataan argumen fastcgi_pass.

nano /etc/nginx/sites-available/localhost.conf

Edit localhost.conf agar terlihat seperti pada template di bawah ini.

server {
                                listen 80;
                                server_name localhost;

access_log /var/log/nginx/localhost_access_log main;
error_log /var/log/nginx/localhost_error_log info;

               root /var/www/localhost/htdocs/;
                location / {
                autoindex on;
                index index.html index.htm index.php;
                                }

## PHP –FPM Gateway ###
                            location ~ \.php$ {
                            try_files $uri =404;
                            include /etc/nginx/fastcgi.conf;
                            fastcgi_pass 127.0.0.1:9001;
				}

## Fcgiwrap Gateway on all files under root with TCP Sockets###
location ~ \.(pl|cgi|rb)$ {
                fastcgi_index index.cgi index.pl;
                include /etc/nginx/fastcgi.conf;
fastcgi_pass 127.0.0.1:12345;    
                                }                                                                                                                             

## Fcgiwrap Gateway on all files under root second folder with index.pl using UNIX Sockets###
location /second {
                                index index.pl; 
root /var/www/localhost/htdocs/;
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass unix:/run/fcgiwrap-unix.sock;      
                                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                                             }                                                                                                            
                                                }

## Fcgiwrap Gateway on all files under root third folder with index.cgi using TCP Sockets###
location /third {
                                index index.cgi;               
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                 fastcgi_pass 127.0.0.1:12345;       
                                }                                                                                             
  }

6. Setelah Anda selesai mengedit localhost.conf Nginx, atau file konfigurasi Virtual Host spesifik Anda, pindah ke jalur akar dokumen default situs web Anda, buat dua folder tersebut untuk mencerminkan lokasi Anda pernyataan, dan buat file indeks untuk setiap lokasi dengan ekstensi spesifiknya.

cd /var/www/localhost/htdocs
mkdir second third

Buat file index.pl di lokasi kedua dengan konten berikut.

nano /var/www/localhost/htdocs/second/index.pl

Tambahkan konten ini untuk mendapatkan variabel lingkungan.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<HTML;
                <html>
                <head><title>Perl Index</title></head>
                <body>
                                <div align=center><h1>A Perl CGI index on second location with env variables</h1></div>
                </body>
HTML
print "Content-type: text/html\n\n"; foreach my $keys (sort keys %ENV) { print "$keys =
$ENV{$keys}<br/>\n";
}
exit;

Kemudian buat file index.cgi di lokasi ketiga dengan konten berikut.

nano /var/www/localhost/htdocs/third/index.cgi

Tambahkan konten ini untuk mendapatkan variabel lingkungan.

#!/bin/bash
echo Content-type: text/html
echo ""
cat << EOF
<HTML>
<HEAD><TITLE>Bash script</TITLE></HEAD>
<BODY><PRE>
<div align=center><h1>A BASH CGI index on third location with env variables</h1></div>
EOF
env
cat << EOF
</BODY>
</HTML>
EOF

7. Setelah selesai mengedit, buat kedua file dapat dieksekusi, mulai ulang server Nginx dan pastikan kedua soket Fcgiwrap berjalan.

chmod +x /var/www/localhost/htdocs/second/index.pl
chmod +x /var/www/localhost/htdocs/third/index.cgi
service nginx restart
service fcgiwrap start
service fcgiwrap-unix-socket start

Selanjutnya, arahkan browser lokal Anda ke URL berikut.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Hasilnya akan muncul seperti pada gambar di bawah.

8. Jika semuanya sudah siap dan dikonfigurasi dengan benar, aktifkan kedua daemon Fcgiwrap untuk memulai secara otomatis, setelah reboot dengan mengeluarkan perintah berikut (jika Anda telah mengkonfigurasi Nginx untuk menggunakan kedua soket CGI).

rc-update add fcgiwrap default
rc-update add fcgiwrap-unix-socket default

Langkah 3: Aktifkan dukungan Ruby di Fcgiwrap

9. Jika Anda perlu menjalankan skrip Ruby dinamis di Nginx FCGI, Anda harus menginstal penerjemah Ruby di Gentoo dengan perintah berikut.

emerge --ask ruby

10. Setelah paket dikompilasi dan diinstal, pindah ke Nginx sites-available dan edit file localhost.conf dengan menambahkan pernyataan berikut sebelumnya tanda kurung kurawal terakhir “ } ”, yang mengaktifkan dukungan untuk menjalankan skrip Ruby di lokasi keempat di bawah jalur akar dokumen default yang dilayani oleh Nginx localhost.

nano /etc/nginx/sites-available/localhost.conf

Gunakan arahan Nginx berikut.

## Fcgiwrap Gateway on all files under root fourth folder with index.rb under TCP Sockets###
                location /fourth {
                                index index.rb;
                                location ~ \.rb$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass 127.0.0.1:12345;       
                                                }                                                                                                             
                               }             
## Last curly bracket which closes Nginx server definitions ##
}

11. Sekarang, untuk menguji konfigurasi, buat direktori keempat di bawah jalur /var/www/localhost/htdocs, buat skrip indeks Ruby yang dapat dieksekusi dengan .rb ekstensi dan tambahkan konten berikut.

mkdir /var/www/localhost/htdocs/fourth
nano /var/www/localhost/htdocs/fourth/index.rb

Contoh indeks Ruby.rb.

#!/usr/bin/ruby
puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><HEAD><TITLE>Ruby script</TITLE></HEAD>"
puts "<BODY><PRE>"
puts "<div align=center><h1>A Ruby CGI index on fourth location with env variables</h1></div>"
system('env')

12. Setelah Anda menambahkan izin eksekusi pada file, mulai ulang daemon Nginx untuk menerapkan konfigurasi.

chmod +x /var/www/localhost/htdocs/fourth/index.rb
service nginx restart

Buka browser Anda dan navigasikan ke URL http://localhost/fourth/, yang akan menyajikan konten berikut kepada Anda.

Itu saja untuk saat ini, Anda telah mengonfigurasi Nginx untuk menyajikan skrip Perl, Ruby, dan Bash dinamis di FastCGI Gateway, namun, ketahuilah bahwa menjalankan skrip yang ditafsirkan seperti ini di Nginx CGI Gateway bisa berbahaya dan menimbulkan risiko keamanan yang serius pada server Anda karena skrip tersebut dijalankan menggunakan shell aktif di bawah sistem Anda, tetapi dapat memperluas penghalang statis yang dikenakan oleh HTML statis, menambahkan fungsionalitas dinamis ke situs web Anda.