>운영 및 유지보수 >엔진스 >Nginx를 사용하여 Docker에서 여러 애플리케이션 사이트를 프록시하는 방법

Nginx를 사용하여 Docker에서 여러 애플리케이션 사이트를 프록시하는 방법

WBOY
WBOY앞으로
2023-05-13 15:55:172054검색

프록시 방법(컨테이너 간 통신 방법)?

nginx의 프록시 기능을 직접 사용하세요(관련 기능은 별도로 참조). 여기서 문제는 도커 컨테이너 간의 통신입니다.

docker 컨테이너 간 통신에는 다음과 같은 4가지 주요 방법이 있습니다.

- 컨테이너 IP를 통한 액세스: 컨테이너가 다시 시작된 후 IP가 변경됩니다.

- 호스트의 IP:포트를 통해 접속: 호스트의 IP가 변경되면 각 애플리케이션을 변경하고 포트를 바인딩해야 하는 번거로움이 있습니다.

- 링크를 통한 링크 구축: 서로에 대한 지나친 의존은 유지 관리에 도움이 되지 않습니다.

- 맞춤형 네트워크: 동일한 브리지 네트워크에 있는 컨테이너는 서로 액세스할 수 있습니다.

분명히 우리는 관련 애플리케이션을 동일한 네트워크에 연결하기 위해 네트워크를 사용자 정의하는 방법을 선택할 것입니다. 이러한 방식으로 실제로 애플리케이션, 에이전트 및 프록시 간에 의존성이 없습니다. 이주하다. 구성은 번거롭지 않습니다. 일반 IP 또는 도메인 이름을 해당 컨테이너 이름으로 바꾸면 됩니다.

1. 통합 네트워크

그런 다음 먼저 공유 브리지 네트워크를 만들어야 합니다:

docker network create proxy-network

# 查看
docker network ls

2. 프록시 서비스 컨테이너

프록시용으로 특별히 nginx 서비스 컨테이너를 만듭니다. , docker-compose를 사용하여 여기에 빌드하면 최종 디렉터리 구조는 다음과 같습니다.

proxy-nginx
├── docker-compose.yml
├── logs # 日志
│  └── error.log
├── nginx
│  ├── dockerfile
│  ├── nginx.conf
│  └── startup.sh
├── sites # 被代理站点配置
│  ├── baipiaoquan.com.conf
│  └── chaohuahui.com.conf
└── ssl # 证书文件
  └── baipiaoquan.com.pem

일부 파일은 후속 실행 프로세스 중에 생성됩니다. 구성 중에는 필요한 파일과 디렉터리만 생성하면 됩니다.

docker-compose.yml

version: "3"

networks:
 default:
  external:
   name: proxy-network

services:
 nginx:
  build:
   context: ./nginx
  volumes:
   - ./logs:/var/log/nginx
   - ./sites:/etc/nginx/sites-available
   - ./ssl:/etc/nginx/ssl
  ports:
   - "80:80"
   - "443:443"

외부 포트 80 및 443을 프록시 서버에 바인딩하면 모든 애플리케이션이 여기에서 들어올 수 있습니다.

dockerfile

from nginx:alpine

label maintainer="chuoke"

copy nginx.conf /etc/nginx/

run apk update
  && apk upgrade
  && apk add --no-cache openssl
  && apk add --no-cache bash

run set -x ;
  addgroup -g 82 -s www-data ;
  adduser -u 82 -d -s -g www-data www-data && exit 0 ; exit 1

add ./startup.sh /opt/startup.sh

run sed -i 's/.//g' /opt/startup.sh

cmd ["/bin/bash", "/opt/startup.sh"]

expose 80 443

구성 및 제어를 용이하게 하기 위해 실행 중인 사용자 그룹과 사용자 www-data가 여기에 생성됩니다. 이 이름은 nginx 구성에 사용됩니다.

nginx.conf

user www-data;
worker_processes 4;
pid /run/nginx.pid;
daemon off;

events {
 worker_connections 2048;
 multi_accept on;
 use epoll;
}

