Giới thiệu

LXD (phát âm là “Lex-Dee”) là trình quản lý vùng chứa hệ thống được xây dựng trên Linux Containers (LXC) được Canonical hỗ trợ . Mục tiêu của LXD là cung cấp trải nghiệm tương tự như máy ảo nhưng thông qua container hóa thay vì ảo hóa phần cứng. So với Docker để phân phối ứng dụng, LXD cung cấp chức năng hệ điều hành gần như đầy đủ với các tính năng bổ sung như ảnh chụp nhanh, di chuyển trực tiếp và quản lý lưu trữ.

Proxy ngược là máy chủ nằm giữa các ứng dụng nội bộ và máy khách bên ngoài, chuyển tiếp các yêu cầu của máy khách đến máy chủ thích hợp. Mặc dù nhiều ứng dụng phổ biến, chẳng hạn như Node.js, có thể hoạt động như máy chủ riêng, nhưng chúng có thể thiếu một số tính năng cân bằng tải, bảo mật và tăng tốc nâng cao.

Hướng dẫn này giải thích cách tạo proxy ngược trong vùng chứa LXD để lưu trữ nhiều trang web, mỗi trang web trong vùng chứa bổ sung của riêng chúng. Bạn sẽ sử dụng máy chủ web NGINX và Apache, đồng thời dựa vào NGINX làm proxy ngược.

Vui lòng tham khảo sơ đồ sau để hiểu về proxy ngược được tạo trong hướng dẫn này.

Diagram of LXD reverse proxy and web servers

Trong hướng dẫn này bạn sẽ:

Ghi chú: Để đơn giản, thuật ngữ container được sử dụng trong toàn bộ hướng dẫn này để mô tả các container của hệ thống LXD.

Trước khi bạn bắt đầu

1.Hoàn thành Hướng dẫn dành cho người mới bắt đầu về LXD: Thiết lập máy chủ web Apache trong vùng chứa . Hướng dẫn hướng dẫn bạn tạo vùng chứa được gọi webbằng máy chủ web Apache cho mục đích thử nghiệm. Xóa vùng chứa này bằng cách chạy các lệnh sau.

lxc stop web
lxc delete web

Ghi chú

Đối với hướng dẫn này, cần có LXD phiên bản 3.3 trở lên. Kiểm tra phiên bản bằng lệnh sau:

lxd --version

Nếu phiên bản không phải là 3.3 hoặc mới hơn, hãy cập nhật lên phiên bản mới nhất bằng cách cài đặt gói snap theo hướng dẫn trong Hướng dẫn dành cho người mới bắt đầu về LXD: Thiết lập máy chủ web Apache trong vùng chứa và sử dụng lệnh sau:

sudo lxd.migrate

2.Hướng dẫn này sử dụng tên máy chủ apache1.example.comvà nginx1.example.comcho hai trang web ví dụ. Thay thế các tên này bằng tên máy chủ bạn sở hữu và thiết lập mục nhập DNS của chúng để trỏ chúng đến địa chỉ IP của máy chủ bạn đã tạo. Để được trợ giúp về DNS, hãy xem Hướng dẫn về Trình quản lý DNS của chúng tôi .

Tạo các Container

1.Tạo hai container có tên là apache1và nginx1, một container với máy chủ web Apache và một container với máy chủ web NGINX. Đối với bất kỳ trang web bổ sung nào, bạn có thể tạo container mới với phần mềm máy chủ web đã chọn.

lxc launch ubuntu:18.04 apache1
lxc launch ubuntu:18.04 nginx1

2.Tạo proxyvùng chứa cho proxy ngược.

lxc launch ubuntu:18.04 proxy

3.Liệt kê các container bằng lệnh list.

lxc list

4.Kết quả trông tương tự như sau.

