Thiết lập nginx proxy cho prometheus và grafana

Bài viết này là phần 2 trong 14 phần của serie bài viết Cài đặt Prometheus và Grafana trên Ubuntu 18

ToiVietBlog - Bài viết này ta sẽ thiết lập nginx proxy cho prometheus và grafana. Ở bài viết trước, bạn có thể truy cập prometheus và grafana thông qua IP:Port. Tuy nhiên, việc này không đảm bảo an toàn cho hệ thống của bạn; đặc biệt là khi bạn sử dụng public cloud để dựng hệ thống monitor.

Vì sao lại nói nó không an toàn, vì giao thức mà bạn đang truy cập là HTTP, đồng nghĩa tài khoản login grafana có thể bị người khác sniff khi đi qua mạng.

Vì thế mà bạn cần một lớp nginx proxy sử dụng SSL.

Chuẩn bị máy chủ

Ở đây mình vẫn sẽ sử dụng máy chủ đã cài đặt Prometheus và Grafana.

Nếu bạn đã có server nginx proxy sẵn thì bạn có thể sử dụng nó, nếu không bạn có thể tạo riêng một server mới.

  • 1 vCPU
  • 1 GB RAM
  • 20(40) GB HDD
  • OS: Ubuntu server 18.04
  • User: root
thiet-lap-nginx-proxy-cho-prometheus-va-grafana Thiết lập nginx proxy cho prometheus và grafana
Thiết lập nginx proxy cho prometheus và grafana.

Cài đặt nginx trên Ubuntu 18

Ta sử dụng nginx để làm lớp reverse proxy.

Thêm repository nginx vào server.

apt install curl gnupg2 ca-certificates lsb-release -y
echo "deb http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
apt update

Cài đặt nginx.

apt install nginx nginx-module-geoip -y

Kích hoạt và khởi động dịch vụ nginx.

systemctl enable nginx && systemctl start nginx

Thiết lập các cấu hình cho nginx

Hầu hết mọi người khi cài đặt nginx đều sẽ để các file cấu hình mặc định, điều này không nên khi sử dụng cho các hệ thống production.

Dưới đây mình sẽ hướng dẫn các bạn thiết lập cho nginx proxy.

Đầu tiên, tạo một số thư mục cần thiết.

rm -f /etc/nginx/conf.d/default.conf
mkdir -p /etc/nginx/conf.d/resource
mkdir -p /etc/nginx/conf.d/01_default_system
mkdir -p /etc/nginx/conf.d/02_real_domain
mkdir -p /etc/nginx/certificate-ssl/ssl-selfcert
mkdir -p /etc/nginx/dh-selfcert
mkdir /var/log/nginx/real_domain

Tiếp theo, tạo các chứng chỉ SSL local.

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/certificate-ssl/ssl-selfcert/private.key -out /etc/nginx/certificate-ssl/ssl-selfcert/server.crt
openssl dhparam -out /etc/nginx/dh-selfcert/dhparams.pem 4096

Thêm 2 dòng sau vào cuối file /etc/nginx/nginx.conf.