http {
 server_tokens off;
 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 keepalive_timeout 15;
 types_hash_max_size 2048;
 client_max_body_size 20m;
 include /etc/nginx/mime.types;
 default_type application/octet-stream;
 access_log /dev/stdout;
 error_log /dev/stderr;

 gzip on;
 gzip_disable "msie6";

 ssl_protocols tlsv1 tlsv1.1 tlsv1.2;
 ssl_ciphers 'ecdhe-ecdsa-chacha20-poly1305:ecdhe-rsa-chacha20-poly1305:ecdhe-ecdsa-aes128-gcm-sha256:ecdhe-rsa-aes128-gcm-sha256:ecdhe-ecdsa-aes256-gcm-sha384:ecdhe-rsa-aes256-gcm-sha384:dhe-rsa-aes128-gcm-sha256:dhe-rsa-aes256-gcm-sha384:ecdhe-ecdsa-aes128-sha256:ecdhe-rsa-aes128-sha256:ecdhe-ecdsa-aes128-sha:ecdhe-rsa-aes256-sha384:ecdhe-rsa-aes128-sha:ecdhe-ecdsa-aes256-sha384:ecdhe-ecdsa-aes256-sha:ecdhe-rsa-aes256-sha:dhe-rsa-aes128-sha256:dhe-rsa-aes128-sha:dhe-rsa-aes256-sha256:dhe-rsa-aes256-sha:ecdhe-ecdsa-des-cbc3-sha:ecdhe-rsa-des-cbc3-sha:edh-rsa-des-cbc3-sha:aes128-gcm-sha256:aes256-gcm-sha384:aes128-sha256:aes256-sha256:aes128-sha:aes256-sha:des-cbc3-sha:!dss';

 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-available/*.conf;

 open_file_cache off; # disabled for issue 619
 charset utf-8;
}

nginx의 기본 내용을 복사하세요. 변경해야 할 것은 실행 중인 사용자 이름입니다. 사용자 이름은 이전 설정과 일치해야 합니다.

startup.sh

#!/bin/bash

# start crond in background
crond -l 2 -b

# start nginx in foreground
nginx

이는 nginx 프로그램을 시작하는 데 사용됩니다. 주로 향후 콘텐츠 확장의 편의를 위해 콘텐츠가 상대적으로 작습니다.

프록시 서비스 컨테이너 시작

docker-compose up -d nginx

docker-compose ps가 정상적으로 시작되는지 확인하고, 그렇지 않은 경우 구성에 오류가 있는지 확인하세요.

그렇습니다. 지금은 그대로 두고 애플리케이션을 만들어 보세요.

3. 애플리케이션 추가

사이트 추가 https://baipiaoquan.com/.

애플리케이션 컨테이너 구성

또한 docker-compose를 사용하여 애플리케이션을 생성하세요.

이것은 PHP 프로젝트이므로 이 애플리케이션에는 nginx 및 php-fpm이라는 두 개 이상의 서비스 컨테이너가 필요합니다. 프로젝트 디렉토리 구조는 다음과 같습니다:

baipiaoquan/
├── docker-compose.yml
├── log
│  └── nginx
│    └── error.log
├── nginx
│  ├── dockerfile
│  ├── log
│  ├── nginx.conf
│  ├── sites
│  │  └── baipiaoquan.com.conf
│  ├── ssl
│  │  ├── baipiaoquan.com.key
│  │  ├── baipiaoquan.com.pem
│  └── startup.sh
└── php-fpm
  ├── dockerfile
  └── php.ini

docker-compose.yml

version: '3'

networks:
 proxy:
  external:
    name: ${proxy_network_name}
 backend:
  driver: ${networks_driver}

services:
 php-fpm:
   build:
    context: ./php-fpm
   volumes:
    - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
    - ${app_code_path_host}:${app_code_path_container}${app_code_container_flag}
   networks:
    - backend

 nginx:
   build:
    context: ./nginx
    args:
     - php_upstream_container=${nginx_php_upstream_container}
     - php_upstream_port=${nginx_php_upstream_port}
   volumes:
    - ${app_code_path_host}:${app_code_path_container}${app_code_container_flag}
    - ./log:/var/log/nginx
    - ./sites:/etc/nginx/sites-available
    - ./ssl:/etc/nginx/ssl
   container_name: ${compose_project_name}_nginx
   depends_on:
    - php-fpm
   networks:
    - proxy
    - backend

조정을 용이하게 하기 위해 환경 여기에는 변수가 사용됩니다.

nginx 컨테이너 이름: ${compose_project_name}_nginx의 컨테이너 이름을 기록해 두세요. 이 값은 중요하며 후속 프록시에서 사용됩니다.

.env

# 宿主机中代码的位置
app_code_path_host=../

# 容器中代码的位置
app_code_path_container=/var/www

# 这个是抄的 laradock
app_code_container_flag=:cached

# 选择机器上的存储路径。适用于所有储存系统
data_path_host=~/.baipiaoquan/data

### drivers ################################################

# all volumes driver 
volumes_driver=local 

# 网络驱动 
networks_driver=bridge 

# 代理网络名称,这是前面创建的 
proxy_network_name=proxy-network

### docker compose files ##################################
# 
compose_file=docker-compose.yml

# change the separator from : to ; on windows
compose_path_separator=:

# 项目名称
compose_project_name=baipiaoquan

에서 사용하는 프록시 네트워크 이름은 이전에 생성된 Proxy-network입니다.
nginx의 컨테이너 이름은 baipiaoquan_nginx입니다.

nginx의 dockerfile

이 파일은 이전 파일에서 직접 가져온 다음 PHP 관련 정보를 추가할 수 있습니다.

from nginx:alpine

copy nginx.conf /etc/nginx/

run apk update
  && apk upgrade
  && apk --update add logrotate
  && apk add --no-cache openssl
  && apk add --no-cache bash

run set -x ;
  addgroup -g 82 -s www-data ;
  adduser -u 82 -d -s -g www-data www-data && exit 0 ; exit 1

arg php_upstream_container=php-fpm
arg php_upstream_port=9000

# set upstream conf and remove the default conf
run echo "upstream php-upstream { server ${php_upstream_container}:${php_upstream_port}; }" > /etc/nginx/conf.d/upstream.conf
  && rm /etc/nginx/conf.d/default.conf

add ./startup.sh /opt/startup.sh
run sed -i 's/.//g' /opt/startup.sh

cmd ["/bin/bash", "/opt/startup.sh"]

expose 80 443

php-fpm의 dockerfile

from php:7.3-fpm

arg puid=1000

env puid ${puid}

arg pgid=1000

env pgid ${pgid}

run groupmod -o -g ${pgid} www-data &&
  usermod -o -u ${puid} -g www-data www-data

expose 9000

workdir /var/www

cmd ["php-fpm"]

php.ini 파일을 잊지 마세요. 기본값을 사용한 다음 관련 구성을 삭제할 수도 있습니다.

서비스 구성 baipiaoquan.com.conf

server {

  listen 80 default_server;

  # for https
  listen 443 ssl default_server;
  ssl_certificate /etc/nginx/ssl/3243258_baipiaoquan.com.pem;
  ssl_certificate_key /etc/nginx/ssl/3243258_baipiaoquan.com.key;
  ssl_session_timeout 5m;
  ssl_protocols tlsv1 tlsv1.1 tlsv1.2;
  ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:high:!anull:!md5:!rc4:!dhe; 
  ssl_prefer_server_ciphers on;

  add_header x-frame-options "sameorigin";
  add_header x-xss-protection "1; mode=block";
  add_header x-content-type-options "nosniff";

  # localhost 一定要
  server_name localhost baipiaoquan.com www.baipiaoquan.com;
  root /var/www/; # 这个和前面的配置保持一致
  index index.php index.html index.htm;

  location / {
     try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ .php$ {
    try_files $uri /index.php =404;
    fastcgi_pass php-upstream; # 这个是 nginx dockerfile 里配置的
    fastcgi_index index.php;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param script_filename $document_root$fastcgi_script_name;
    #fixes timeouts
    fastcgi_read_timeout 600;
    include fastcgi_params;
  }

  location ~ /.ht {
    deny all;
  }

  location /.well-known/acme-challenge/ {
    root /var/www/letsencrypt/;
    log_not_found off;
  }
}

여기서 완료했습니다. 실제로는 간소화할 수 있으므로 구성만 하면 됩니다.

애플리케이션 시작

이 시점에서 baipiaoquan.com의 서비스를 시작할 수 있습니다. baipiaoquan 디렉토리에서 실행하세요:

docker-compose up -d nginx

사고가 없으면 애플리케이션이 시작되고 수신될 수 있습니다. 서비스. 또한 컨테이너에 들어가서 localhost에 액세스하여 원하는 결과가 나오는지 테스트해 볼 수도 있습니다. 저는 이렇게 테스트했습니다:

docker-compose exec nginx wget localhost

그런 다음 반환된 데이터의 크기를 보고 상황에 따라 성공했는지 판단합니다.
다음 명령을 통해 애플리케이션이 프록시 네트워크에 성공적으로 연결되었는지 확인할 수 있습니다.

docker network inspect proxy-network

다음 단계는 전 세계 사람들이 이 애플리케이션에 액세스할 수 있도록 만드는 것입니다.

nginx-proxy에 프록시 구성 추가

참고: 먼저 애플리케이션을 시작한 다음 프록시를 시작해야 합니다. 그렇지 않으면 nginx가 업스트림 오류를 찾을 수 없습니다.

저장 위치: proxy-nginx/sites/baipiaoquan.com.conf 위 구성을 복사하고 몇 군데만 변경하면 됩니다. 최종 구성은 다음과 같습니다.

# 我这配的仅支持 https,如果没要求,这个就不需要 

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

server {

  # 如果是 http 就配置这个
  # listen 80 default_server;

  # 如果是 https 就配置这个
  listen 443 ssl;
  ssl_certificate      /etc/nginx/ssl/3243258_baipiaoquan.com.pem;
  ssl_certificate_key    /etc/nginx/ssl/3243258_baipiaoquan.com.key;
  ssl_session_timeout    5m;
  ssl_protocols       tlsv1 tlsv1.1 tlsv1.2;
  ssl_ciphers        ecdhe-rsa-aes128-gcm-sha256:ecdhe:ecdh:aes:high:!null:!anull:!md5:!adh:!rc4;
  ssl_prefer_server_ciphers on;

  server_name baipiaoquan.com www.baipiaoquan.com;

  add_header x-frame-options "sameorigin";
  add_header x-xss-protection "1; mode=block";
  add_header x-content-type-options "nosniff";

  location / {
    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 x-forwarded-host  $host;
    proxy_set_header x-forwarded-port  $server_port;
    proxy_pass http://baipiaoquan_nginx/; # 这个值就是应用 nginx 的容器名称
  }
}

nginx-proxy에서 프록시 서버 구성을 다시 로드합니다. 디렉토리:

# 先测试下配置文件,这步一定要执行成功
docker-compose exec nginx nginx -t

# 如果提示成功,则重新加载,否则就按提示检查修改配置文件
docker-compose exec nginx nginx -s reload

잠깐만 기다려 주세요. 모든 일이 순조롭게 진행된다면 이제 전 세계 사람들이 이 https://baipiaoquan.com/ 웹사이트에 액세스할 수 있을 것입니다.

다른 애플리케이션을 추가해야 하는 경우 논리와 프로세스는 동일합니다. 예를 들어, https://chaohhuahui.com/이라는 다른 애플리케이션을 추가하면 해당 IP 주소를 핑하여 동일한지 확인할 수 있습니다.

위 내용은 Nginx를 사용하여 Docker에서 여러 애플리케이션 사이트를 프록시하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제