+---------+---------+---------------------+-----------------------------------------------+------------+-----------+
|  NAME   |  STATE  |        IPV4         |                     IPV6                      |    TYPE    | SNAPSHOTS |
+---------+---------+---------------------+-----------------------------------------------+------------+-----------+
| apache1 | RUNNING | 10.10.10.204 (eth0) | fd42:67a4:b462:6ae2:216:3eff:fe01:1a4e (eth0) | PERSISTENT |           |
+---------+---------+---------------------+-----------------------------------------------+------------+-----------+
| nginx1  | RUNNING | 10.10.10.251 (eth0) | fd42:67a4:b462:6ae2:216:3eff:febd:67e3 (eth0) | PERSISTENT |           |
+---------+---------+---------------------+-----------------------------------------------+------------+-----------+
| proxy   | RUNNING | 10.10.10.28 (eth0)  | fd42:67a4:b462:6ae2:216:3eff:fe00:252e (eth0) | PERSISTENT |           |
+---------+---------+---------------------+-----------------------------------------------+------------+-----------+
  1. Có ba container, tất cả đều ở trạng thái CHẠY – mỗi container có địa chỉ IP riêng. Lưu ý các địa chỉ IP (cả IPv4 và IPv6) cho container proxy. Bạn sẽ cần chúng để cấu hình proxycontainer trong phần sau.Bây giờ các container đã được tạo, các bước sau đây sẽ trình bày chi tiết cách thiết lập phần mềm máy chủ web trong các container apache1và nginx1, và proxycontainer để có thể truy cập máy chủ web từ Internet.

Cấu hình Container Máy chủ Web Apache

Khi sử dụng proxy ngược trước máy chủ web, máy chủ web không biết địa chỉ IP của khách truy cập. Máy chủ web chỉ nhìn thấy địa chỉ IP của proxy ngược. Tuy nhiên, mỗi máy chủ web đều có cách để xác định địa chỉ IP từ xa thực sự của khách truy cập. Đối với Apache, điều này được thực hiện bằng mô-đun Remote IP Apache. Để mô-đun hoạt động, proxy ngược phải được cấu hình để truyền thông tin địa chỉ IP từ xa.

1.Bắt đầu một vỏ trong apache1thùng chứa.

lxc exec apache1 -- sudo --user ubuntu --login

2.Cập nhật danh sách gói trong apache1container.

sudo apt update

3.Cài đặt gói apache2 vào vùng chứa.

sudo apt install -y apache2

4.Tạo tập tin /etc/apache2/conf-available/remoteip.conf.

RemoteIPHeader X-Real-IP
RemoteIPTrustedProxy 10.10.10.28 fd42:67a4:b462:6ae2:216:3eff:fe00:252e

Bạn có thể sử dụng nanotrình soạn thảo văn bản bằng cách chạy lệnh sudo nano /etc/apache2/conf-available/remoteip.conf. Lưu ý, đây là các địa chỉ IP của proxyvùng chứa được hiển thị trước đó, cho cả IPv4 và IPv6. Thay thế chúng bằng các IP từ lxc listđầu ra của bạn.

Ghi chú: Thay vì chỉ định địa chỉ IP, bạn cũng có thể sử dụng hostname proxy.lxd. Tuy nhiên, mô-đun RemoteIP Apache có đặc điểm riêng khi sử dụng hostname và chỉ sử dụng một trong hai địa chỉ IP (IPv4 hoặc IPv6), nghĩa là máy chủ web Apache không biết địa chỉ IP nguồn thực sự cho một số kết nối. Bằng cách liệt kê rõ ràng cả địa chỉ IPv4 và IPv6, bạn có thể chắc chắn rằng RemoteIP chấp nhận thành công thông tin IP nguồn từ tất cả các kết nối của proxy ngược.

5.Kích hoạt cấu hình mới remoteip.conf.

sudo a2enconf remoteip
Enabling conf remoteip.
To activate the new configuration, you need to run:
systemctl reload apache2

6.Kích hoạt remoteipmô-đun Apache.

sudo a2enmod remoteip
Enabling module remoteip.
To activate the new configuration, you need to run:
systemctl restart apache2

7.Chỉnh sửa trang web mặc định cho Apache để tham chiếu đến việc nó chạy bên trong vùng chứa LXD.

sudo nano /var/www/html/index.html

Đổi dòng “It works!” (dòng số 224) thành “It works inside a LXD container!” Lưu và thoát.

