Cách thiết lập cân bằng tải Nginx với kết thúc SSL
Bài viết này hướng dẫn bạn cách cài đặt cân bằng tải Nginx với kết thúc SSL chỉ với một certificate SSL trên trình cân bằng tải. Điều này sẽ giảm chi phí quản lý SSL của bạn, vì các bản cập nhật OpenSSL và các khóa và certificate hiện có thể được quản lý từ chính bộ cân bằng tải.Giới thiệu về chấm dứt SSL
Nginx có thể được cấu hình như một bộ cân bằng tải để phân phối lưu lượng đến xung quanh một số server backend . Kết thúc SSL là quá trình xảy ra trên bộ cân bằng tải, xử lý mã hóa / giải mã SSL để lưu lượng truy cập giữa bộ cân bằng tải và server backend ở HTTP. Các phần backend phải được bảo mật bằng cách hạn chế quyền truy cập vào IP của bộ cân bằng tải, điều này sẽ được giải thích ở phần sau của bài viết này.
Yêu cầu
Trong hướng dẫn này, các lệnh phải được chạy với quyền user root hoặc user có quyền sudo. Bạn có thể xem cách cài đặt điều đó trong Hướng dẫn user .
Các hướng dẫn sau được dùng để tham khảo:
Server LAMP là không bắt buộc, nhưng ta sẽ sử dụng nó làm ví dụ trong hướng dẫn này.
Cài đặt
Hướng dẫn này sử dụng 3 server sau:
Server 1 (Giao diện user )
- Hình ảnh: Ubuntu 14.04
- Tên server : loadbalancer
- IP riêng: 10.130.227.33
Server 2 ( Backend )
- Hình ảnh: Ubuntu 14.04
- Tên server : web1
- IP riêng: 10.130.227.11
Server 3 ( Backend )
- Hình ảnh: Ubuntu 14.04
- Tên server : web2
- IP riêng: 10.130.227.22
Tên domain - example.com
Tất cả các server này phải được bật mạng riêng .
Cập nhật và nâng cấp phần mềm trên cả ba server :
apt-get update && apt-get upgrade -y
Khởi động lại từng server để áp dụng các nâng cấp. Điều này rất quan trọng, vì OpenSSL cần phải sử dụng version mới nhất để được bảo mật.
Ta sẽ cài đặt một server ảo Nginx mới cho domain với module ngược dòng cân bằng tải các phần backend .
Trước khi cài đặt cân bằng tải Nginx, bạn nên cài đặt Nginx trên VPS của bạn . Bạn có thể cài đặt nó một cách nhanh chóng với apt-get
:
apt-get install nginx
Trên hai server backend , cập nhật repository của bạn và cài đặt Apache:
apt-get install apache2
Cài đặt PHP trên cả hai server backend :
apt-get install php5 libapache2-mod-php5 php5-mcrypt
Để biết thêm thông tin, hãy xem bài viết này .
Tạo khóa và tạo certificate SSL
Trong phần này, bạn sẽ thực hiện các bước cần thiết để tạo certificate SSL. Bài viết này giải thích chi tiết về certificate SSL trên Nginx.
Tạo folder certificate SSL và chuyển sang nó.
mkdir -p /etc/nginx/ssl/example.com cd /etc/nginx/ssl/example.com
Tạo private key :
openssl genrsa -des3 -out server.key 2048
Xóa passphrase (password bảo vệ) của nó:
openssl rsa -in server.key -out server.key
Tạo CSR (Yêu cầu ký certificate ):
openssl req -new -key server.key -out server.csr
Sử dụng CSR này để lấy certificate hợp lệ từ tổ chức phát hành certificate hoặc tạo certificate tự ký bằng lệnh sau.
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Sau khi thực hiện xong, folder này sẽ chứa các file sau:
- server.key - Khóa riêng tư
- ca-certs.pem - Tập hợp các certificate root và certificate trung gian của CA của bạn. Chỉ xuất trình nếu bạn nhận được certificate hợp lệ từ CA.
- server.crt - Chứng chỉ SSL cho domain của bạn
Tệp server ảo và module ngược dòng
Tạo file server ảo bên trong folder Nginx
nano /etc/nginx/sites-available/example.com
Thêm module ngược dòng chứa địa chỉ IP riêng của các server backend
upstream mywebapp1 { server 10.130.227.11; server 10.130.227.22; }
Bắt đầu khối server sau dòng này. Khối này chứa domain , các tham chiếu đến các server ngược dòng và các tiêu đề sẽ được chuyển đến phần backend .
server { listen 80; server_name example.com www.example.com; location / { proxy_pass http://mywebapp1; 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; } }
Chỉ thị proxy_set_header
được sử dụng để chuyển thông tin quan trọng về yêu cầu tới các server ngược dòng.
Lưu file này và tạo một softlink đến folder sites-enabled
.
ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
Thực hiện kiểm tra cấu hình để kiểm tra lỗi.
service nginx configtest
Nếu không có lỗi nào được hiển thị, hãy reload dịch vụ nginx.
service nginx reload
Cân bằng tải hiện đã được cấu hình cho HTTP.
Bật SSL
Thêm các lệnh sau vào file server ảo (/etc/nginx/sites-available/example.com) bên trong khối server {}
. Những dòng này sẽ được hiển thị trong ngữ cảnh trong ví dụ tiếp theo.
listen 443 ssl; ssl on; ssl_certificate /etc/nginx/ssl/example.com/server.crt; ssl_certificate_key /etc/nginx/ssl/example.com/server.key; ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem;
Bỏ qua chỉ thị ssl_trusted_certificate
nếu bạn đang sử dụng certificate tự ký. Bây giờ khối server
sẽ trông như thế này:
server { listen 80; listen 443 ssl; server_name example.com www.example.com; ssl on; ssl_certificate /etc/nginx/ssl/example.com/server.crt; ssl_certificate_key /etc/nginx/ssl/example.com/server.key; ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem; location / { proxy_pass http://mywebapp1; 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; } }
Kiểm tra lỗi cấu hình và reload dịch vụ Nginx.
service nginx configtest && service nginx reload
Bảo mật các server backend
Hiện tại, trang web được lưu trữ trên các server backend có thể được truy cập trực tiếp bởi bất kỳ ai biết địa chỉ IP công khai của nó. Điều này có thể được ngăn chặn bằng cách cấu hình các web server trên phần backend để chỉ lắng nghe trên giao diện riêng tư. Các bước để thực hiện việc này trong Apache như sau.
Chỉnh sửa file ports.conf
.
nano /etc/apache2/ports.conf
Tìm dòng sau:
Listen 80
Thay thế nó bằng địa chỉ IP riêng của server backend :
Listen 10.130.227.22:80
Thực hiện việc này trên tất cả các server backend và khởi động lại Apache.
service apache2 restart
Bước tiếp theo là hạn chế quyền truy cập HTTP vào IP riêng của trình cân bằng tải . Luật firewall sau đây đạt được điều này.
iptables -I INPUT -m state --state NEW -p tcp --dport 80 ! -s 10.130.227.33 -j DROP
Thay thế ví dụ bằng địa chỉ IP riêng của trình cân bằng tải và thực thi luật này trên tất cả các server backend .
Kiểm tra cài đặt
Tạo một file PHP trên tất cả các server backend (web1 và web2 trong ví dụ này). Điều này là để thử nghiệm và có thể được gỡ bỏ sau khi cài đặt hoàn tất.
nano /var/www/html/test.php
Nó sẽ in domain được truy cập, địa chỉ IP của server , địa chỉ IP của user và cổng được truy cập.
<?php header( 'Content-Type: text/plain' ); echo 'Host: ' . $_SERVER['HTTP_HOST'] . "\n"; echo 'Remote Address: ' . $_SERVER['REMOTE_ADDR'] . "\n"; echo 'X-Forwarded-For: ' . $_SERVER['HTTP_X_FORWARDED_FOR'] . "\n"; echo 'X-Forwarded-Proto: ' . $_SERVER['HTTP_X_FORWARDED_PROTO'] . "\n"; echo 'Server Address: ' . $_SERVER['SERVER_ADDR'] . "\n"; echo 'Server Port: ' . $_SERVER['SERVER_PORT'] . "\n\n"; ?>
Truy cập file này nhiều lần bằng trình duyệt của bạn hoặc sử dụng curl
. Sử dụng curl -k
trên các cài đặt certificate tự ký để làm cho curl bỏ qua lỗi SSL.
curl https://example.com/test.php https://example.com/test.php https://example.com/test.php
Đầu ra sẽ tương tự như sau.
Host: example.com Remote Address: 10.130.245.116 X-Forwarded-For: 117.193.105.174 X-Forwarded-Proto: https Server Address: 10.130.227.11 Server Port: 80 Host: example.com Remote Address: 10.130.245.116 X-Forwarded-For: 117.193.105.174 X-Forwarded-Proto: https Server Address: 10.130.227.22 Server Port: 80 Host: example.com Remote Address: 10.130.245.116 X-Forwarded-For: 117.193.105.174 X-Forwarded-Proto: https Server Address: 10.130.227.11 Server Port: 80
Lưu ý Địa chỉ server thay đổi theo từng yêu cầu, cho biết rằng một server khác đang phản hồi từng yêu cầu.
Tăng cường cấu hình SSL
Phần này giải thích việc cấu hình SSL theo các phương pháp hay nhất để loại bỏ các lỗ hổng bảo mật với các giao thức và mật mã cũ hơn. Các dòng riêng lẻ được hiển thị trong phần này và file cấu hình hoàn chỉnh được hiển thị trong phần cuối cùng của hướng dẫn này.
Bật cache phiên SSL cải thiện hiệu suất của các trang web HTTPS. Các lệnh sau phải được đặt sau ssl_trusted_certificate
. Chúng cho phép chia sẻ bộ nhớ đệm có kích thước 20MB với thời gian tồn tại của bộ nhớ cache là 10 phút .
ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m;
Chỉ định các giao thức và mật mã sẽ được sử dụng trong kết nối SSL. Ở đây ta đã bỏ qua SSLv2 và vô hiệu hóa các mật mã không an toàn như MD5 và DSS.
ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
Bảo mật vận tải nghiêm ngặt hướng dẫn tất cả các trình duyệt web hỗ trợ chỉ sử dụng HTTPS. Kích hoạt nó bằng chỉ thị add_header
.
add_header Strict-Transport-Security "max-age=31536000";
Kiểm tra lỗi cấu hình và reload dịch vụ Nginx.
service nginx configtest && service nginx reload
Cấu hình hoàn chỉnh
Sau khi cấu hình và củng cố kết thúc SSL, file cấu hình hoàn chỉnh sẽ giống như sau:
/etc/nginx/sites-available/ example.com
upstream mywebapp1 { server 10.130.227.11; server 10.130.227.22; } server { listen 80; listen 443 ssl; server_name example.com www.emxaple.com; ssl on; ssl_certificate /etc/nginx/ssl/example.com/server.crt; ssl_certificate_key /etc/nginx/ssl/example.com/server.key; ssl_trusted_certificate /etc/nginx/ssl/example.com/ca-certs.pem; ssl_session_cache shared:SSL:20m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS; add_header Strict-Transport-Security "max-age=31536000"; location / { proxy_pass http://mywebapp1; 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; } }
Thực hiện Kiểm tra server SSL và cài đặt này sẽ đạt điểm A +. Chạy lại bài kiểm tra độ cong để kiểm tra xem mọi thứ có hoạt động bình thường không.
curl https://example.com/test.php https://example.com/test.php https://example.com/test.php
Đọc thêm
Để tìm hiểu thêm về các thuật toán cân bằng tải, hãy đọc bài viết này .
Các tin liên quan
Cách cài đặt Laravel với web server Nginx trên Ubuntu 14.042014-06-24
Cách cài đặt gpEasy CMS với NGINX và PHP5-FPM trên Debian 7
2014-06-03
Cách sử dụng Nginx làm Giám đốc lưu lượng toàn cầu trên Debian hoặc Ubuntu
2014-05-30
Cách sử dụng HAProxy làm bộ cân bằng tải lớp 7 cho WordPress và Nginx trên Ubuntu 14.04
2014-05-27
Cách cung cấp tệp mật khẩu KeePass2 với Nginx trên server Ubuntu 14.04
2014-05-16
Cách cài đặt WordPress với Nginx trên Ubuntu 14.04
2014-05-15
Cách tạo chứng chỉ SSL trên Nginx cho Ubuntu 14.04
2014-05-09
Cách tạo chứng chỉ SSL trên Nginx cho Ubuntu 14.04
2014-05-09
Cách cài đặt Nginx trên Ubuntu 14.04 LTS
2014-04-29
Cách thiết lập server block Nginx (server ảo) trên Ubuntu 14.04 LTS
2014-04-25