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
.
Prerequisite:
- EC2 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
- 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.1114.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
Test Forward Proxy
Kita test forward proxynya dengan curl
# 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 menggunakan IP public dari server proxy tersebut (bukan dari IP kita)
Responsenya adalah IP public server proxy (52.220.x.x)
Jika ingin menggunakan proxy dari server lain 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