8.Khởi động lại máy chủ web Apache.

sudo systemctl reload apache2

9.Thoát trở lại máy chủ.

exit

Bạn đã tạo và cấu hình máy chủ web Apache, nhưng máy chủ vẫn chưa thể truy cập được từ Internet. Máy chủ sẽ có thể truy cập được sau khi bạn cấu hình proxyvùng chứa ở phần sau.

Tạo Container Máy chủ Web NGINX

Giống như Apache, NGINX không biết địa chỉ IP của khách truy cập khi sử dụng proxy ngược trước máy chủ web. Thay vào đó, nó chỉ thấy địa chỉ IP của proxy ngược. Mỗi phần mềm máy chủ web NGINX có thể xác định địa chỉ IP từ xa thực sự của khách truy cập bằng mô-đun IP thực. Để mô-đun hoạt động, proxy ngược phải được cấu hình phù hợp để truyền thông tin liên quan đến địa chỉ IP từ xa.

1.Bắt đầu một vỏ trong nginx1thùng chứa.

lxc exec nginx1 -- sudo --user ubuntu --login

2.Cập nhật danh sách gói trong nginx1container.

sudo apt update

3.Cài đặt NGINX vào container.

sudo apt install -y nginx

4.Tạo tập tin /etc/nginx/conf.d/real-ip.conf.

real_ip_header    X-Real-IP;
set_real_ip_from  proxy.lxd;

Bạn có thể sử dụng nanotrình soạn thảo văn bản bằng cách chạy lệnh sudo nano /etc/nginx/conf.d/real-ip.conf.

Ghi chú: Bạn đã chỉ định tên máy chủ của proxy ngược, proxy.lxd. Mỗi vùng chứa LXD tự động nhận được một tên máy chủ, là tên của vùng chứa cộng với hậu tố .lxd. Bằng cách chỉ định set_real_ip_fromtrường có proxy.lxd, bạn đang hướng dẫn máy chủ web NGINX chấp nhận thông tin địa chỉ IP thực cho mỗi kết nối, miễn là kết nối đó bắt nguồn từ proxy.lxd. Thông tin địa chỉ IP thực được tìm thấy trong tiêu đề HTTP X-Real-IPtrong mỗi kết nối.

5.Chỉnh sửa trang web mặc định cho NGINX để tạo tham chiếu rằng nó chạy bên trong vùng chứa LXD.

sudo nano /var/www/html/index.nginx-debian.html

Đổi dòng “Welcome to nginx!” (dòng số 14) thành “Welcome to nginx running in a LXD system container!”. Lưu và thoát.

6.Khởi động lại máy chủ web NGINX.

sudo systemctl reload nginx

7.Thoát trở lại máy chủ.

exit

Bạn đã tạo và cấu hình máy chủ web NGINX, nhưng máy chủ vẫn chưa thể truy cập được từ Internet. Bạn có thể truy cập được sau khi cấu hình proxycontainer trong phần tiếp theo.

Thiết lập Proxy ngược

Trong phần này, bạn sẽ cấu hình container proxy. Bạn sẽ cài đặt NGINX và thiết lập nó như một proxy ngược, sau đó thêm thiết bị proxy LXD thích hợp để đưa cả hai cổng 80 và 443 ra internet.

1.Thêm thiết bị proxy LXD để chuyển hướng kết nối từ internet đến cổng 80 (HTTP) và 443 (HTTPS) trên máy chủ đến các cổng tương ứng tại proxyvùng chứa.

lxc config device add proxy myport80 proxy listen=tcp:0.0.0.0:80 connect=tcp:127.0.0.1:80 proxy_protocol=true
 lxc config device add proxy myport443 proxy listen=tcp:0.0.0.0:443 connect=tcp:127.0.0.1:443 proxy_protocol=true
Device myport80 added to proxy
Device myport443 added to proxy

Lệnh này lxc config device addlấy các đối số sau:

