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

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

May 13, 2023 pm 03:55 PM
docker nginx

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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

중국의 도커 이미지 소스를 변경하는 방법 중국의 도커 이미지 소스를 변경하는 방법 Apr 15, 2025 am 11:30 AM

국내 거울 소스로 전환 할 수 있습니다. 단계는 다음과 같습니다. 1. 구성 파일 /etc/docker/daemon.json 편집 및 미러 소스 주소를 추가하십시오. 2. 저장 및 종료 후 Docker Service Sudo SystemCTL Docker를 다시 시작하여 이미지 다운로드 속도 및 안정성을 향상시킵니다.

Docker Desktop을 사용하는 방법 Docker Desktop을 사용하는 방법 Apr 15, 2025 am 11:45 AM

Docker Desktop을 사용하는 방법? Docker Desktop은 로컬 머신에서 Docker 컨테이너를 실행하는 도구입니다. 사용 단계는 다음과 같습니다. 1. Docker Desktop 설치; 2. Docker Desktop을 시작하십시오. 3. Docker 이미지를 만듭니다 (Dockerfile 사용); 4. Docker Image 빌드 (Docker 빌드 사용); 5. 도커 컨테이너를 실행하십시오 (Docker Run 사용).

Docker에서 거울을 만드는 방법 Docker에서 거울을 만드는 방법 Apr 15, 2025 am 11:27 AM

Docker 이미지 생성 단계 : 빌드 지침이 포함 된 Dockerfile을 작성하십시오. Docker 빌드 명령을 사용하여 터미널에 이미지를 빌드하십시오. Docker 태그 명령을 사용하여 이미지를 태그하고 이름과 태그를 지정하십시오.

Docker 버전을 읽는 방법 Docker 버전을 읽는 방법 Apr 15, 2025 am 11:51 AM

Docker 버전을 얻으려면 다음 단계를 수행 할 수 있습니다. Docker 명령 "Docker -version"을 실행하여 클라이언트 및 서버 버전을 볼 수 있습니다. Mac 또는 Windows의 경우 Docker Desktop GUI의 버전 탭 또는 Aff Docker Desktop 메뉴를 통해 버전 정보를 볼 수도 있습니다.

Docker LNMP에 전화하는 방법 Docker LNMP에 전화하는 방법 Apr 15, 2025 am 11:15 AM

Docker LNMP 컨테이너 호출 단계 : 컨테이너 실행 : Docker Run -D-- 이름 LNMP -Container -P 80:80 -P 443 : 443 LNMP -Stack 컨테이너 IP를 얻으려면 Docker LNMP -Container | grep iPaddress 액세스 웹 사이트 : http : // & lt; 컨테이너 ip & gt;/index.phpssh 액세스 : docker exec -it lnmp -container bash access mysql : mysql -u roo

Docker의 개인 저장소 구축 방법 Docker의 개인 저장소 구축 방법 Apr 15, 2025 am 11:06 AM

Docker Private Repositories를 구축하여 컨테이너 이미지를 안전하게 저장하고 관리하여 엄격한 제어 및 보안을 제공 할 수 있습니다. 단계에는 리포지토리 생성, 액세스 부여, 저장소 배포, 이미지 밀기 및 이미지를 당기는 단계가 포함됩니다. 보안, 버전 제어, 네트워크 트래픽 감소 및 사용자 정의가 장점이 있습니다.

Docker 이미지를 저장하는 방법 Docker 이미지를 저장하는 방법 Apr 15, 2025 am 11:54 AM

Docker에 이미지를 저장하려면 Docker Commit 명령을 사용하여 지정된 컨테이너의 현재 상태가 포함 된 새 이미지를 만들 수 있습니다. 구문 : Docker Commit [옵션] 컨테이너 ID 이미지 이름. 이미지를 저장소에 저장하려면 Docker Push 명령 인 Syntax : Docker 푸시 이미지 이름 [: tag]을 사용할 수 있습니다. 저장된 이미지를 가져 오려면 Docker Pull 명령 인 Syntax : Docker Pull Image Name [: Tag]을 사용할 수 있습니다.

Docker의 이미지를 업데이트하는 방법 Docker의 이미지를 업데이트하는 방법 Apr 15, 2025 pm 12:03 PM

Docker 이미지를 업데이트하는 단계는 다음과 같습니다. 최신 이미지 태그 가져 오기 새 이미지 특정 태그의 이전 이미지 삭제 (선택 사항) 컨테이너를 다시 시작하십시오 (필요한 경우)

See all articles