Cài đặt module Real IP cho NGINX

Cài đặt module Real IP cho NGINX trên Ubuntu

23/03/2021
66 Lượt xem

Module Real IP cho NGINX giúp NGINX ghi nhận được IP thực của người dùng khi NGINX đóng vai trò backend trong mô hình Reverse Proxy. Nếu không cài đặt module Real IP cho NGINX, hệ thống chỉ nhận biết được kết nối đến từ IP của Proxy Server (ví dụ như CloudFlare), thay vì IP của người dùng thật.

Kiểm tra module Real IP

Dùng command bên dưới để kiểm tra module ngx_http_realip_module đã được compile cùng NGINX hay chưa.

nginx -V 2>&1 | grep -o 'http_realip_module'

Nếu chưa có module này, tiến hành compile lại NGINX để add thêm module

Compile NGINX

Update system

sudo apt update && sudo apt upgrade -y

NGINX được viết bằng ngôn ngữ C, vì vậy để compile NGINX cần phải cài C compiler (GCC).

sudo apt install build-essential -y

Tải bản NGINX mới nhất tại

# Stable version
wget https://nginx.org/download/nginx-1.18.0.tar.gz && tar zxvf nginx-1.18.0.tar.gz
# Mainline version
wget https://nginx.org/download/nginx-1.19.8.tar.gz && tar zxvf nginx-1.19.8.tar.gz

NGINX cần 3 thư viện: PCRE, ZLIB và OPENSSL để compile

PCRE version 8.44

wget https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz && tar xzvf pcre-8.44.tar.gz

ZLIB version 1.2.11

wget http://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz

OPENSSL version 1.1.0j

wget https://www.openssl.org/source/openssl-1.1.0j.tar.gz && tar xzvf openssl-1.1.0j.tar.gz

Sau khi giải nén, xóa các file nén vừa tải về

rm -rf *.tar.gz

Cài đặt module Real IP cho NGINX

Di chuyển tới thư mục chứa source code NGINX

cd ~/nginx-1.18.0

Để giữ lại vị trí các file config, danh sách các module sau khi build giống với môi trường hiện tại, ta dùng lệnh sau để lấy compile string của phiên bản NGINX đang chạy:

nginx -V

Copy lại compile string bắt đầu từ sau đoạn “configure arguments:” cho đến hết, và chèn thêm “–with-http_realip_module” ở cuối để enable module http_realip_module

./configure --prefix=/usr/share/nginx \
            --sbin-path=/usr/bin/nginx \
            --modules-path=/usr/lib/nginx/modules \
            --conf-path=/etc/nginx/nginx.conf \
            --error-log-path=/var/log/nginx/error.log \
            --http-log-path=/var/log/nginx/access.log \
            --pid-path=/run/nginx.pid \
            --lock-path=/var/lock/nginx.lock \
            --user=www-data \
            --group=www-data \
            --build=Ubuntu \
            --http-client-body-temp-path=/var/lib/nginx/body \
            --http-fastcgi-temp-path=/var/lib/nginx/fastcgi \
            --http-proxy-temp-path=/var/lib/nginx/proxy \
            --http-scgi-temp-path=/var/lib/nginx/scgi \
            --http-uwsgi-temp-path=/var/lib/nginx/uwsgi \
            --with-openssl=../openssl-1.1.0j \
            --with-openssl-opt=enable-ec_nistp_64_gcc_128 \
            --with-openssl-opt=no-nextprotoneg \
            --with-openssl-opt=no-weak-ssl-ciphers \
            --with-openssl-opt=no-ssl3 \
            --with-pcre=../pcre-8.44 \
            --with-pcre-jit \
            --with-zlib=../zlib-1.2.11 \
            --with-compat \
            --with-file-aio \
            --with-threads \
            --with-http_addition_module \
            --with-http_auth_request_module \
            --with-http_dav_module \
            --with-http_flv_module \
            --with-http_gunzip_module \
            --with-http_gzip_static_module \
            --with-http_mp4_module \
            --with-http_random_index_module \
            --with-http_slice_module \
            --with-http_ssl_module \
            --with-http_sub_module \
            --with-http_stub_status_module \
            --with-http_v2_module \
            --with-http_secure_link_module \
            --with-mail \
            --with-mail_ssl_module \
            --with-stream \
            --with-stream_realip_module \
            --with-stream_ssl_module \
            --with-stream_ssl_preread_module \
            --with-debug \
            --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' \
            --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' \
            --with-http_realip_module \

Tiến hành Compile

make && sudo make install

Xóa các thư mục source code đã được compile xong

cd ~

rm -r nginx-1.18.0/ openssl-1.1.0j/ pcre-8.44/ zlib-1.2.11/

mkdir -p /var/lib/nginx && sudo nginx -t

Kiểm tra NGINX Version và compile string

sudo nginx -v && sudo nginx -V

Output

nginx version: nginx/1.18.0 (Ubuntu)
built by gcc 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
built with OpenSSL 1.1.0j  20 Nov 2018
TLS SNI support enabled
configure arguments: --prefix=...
...

Chạy lại command để check module http_realip đã được compile cùng NGINX hay chưa

nginx -V 2>&1 | grep -o 'http_realip_module'

Tạo Systemd service cho NGINX

Chạy command để mở file nginx.service

sudo vim /etc/systemd/system/nginx.service

Paste nội dung bên dưới vào cửa sổ vim vừa mở

[Unit]
Description=A high performance web server and a reverse proxy server
After=network.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/bin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/bin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/bin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/bin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

Start nginx và tùy chọn để nginx khởi động cùng hệ thống

sudo systemctl start nginx.service
sudo systemctl enable nginx.service

Hoàn tất.