Lý lẽGiải thích
proxyTên của container.
myport80Tên cho thiết bị proxy này.
proxyLoại thiết bị LXD ( thiết bị proxy LXD ).
listen=tcp:0.0.0.0:80Thiết bị proxy lắng nghe máy chủ (mặc định) trên cổng 80, giao thức TCP, trên tất cả các giao diện.
connect=tcp:127.0.0.1:80Thiết bị proxy kết nối với container trên cổng 80, giao thức TCP, trên giao diện vòng lặp. Trong các phiên bản trước của LXD, bạn có thể chỉ định localhosttại đây. Tuy nhiên, trong LXD 3.13 hoặc mới hơn, bạn chỉ có thể chỉ định địa chỉ IP.
proxy_protocol=trueYêu cầu bật giao thức PROXY để proxy ngược nhận được địa chỉ IP gốc từ thiết bị proxy.

Ghi chú

Nếu bạn muốn xóa thiết bị proxy, hãy sử dụng lxc config device remove. Nếu bạn muốn xóa thiết bị trên myport80, hãy chạy lệnh sau:

lxc config device remove proxy myport80

Trong đó proxy là tên của vùng chứa và myport80 là tên của thiết bị.

2.Bắt đầu một vỏ trong proxythùng chứa.

lxc exec proxy -- sudo --user ubuntu --login

3.Cập nhật danh sách gói.

sudo apt update

4.Cài đặt NGINX vào container.

sudo apt install -y nginx

5.Đăng xuất khỏi container.

logout

Lưu lượng truy cập trực tiếp đến máy chủ web Apache từ Proxy ngược

Bộ chứa proxy ngược đang chạy và gói NGINX đã được cài đặt. Để hoạt động như một proxy ngược, hãy thêm cấu hình trang web phù hợp để NGINX có thể xác định (bên server_namedưới) tên máy chủ phù hợp, sau đó chuyển ( proxy_passbên dưới) kết nối đến bộ chứa LXD phù hợp.

1.Bắt đầu một vỏ trong proxythùng chứa.

lxc exec proxy -- sudo --user ubuntu --login

2.apache1.example.comTạo tệp /etc/nginx/sites-available/để cấu hình trang web đầu tiên của bạn.

server {
        listen 80 proxy_protocol;
        listen [::]:80 proxy_protocol;

        server_name apache1.example.com;

        location / {
                include /etc/nginx/proxy_params;

                proxy_pass http://apache1.lxd;
        }

        real_ip_header proxy_protocol;
        set_real_ip_from 127.0.0.1;
}

Bạn có thể chạy sudo nano /etc/nginx/sites-available/apache1.example.comđể mở trình soạn thảo văn bản và thêm cấu hình. Lưu ý, trong trường hợp này bạn chỉ cần chỉnh sửa server_namethành tên máy chủ của trang web.

3.Kích hoạt trang web.

sudo ln -s /etc/nginx/sites-available/apache1.example.com /etc/nginx/sites-enabled/

4.Khởi động lại proxy ngược NGINX. Bằng cách khởi động lại dịch vụ, NGINX sẽ đọc và áp dụng các hướng dẫn trang web mới vừa được thêm vào /etc/nginx/sites-enabled.

sudo systemctl reload nginx

5.Thoát khỏi vùng chứa proxy và quay lại máy chủ.

logout

6.Từ máy tính cục bộ của bạn, hãy truy cập URL của trang web bằng trình duyệt web. Bạn sẽ thấy trang Apache mặc định:

Web page of Apache server running in a container

Ghi chú: Nếu bạn xem tệp Apache access.log (tệp mặc định /var/log/apache2/access.log), nó vẫn hiển thị địa chỉ IP riêng của proxyvùng chứa thay vì địa chỉ IP thực. Sự cố này chỉ xảy ra với máy chủ web Apache và liên quan đến cách máy chủ in nhật ký. Phần mềm khác trên máy chủ web có thể sử dụng IP thực. Để khắc phục sự cố này thông qua nhật ký Apache, hãy xem phần Xử lý sự cố .

Lưu lượng truy cập trực tiếp đến máy chủ web NGINX từ Proxy ngược

