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 commandmake & make install
.
Prerequisites:
- EC2 Amazon Linux 2 AMI (cloud AWS)
- nginx 1.22.1
- ngx_http_proxy_connect_module
Ringkasan step:
- Masuk ke server EC2 AMI dan login sebagai root
- Download nginx 1.22.1 dari sini
- Download ngx_http_proxy_connect_module dari github
- Patching nginx
- Install dependencies untuk ngx_http_proxy_connect_module
- Buat user dan group: www
- Install nginx secara manual
- Konfigurasi Forward Proxy
- Buka port 443 pada inbound rule
- 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
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:
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
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;
}
}
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.
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
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']);
}
}