include /etc/nginx/conf.d/01_default_system/*.conf;
include /etc/nginx/conf.d/02_real_domain/*.conf;

Ta tạo file thông số proxy pass, file này được sử dụng chung cho các file virtual host sau này.

nano /etc/nginx/conf.d/resource/proxypass.inc

Copy nội dung dưới vào file proxypass.inc.

proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header            X-Forwarded-Proto $scheme;
proxy_set_header            Proxy "";
proxy_connect_timeout       120s;
proxy_send_timeout          12s;
proxy_read_timeout          12s;
proxy_buffer_size           32k;
proxy_buffers               64 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;
proxy_max_temp_file_size    1024m;
proxy_redirect              off;

Tạo tiếp file thông số ssl.

nano /etc/nginx/conf.d/resource/letencrypt_ssl.inc

Copy nội dung dưới vào file letencrypt_ssl.inc.

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam     /etc/nginx/dh-selfcert/dhparams.pem;
ssl_ecdh_curve  secp384r1;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA512:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:ECDH+AESGCM:ECDH+AES256:DH+AESGCM:DH+AES256:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;

Ta tạo file config default thay thế cho file mặc định đã bị xóa ở trên.

nano /etc/nginx/conf.d/01_default_system/local.conf

Copy nội dung vào file local.conf.

server {

    ##### LOẠI BỎ TRUY CẬP CÁC DOMAIN KHÔNG HỢP LỆ #####
    ###################################################

    listen 80 default_server;
    listen 443 ssl default_server;
    server_name _;
    ssl_certificate /etc/nginx/certificate-ssl/ssl-selfcert/server.crt;
    ssl_certificate_key /etc/nginx/certificate-ssl/ssl-selfcert/private.key;
    return 444;

    ##### THIẾT LẬP BLOCK METHOD #####
    ##################################

    # Do not accept DELETE, SEARCH and other methods
    if ($request_method !~ ^(GET|HEAD|POST)$ ) {
        return 444;
    }

    ##### THIẾT LẬP BLOCK AGENT/BOT #####
    #####################################

    # Block download agents
    if ($http_user_agent ~* LWP::Simple|BBBike|wget) {
        return 444;
    }

    # Block some robots
    if ($http_user_agent ~* msnbot|scrapbot) {
        return 444;
    }

    # Deny certain Referers
    if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ) {
        return 444;
    }
}

server {

    listen 80;
    server_name localhost;

    location / {
        allow 127.0.0.1;
        deny all;
    }

    location /basic_status {
        allow 127.0.0.1;
        deny all;
        stub_status;
        access_log off;
    }
}

Tạo file virtual host mẫu để đăng kí cert ssl.

nano /etc/nginx/conf.d/resource/letencrypt.conf.example

Copy nội dung dưới vào file letencrypt.conf.example.

server {
    listen 80;
    server_name abc.com www.abc.com;

    root /etc/nginx/letencrypt-domain/letencrypt;

    location / {
        index index.html;
    }

    location ~ /.well-known {
        allow all;
    }
}

Tạo thư mục default cho cert ssl.

mkdir -p /etc/nginx/letencrypt-domain/letencrypt/.well-known
chown -R nginx:nginx /etc/nginx/letencrypt-domain/*

Cài đặt Let’s Encrypt cho nginx proxy trên Ubuntu 18

Như đã nói ở trên, ta sử dụng nginx proxy với SSL. Nếu không sử dụng SSL thì việc cài đặt nginx proxy cũng không có ý nghĩa gì.

Ở đây, ta sẽ sử dụng chứng chỉ Let’s Encrypt miễn phí. Nếu bạn có chứng chỉ đã mua (commercial) thì có thể không cần thực hiện đoạn này.

Ta thêm repository Certbot và thực hiện cài đặt gói certbot dành cho web server nginx.

apt-get install software-properties-common -y
add-apt-repository universe
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install certbot python-certbot-nginx -y

Tạo chứng chỉ SSL cho domain Prometheus và Grafana

Giả sử mình sẽ sử dụng 2 domain cho Prometheus và Grafana như sau:

  • prometheus.example.com
  • grafana.example.com

Bạn thực hiện lại các bước dưới đây cho từng domain nhé.

Copy file ssl mẫu cho domain mới.

cd /etc/nginx/conf.d/02_real_domain/
cp ../resource/letencrypt.conf.example 01.conf

Thay thế domain name bên trong file config virtual host tạm thời. Lệnh dưới sẽ thay thế từ abc (trong abc.com) thành prometheus.example (trong prometheus.example.com mà ta đã đặt ở trên).

sed -i 's|abc|prometheus.example|g' 01.conf

Reload nginx và đăng kí chứng chỉ SSL. Nhớ thay địa chỉ email và domain thật vào lệnh đăng kí SSL ở dưới.

service nginx reload
certbot certonly --webroot --webroot-path=/etc/nginx/letencrypt-domain/letencrypt --email yourmail@example.com --agree-tos -d prometheus.example.com

Sau khi đăng kí chứng chỉ SSL thành công, bạn tạo file virtual host cho domain prometheus.

rm -f 01.conf
nano /etc/nginx/conf.d/02_real_domain/prometheus.example.com.conf

Copy nội dung dưới vào file virtual host. Bạn nhớ thay domain thật của bạn vào file dưới nhé.

upstream prometheus.example.com {
    server 127.0.0.1:9090 max_fails=2 fail_timeout=5s;
}

server {
    listen 80;
    server_name prometheus.example.com www.prometheus.example.com;
    return 301 https://prometheus.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name prometheus.example.com www.prometheus.example.com;

    if ($host = 'www.prometheus.example.com') {
        return 301 https://prometheus.example.com$request_uri;
    }

    include /etc/nginx/conf.d/resource/letencrypt_ssl.inc;
    ssl_certificate         /etc/letsencrypt/live/prometheus.example.com/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/prometheus.example.com/privkey.pem;

    error_log	/var/log/nginx/real_domain/prometheus.example.com.error.log;
    access_log	/var/log/nginx/real_domain/prometheus.example.com.access.log vhost;

    location / {
        proxy_pass   http://prometheus.example.com;
        include /etc/nginx/conf.d/resource/proxypass.inc;
    }

    location /.well-known/acme-challenge/ {
        root /etc/nginx/letencrypt-domain/letencrypt;
        default_type text/plain;
    }
}

Kiểm tra và reload cấu hình nginx.

nginx -t
service nginx reload

Tới đây thì bạn đã hoàn thành việc đăng kí SSL và tạo virtual host trên proxy cho domain prometheus. Bạn lặp lại các bước vừa rồi với domain grafana, hoặc các domain khác mà bạn muốn.

Kết luận

Bây giờ bạn đã có thể mở trình duyệt và truy cập prometheus, grafana thông qua domain đã đặt. Giao thức truy cập sử dụng là HTTPS nên bạn có thể yên tâm dữ liệu được truyền mã hóa. Đồng thời thì việc sử dụng proxy cũng chuyên nghiệp hơn việc bạn truy cập bằng IP:Port phải không.

Tiếp tục đọc serie bài viết«« Phần trước: Cài đặt Prometheus và Grafana trên Ubuntu 18Phần tiếp theo: Thiết lập htpasswd bảo vệ cho Prometheus »»
0 0 votes
Article Rating
Nhấn vào đây để đánh giá bài này!
[Tổng: 0 - Trung bình: 0]

If you appreciate what we share in this blog, you can support us by:
  1. Stay connected to: Facebook | Twitter | Google Plus | YouTube
  2. Subscribe email to recieve new posts from us: Sign up now.
  3. Start your own blog with SSD VPS - Free Let's Encrypt SSL ($2.5/month).
  4. Become a Supporter - Make a contribution via PayPal.
  5. Support us by purchasing Ribbon Lite Child theme being using on this website.

We are thankful for your support.

«« »»
Theo dõi
Thông báo về
guest
0 Comments
Inline Feedbacks
View all comments