Bộ chứa proxy ngược đang chạy và NGINXgói đã được cài đặt. Để hoạt động như một proxy ngược, bạn cần thêm cấu hình trang web phù hợp để NGINXcó thể xác định (bên server_namedưới) tên máy chủ phù hợp, sau đó chuyển (bên proxy_passdưới) kết nối đến bộ chứa LXD phù hợp với phần mềm máy chủ web thực tế.

1.Bắt đầu một vỏ trong proxythùng chứa.

lxc exec proxy -- sudo --user ubuntu --login

2.nginx1.example.comTạo tệp /etc/nginx/sites-available/để cấu hình trang web thứ hai của bạn.

server {
        listen 80 proxy_protocol;
        listen [::]:80 proxy_protocol;

        server_name nginx1.example.com;

        location / {
                include /etc/nginx/proxy_params;

                proxy_pass http://nginx1.lxd;
        }

        real_ip_header proxy_protocol;
        set_real_ip_from 127.0.0.1;
}

Bạn có thể chạy sudo nano /etc/nginx/sites-available/nginx1.example.comđể tạo cấu hình. Lưu ý, bạn chỉ cần chỉnh sửa các trường server_namethành tên máy chủ của trang web.

3.Kích hoạt trang web.

sudo ln -s /etc/nginx/sites-available/nginx1.example.com /etc/nginx/sites-enabled/

4.Khởi động lại dịch vụ proxy ngược NGINX.

sudo systemctl reload nginx

5.Thoát khỏi vùng chứa proxy và quay lại máy chủ.

logout

6.Từ máy tính cục bộ của bạn, hãy truy cập URL của trang web bằng trình duyệt web. Bạn sẽ thấy trang NGINX mặc định sau.Web page of the nginx server running in a container

Thêm hỗ trợ cho HTTPS với Let’s Encrypt

1.Bắt đầu một vỏ trong proxythùng chứa.

lxc exec proxy -- sudo --user ubuntu --login

2.Thêm kho lưu trữ ppa:certbot/certbotbằng cách chạy lệnh sau.

sudo add-apt-repository ppa:certbot/certbot

3.Kết quả trông tương tự như sau.

 This is the PPA for packages prepared by Debian Let's Encrypt Team and backported for Ubuntu(s).
      More info: https://launchpad.net/~certbot/+archive/ubuntu/certbot
     Press [ENTER] to continue or Ctrl-c to cancel adding it.

     Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
     ...
     Fetched 3360 kB in 2s (2018 kB/s)
     Reading package lists... Done

4.Cài đặt hai gói sau để a) hỗ trợ việc tạo chứng chỉ Let’s Encrypt; và b) tự động cấu hình proxy ngược NGINX để sử dụng chứng chỉ Let’s Encrypt. Các gói được kéo từ kho lưu trữ mới tạo.

sudo apt-get install certbot python-certbot-nginx

Ghi chú: Cấu hình này sẽ cấu hình proxy ngược để cũng hoạt động như Proxy chấm dứt TLS . Bất kỳ cấu hình HTTPS nào cũng chỉ được tìm thấy trong proxyvùng chứa. Bằng cách thực hiện như vậy, không cần phải thực hiện bất kỳ tác vụ nào bên trong vùng chứa máy chủ web liên quan đến chứng chỉ và Let’s Encrypt.

5.Chạy certbotdưới dạng root với --nginxtham số để thực hiện cấu hình tự động Let’s Encrypt cho trang web đầu tiên. Bạn được yêu cầu cung cấp địa chỉ email hợp lệ để gia hạn khẩn cấp và thông báo bảo mật. Sau đó, bạn được yêu cầu chấp nhận Điều khoản dịch vụ và liệu bạn có muốn được Electronic Frontier Foundation liên hệ trong tương lai hay không. Tiếp theo, cung cấp trang web mà bạn đang kích hoạt HTTPS. Cuối cùng, bạn có thể chọn thiết lập tiện ích tự động chuyển hướng kết nối HTTP sang kết nối HTTPS.

sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): myemail@example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: apache1.example.com
2: nginx1.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for apache1.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/apache1.example.com

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/apache1.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://apache1.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=apache1.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/apache1.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/apache1.example.com/privkey.pem
   Your cert will expire on 2019-10-07. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

