0

Install nginx forward proxy di EC2 AMI – Cloud AWS

nginx forward proxy
nginx forward proxy


Nginx secara default tidak support forward proxy. Untungnya ada yang menyediakan module forward proxy ngx_http_proxy_connect_module.

Disini kita akan coba install nginx dengan module ngx_http_proxy_connect_module.

Catatan: Disini cara instalasinya akan berbeda, bukan menggunakan yum install nginx, tapi manual menggunakan source yang didownload dari http://nginx.org/download/. Kenapa manual? karena butuh dicompile dulu nginxnya, setelah itu baru bisa diinstal menggunakan command make & make install.


Prerequisites:

  • EC2 Amazon Linux 2 AMI (cloud AWS)
  • nginx 1.22.1
  • ngx_http_proxy_connect_module


Ringkasan step:

  1. Masuk ke server EC2 AMI dan login sebagai root
  2. Download nginx 1.22.1 dari sini
  3. Download ngx_http_proxy_connect_module dari github
  4. Patching nginx
  5. Install dependencies untuk ngx_http_proxy_connect_module
  6. Buat user dan group: www
  7. Install nginx secara manual
  8. Konfigurasi Forward Proxy
  9. Buka port 443 pada inbound rule
  10. Test Forward Proxy


Mari kita mulai

Masuk ke server EC2 AMI dan login sebagai root

  • Silahkan masuk ke server ec2 ami menggunakan ssh, bisa menggunakan ssh <user>@<ip>
  • Login sebagai root, gunakan command sudo su
  • Saya arahkan ke folder /home/ec2-user untuk area kerja saya

Download nginx 1.22.1

Download nginx 1.22.1 menggunakan wget

# wget http://nginx.org/download/nginx-1.22.1.tar.gz

Lalu extract

# tar -xzvf nginx-1.22.1.tar.gz

Download ngx_http_proxy_connect_module dari github

Untuk mendownload module ngx_http_proxy_connect_module kita memerlukan git. Jadi install gitnya terlebih dahulu

# yum install git

Setelah itu kita download modulenya

# git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
nginx forward proxy

Patching nginx

Sesuai intruksi dari https://github.com/chobits/ngx_http_proxy_connect_module#select-patch, kita harus patch nginxnya menggunakan file proxy_connect yang sudah disediakan.

Supaya lebih mudah saya copas tablenya ke sini:

nginx forward proxy

Karena kita menggunakan nginx versi 1.22.1 maka kita gunakan proxy_connect_rewrite_102101.patch

Untuk mempatch, kita harus install dulu patchnya:

# yum install patch
# patch --version

Baru kemudian kita lakukan patching terhadap nginx:

# cd nginx-1.22.1
# patch -p1 < /home/ec2-user/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_102101.patch

Install dependencies untuk ngx_http_proxy_connect_module

Module ngx_http_proxy_connect_module memerlukan beberapa dependensi, jadi kita harus install dulu dependensinya:

# yum install gcc
# yum install pcre-devel
# yum install openssl-devel
# yum install zlib-devel

Buat user dan group: www

Nantinya nginx akan menggunakan user www. Jadi kita harus buat dulu user dan groupnya

# groupadd www
# useradd -g www www

Install nginx secara manual

Ada 2 step disini:

  • setup konfigurasi nginx
  • install nginx manual

Setup konfigurasi nginx

# cd nginx-1.22.1

Jalankan command berikut untuk mengeset konfigurasi nginx:

# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-threads --add-module=/home/ec2-user/ngx_http_proxy_connect_module

Penjelasan:

  • ./configure didalam folder nginx-1.22.1 ada file shellscript yang namanya configure untuk menkonfigurasikan nginx sesuai parameter yang kita set
  • --user=www --group=www kita gunakan user www untuk nginx (bukan user root)
  • --prefix=/user/local/nginx path mau dimana nginx diinstall
  • --with-http_ssl_module install module ssl
  • --with-http_stub_status_module install module stub status
  • --with-http_realip_module install module realip
  • --add-module=/home/ec2-user/ngx_http_proxy_connect_module, ini yang paling penting, tambahkan module ngx_http_proxy_connect_module ke dalam nginx


Kalau sudah selesai prosesnya, outputnya akan seperti ini:

Install nginx manual

Masih didalam folder nginx-1.22.1 jalankan command berikut untuk menginstall nginx:

# make & make install

Check versi nginx jika sudah berhasil diinstall

# /usr/local/nginx/sbin/nginx -V

Create link supaya nginx langsung bisa menjalankan executable tanpa path (/usr/local/nginx/sbin/nginx)

# ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

Cek versi nginx tanpa path

# nginx -V

Create file di init.d untuk nginx sesuai intruksi dari https://www.cnblogs.com/stulzq/p/9291223.html?spm=a2c65.11461447.0.0.38917e3eqZlI73 untuk membuat systemd nginx

vi /etc/init.d/nginx

Isikan dengan content berikut :

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /usr/local/nginx/conf/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -z "`grep $user /etc/passwd`" ]; then
       useradd -M -s /bin/nologin $user
   fi
   options=`$nginx -V 2>&1 | grep 'configure arguments:'`
   for opt in $options; do
       if [ `echo $opt | grep '.*-temp-path'` ]; then
           value=`echo $opt | cut -d "=" -f 2`
           if [ ! -d "$value" ]; then
               # echo "creating" $value
               mkdir -p $value && chown -R $user $value
           fi
       fi
   done
}
start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
restart() {
    configtest || return $?
    stop
    sleep 1
    start
}
reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}
force_reload() {
    restart
}
configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}
case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

Lalu jalankan command berikut:

# chmod a+x /etc/init.d/nginx
# chkconfig --add /etc/init.d/nginx
# chkconfig nginx on
# systemctl start nginx

Nginx sudah berhasil dinyalakan

nginx forward proxy

Konfigurasi Forward Proxy

Tambahkan konfigurasi forward proxy di nginx.conf:

# vi /usr/local/nginx/conf/nginx.conf

Isikan dengan content berikut:

        server {
                listen  443;
 
                # dns resolver used by forward proxying
                resolver  114.114.114.114;

                # forward proxy for CONNECT request
                proxy_connect;
                proxy_connect_allow            443;
                proxy_connect_connect_timeout  10s;
                proxy_connect_read_timeout     10s;
                proxy_connect_send_timeout     10s;

                # forward proxy for non-CONNECT request
                location / {
                        proxy_pass http://$host;
                        proxy_set_header Host $host;
                }
        }
nginx forward proxy

Kita set port proxynya 443. Kalian bisa ganti portnya sesuai keinginan kalian, misal port 6443, 8080, dll.

Untuk resolvernya saya menggunakan alibabacloud (sesuai artikel https://www.cnblogs.com/stulzq/p/9291223.html?spm=a2c65.11461447.0.0.38917e3eqZlI73). Bisa diganti resolvernya ke 8.8.8.8 (google).

Restart nginx

# systemctl restart nginx

Buka port 443 pada inbound rule

Pada konfigurasi nginx forward proxy diatas, kita mengeset listen 443. Artinya nginx bisa diakses menggunakan port 443.

Pastikan port 443 sudah ditambakan pada inbound rule di security group.

port for nginx forward proxy

Test Forward Proxy

Kita test forward proxynya dengan curl

Dari server proxy ke latcoding.com

Pertama kita test dari local server proxy yang di hit ke latcoding.com (saya sudah menyediakan script pendeteksi IP client disana), untuk memastikan terlebih dahulu apakah parameter -x (proxy) sudah berfungsi dengan baik.

# curl https://www.latcoding.com/test/test_proxy/check_1p.php -x localhost:443

Penjelasan:

  • Kita akses latcoding.com menggunakan proxy localhost:443
  • Artinya kita mengakses latcoding.com dari IP public dari server proxy tersebut
nginx forward proxy

Responsenya adalah REMOTE_ADDR: 52.220.x.x yang merupakan IP public server proxy.

Dari server lain dalam 1 network (VPC)

Jika ingin menggunakan proxy dari server lain (masih dalam 1 VPC), tinggal ganti saja localhost ke private IPnya server proxy:

$ curl https://www.latcoding.com/test/test_proxy/check_1p.php -x <private ip server proxy>:443

Dari local komputer ke latcoding.com

Disini saya menggunakan Guzzle pada framework Codeigniter 3 (PHP). Contoh scriptnya adalah sebagai berikut:

<?php
use GuzzleHttp\Client;

class Test extends CI_Controller {

    public function index() {
        $client = new GuzzleHttp\Client(['base_uri' => 'https://www.latcoding.com/test/test_proxy/']);
        $response = $client->request('GET', 'check_1p.php', ['proxy' => 'http://<public IP server proxy>:443']);
    }
}

Ambar Hasbiyatmoko

Hello, I'm web developer. Passionate about programming, web server, and networking.

Leave a Reply

Your email address will not be published. Required fields are marked *

Time limit is exhausted. Please reload the CAPTCHA.