Điểm:1

connect() không thành công (111: Kết nối bị từ chối) trong khi kết nối ngược dòng với trang web tĩnh

lá cờ cn

Mục tiêu của tôi là có 2 container docker:

  • vùng chứa nginx (dựa trên nginx: mới nhất) để hoạt động như proxy ngược
  • vùng chứa với trang web tĩnh (dựa trên nginx:alpine)

Sau này tôi sẽ thêm 1+ dịch vụ phụ trợ lõi .net (hiện tại không quan trọng). Hiện tại khi tôi cố gắng truy cập máy chủ web của mình bằng địa chỉ IP công cộng, tôi nhận được 502 Bad gateway. Đây là cấu hình hiện tại của tôi:

docker-compose.yaml

phiên bản: '3'
dịch vụ:
  proxy ngược:
    hình ảnh: nginx: mới nhất
    container_name: reverse_proxy
    phụ thuộc:
      - trang web tĩnh
    khối lượng:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
    cổng:
      - 80:80
  trang web tĩnh:
    hình ảnh: sm-static-website
    xây dựng:
      bối cảnh: ./trang web
    container_name: sm_static_website
    cổng:
      - "8080:80"

nginx.conf cho proxy ngược:

worker_processes tự động;
bao gồm /etc/nginx/modules-enabled/*.conf;

sự kiện {
    công_nhân kết_nối 1024 ;
}

http {
    người phục vụ {
            nghe 80 default_server;
            lắng nghe [::]:80 default_server;

            tên_máy chủ x.x.x.x; # my_public_ip

            địa điểm / {
                    proxy_pass http://sm_static_website:8080;
                    proxy_set_header X-Forwarded-For $remote_addr;
            }
    }
}

Dockerfile cho trang web tĩnh:

TỪ nginx:alpine
CÔNG VIỆC/html
SAO CHÉP . /var/www/html
TIẾP XÚC 8080

Từ vùng chứa trang web của tôi, tôi có thể thấy rằng nginx đang chạy/nghe trên 80:

netstat -tulpn | grep NGHE
tcp 0 0 127.0.0.11:41389 0.0.0.0:* NGHE -
tcp 0 0 0.0.0.0:80 0.0.0.0:* NGHE 1/nginx: master pro
tcp 0 0 :::80 :::* LISTE 1/nginx: master pro

Từ máy chủ của tôi, tôi có thể thấy rằng cả bộ chứa remote_proxy và trang web đều đang nghe 80/8080 tương ứng:

netstat -tulpn | grep NGHE
tcp 0 0 0.0.0.0:80 0.0.0.0:* NGHE 13936/docker-proxy
tcp 0 0 0.0.0.0:8080 0.0.0.0:* NGHE 13797/docker-proxy
tcp6 0 0 :::80 :::* NGHE 13942/docker-proxy
tcp6 0 0 :::8080 :::* NGHE 13804/docker-proxy

ps -aux trên máy chủ trả về:

gốc 13936 0,0 0,0 1075140 3580 ? Sl 00:24 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.18.0.3 -container-port 80
gốc 13797 0,0 0,0 1148872 3624 ? Sl 00:24 0:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.18.0.2 -container-port 80

Nhật ký của vùng chứa trang web không hiển thị lỗi, các quy trình worker đang chạy. Tuy nhiên, nhật ký proxy ngược cho thấy:

2022/05/20 01:20:29 [lỗi] 31#31: *1 connect() fail (111: Kết nối bị từ chối) trong khi kết nối với thượng nguồn, máy khách: x.x.x.x, máy chủ: x.x.x.x, yêu cầu: "GET / HTTP/1.1 ", ngược dòng: "http://172.19.0.2:8080/", máy chủ lưu trữ: "x.x.x.x"

Bất cứ ý tưởng những gì tôi đang làm sai? Nếu tôi xóa khối lượng: dòng khỏi docker-compose.yml, thì tôi sẽ nhận được trang nginx mặc định từ bộ chứa proxy ngược. Điều này cho thấy rằng nó đang lắng nghe đúng cách, chấp nhận yêu cầu nhưng không chuyển hướng nó đến vùng chứa trang web.

Điểm:0
lá cờ in

Các Hải cảng chỉ thị trong docker-compose xác định cổng nào được hiển thị bên ngoài. Bộ chứa proxy ngược của bạn có thể truy cập các dịch vụ bên trong trang web tĩnh trực tiếp khi chúng được liên kết với nhau, vì vậy bạn không sử dụng cổng bị lộ ở đây.

Vì trang web của bạn bên trong vùng chứa trang web tĩnh đang lắng nghe trên cổng 80, bạn cần sử dụng cổng đó thay vì các cổng bị lộ.

Trước tiên, bạn cần liên kết các thùng chứa với nhau, để làm điều đó, bạn thêm vào proxy ngược chặn:

liên kết:
  - trang web tĩnh

Của bạn proxy_pass chỉ thị nên là:

proxy_pass http://sm_static_website;

Nếu bạn không muốn thực sự phơi bày trang web tĩnh container ra bên ngoài, bạn có thể loại bỏ cổng chỉ đạo ở đó.

Nên docker-compose.yml nên trông như thế này:

phiên bản: '3'
dịch vụ:
  proxy ngược:
    hình ảnh: nginx: mới nhất
    container_name: reverse_proxy
    phụ thuộc:
      - trang web tĩnh
    khối lượng:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
    cổng:
      - 80:80
    liên kết:
      - sm_static_trang web
  trang web tĩnh:
    hình ảnh: sm-static-website
    xây dựng:
      bối cảnh: ./trang web
    container_name: sm_static_website

TBH: Tôi chưa bao giờ thấy hữu ích khi sử dụng container_name chỉ thị, tôi không chắc liệu bạn có phải sử dụng container_name đã xác định hay không sm_static_website hoặc chỉ trang web tĩnh bên trong liên kết và trong proxy_pass chỉ thị. Nếu bạn bỏ nó đi, nó sẽ chỉ là trang web tĩnh.

lá cờ cn
Cảm ơn Gerald, đổi sang cổng 80 đã hoạt động. Lần đầu tiên làm việc với linux và coker, vì vậy đó là lý do tại sao người mới có câu hỏi này. Tái bút Liên kết sử dụng , Vì thế

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.