6.Chạy certbotvới tư cách là root với --nginxtham số để thực hiện cấu hình tự động Let’s Encrypt cho trang web thứ hai. Đây là lần thứ hai chúng tôi chạy certbot, do đó chúng tôi được yêu cầu trực tiếp chọn trang web để cấu hình.

sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: apache1.example.com
2: nginx1.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 2
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for nginx1.example.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/nginx1.example.com

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/nginx1.example.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://nginx1.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=nginx1.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/nginx1.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/nginx1.example.com/privkey.pem
   Your cert will expire on 2019-10-07. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

7.Sau khi thêm tất cả các trang web, hãy chạy thử để kiểm tra việc gia hạn chứng chỉ. Kiểm tra xem tất cả các trang web có đang cập nhật thành công hay không để đảm bảo tiện ích tự động cập nhật chứng chỉ mà không cần nỗ lực thêm.

sudo certbot renew --dry-run
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/apache1.example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for apache1.example.com
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/apache1.example.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/nginx1.example.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for nginx1.example.com
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/nginx1.example.com/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/apache1.example.com/fullchain.pem (success)
  /etc/letsencrypt/live/nginx1.example.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

Ghi chú: Gói này certbotthêm bộ đếm thời gian systemd để kích hoạt việc gia hạn tự động các chứng chỉ Let’s Encrypt. Bạn có thể xem chi tiết về bộ đếm thời gian này bằng cách chạy systemctl list-timers.

8.Công cụ certbot chỉnh sửa và thay đổi các tệp cấu hình NGINX của trang web của bạn. Khi thực hiện như vậy, certbot không tuân theo listenchỉ thị ban đầu ( listen 80 proxy_protocol;) và không thêm proxy_protocoltham số vào các dòng mới được thêm vào listen 443 ssl;. Bạn phải chỉnh sửa các tệp cấu hình cho mỗi trang web và thêm proxy_protocolvào mỗi dòng “listen 443 ssl;”.

sudo nano /etc/nginx/sites-enabled/apache1.example.com
sudo nano /etc/nginx/sites-enabled/nginx1.example.com
listen 443 ssl proxy_protocol; # managed by Certbot
listen [::]:443 ssl proxy_protocol; # managed by Certbot

Ghi chú: Mỗi tệp cấu hình trang web có hai cặp listenchỉ thị: HTTP và HTTPS. Cặp đầu tiên là cặp gốc cho HTTP đã được thêm vào trong phần trước. Cặp thứ hai được certbot thêm vào cho HTTPS. Đây là những cặp vì chúng bao gồm cả IPv4 và IPv6. Ký hiệu [::]đề cập đến IPv6. Khi thêm tham số proxy_protocol, hãy thêm nó trước trên ;mỗi dòng như được hiển thị ở trên.

9.Khởi động lại NGINX.

sudo systemctl restart nginx

Xử lý sự cố

Lỗi trình duyệt “SSL_ERROR_RX_RECORD_TOO_LONG”

Bạn đã cấu hình Certbot và tạo cấu hình Let’s Encrypt phù hợp cho từng trang web. Nhưng khi bạn truy cập trang web từ trình duyệt, bạn nhận được lỗi sau.

Secure Connection Failed

An error occurred during a connection to apache1.example.com. SSL received a record that exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG

    The page you are trying to view cannot be shown because the authenticity of the received data could not be verified.
    Please contact the website owners to inform them of this problem.

Lỗi này xảy ra khi proxy ngược NGINX trong proxycontainer không có proxy_protocoltham số trong listen 443các chỉ thị. Nếu không có tham số, proxy ngược không sử dụng thông tin giao thức PROXY trước khi thực hiện công việc HTTPS. Nó vô tình truyền thông tin giao thức PROXY đến mô-đun HTTPS, do đó gây ra lỗi bản ghi quá dài .

Thực hiện theo hướng dẫn ở phần trước và thêm proxy_protocolvào tất cả listen 443các chỉ thị. Cuối cùng, khởi động lại NGINX.

Lỗi “Không thể kết nối” hoặc “Không thể truy cập trang web này”

Khi bạn cố gắng kết nối đến trang web từ máy tính cục bộ và nhận được lỗi Không thể kết nối hoặc Không thể truy cập trang web này , có thể là thiết bị proxy chưa được cấu hình.

Chạy lệnh sau trên máy chủ để xác minh xem LXD có đang lắng nghe và có thể chấp nhận kết nối tới cổng 80 (HTTP) và 443 (HTTPS) hay không.

sudo ss -ltp '( sport = :http || sport = :https )'

Ghi chú

Lệnh này sstương tự như netstatvà lsof. Lệnh này hiển thị thông tin về kết nối mạng. Trong trường hợp này, chúng tôi sử dụng lệnh này để xác minh xem có dịch vụ nào trên cổng 80 và 443 không và đó là dịch vụ nào.

  • -l, để hiển thị các ổ cắm đang nghe,
  • -t, để chỉ hiển thị các socket TCP,
  • -p, để hiển thị những tiến trình nào sử dụng các ổ cắm đó,
  • ( sport = :http || sport = :https ), để chỉ hiển thị cổng 80 và 443 (tương ứng là HTTP và HTTPS).

Trong đầu ra sau, chúng ta có thể xác minh rằng cả hai cổng 80 và 443 (HTTP và HTTPS, tương ứng) đều ở trạng thái LISTEN . Trong cột cuối cùng, chúng ta xác minh rằng lxdchính quy trình lắng nghe.

State     Recv-Q  Send-Q   Local Address:Port   Peer Address:Port
LISTEN    0       128                  *:http              *:*       users:(("lxd",pid=1301,fd=7),("lxd",pid=1301,fd=5))
LISTEN    0       128                  *:https             *:*       users:(("lxd",pid=1349,fd=7),("lxd",pid=1349,fd=5))

Nếu bạn thấy một quy trình được liệt kê khác với lxd, hãy dừng dịch vụ đó và khởi động lại proxycontainer. Bằng cách khởi động lại proxycontainer, LXD sẽ áp dụng lại các thiết bị proxy.

Apache access.log Hiển thị Địa chỉ IP của Proxy Container

Bạn đã thiết lập apache1container và xác minh rằng nó có thể truy cập được từ internet. Nhưng nhật ký tại /var/log/apache2/access.logvẫn hiển thị địa chỉ IP riêng của proxycontainer, có thể là IPv4 riêng ( 10.xxx ) hoặc địa chỉ IPv6 riêng. Có vấn đề gì không?

Định dạng nhật ký mặc định để in nhật ký truy cập trong Apache chỉ in địa chỉ IP của máy chủ của bước nhảy cuối cùng (tức là máy chủ proxy). Đây là định %hdạng chỉ định như được hiển thị bên dưới.

LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common

Phải %hthay thế thủ công bằng %atrình chỉ định định dạng, trình này sẽ in ra giá trị được trả về bởi mô-đun RemoteIP Apache thực.

LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common

1.Chạy lệnh sau trong apache1vùng chứa để chỉnh sửa tệp cấu hình httpd.confvà thực hiện thay đổi từ %hthành %a.

sudo nano /etc/apache2/apache2.conf

2.Tải lại dịch vụ máy chủ web Apache.

sudo systemctl reload apache2

Các bước tiếp theo

Bạn đã thiết lập proxy ngược để lưu trữ nhiều trang web trên cùng một máy chủ và cài đặt từng trang web trong một vùng chứa riêng biệt. Bạn có thể cài đặt các trang web tĩnh hoặc động trong các vùng chứa. Đối với các trang web động, bạn có thể cần cấu hình bổ sung; hãy kiểm tra tài liệu tương ứng để thiết lập bằng proxy ngược. Ngoài ra, bạn cũng có thể sử dụng NGINX làm proxy ngược cho các dịch vụ không phải HTTP(S).

Thông tin thêm

Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.

Nguồn: https://www.linode.com/docs/guides/beginners-guide-to-lxd-reverse-proxy/