Maison  >  Article  >  Opération et maintenance  >  Comment utiliser Nginx pour proxy plusieurs sites d'applications dans Docker

Comment utiliser Nginx pour proxy plusieurs sites d'applications dans Docker

WBOY
WBOYavant
2023-05-13 15:55:171922parcourir

Comment proxy (comment communiquer entre conteneurs) ?

Utilisez simplement la fonction proxy de nginx directement (voir les fonctionnalités associées séparément). Le problème ici est la communication entre les conteneurs Docker.

docker Il existe les 4 principaux moyens de communication entre les conteneurs suivants :

- Accès via l'adresse IP du conteneur : après le redémarrage du conteneur, l'adresse IP changera.

- Accès via l'ip:port de l'hôte : Si l'IP de l'hôte change, chaque application doit être modifiée et le port doit être lié, ce qui est gênant.

- Construire des liens par le lien : Trop de dépendance les uns envers les autres n'est pas propice au maintien.

- Réseau personnalisé : les conteneurs du même réseau de pont peuvent accéder les uns aux autres.

Évidemment, nous choisirons de personnaliser la méthode réseau pour relier les applications associées au même réseau. De cette manière, il n'y a en fait aucune dépendance entre les applications et les agents, les agents et les proxys. migrer. La configuration n'est pas compliquée, remplacez simplement l'adresse IP ou le nom de domaine habituel par le nom du conteneur correspondant.

1. Réseau unifié

Ensuite, vous devez d'abord créer un réseau de pont partagé :

docker network create proxy-network

# 查看
docker network ls

2. Conteneur de service proxy

Créez un conteneur de service nginx spécifiquement pour le proxy, nommé : proxy -nginx , construit ici à l'aide de docker-compose, la structure de répertoires finale est la suivante :

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

Certains fichiers sont générés lors du processus d'exécution ultérieur. Lors de la configuration, il vous suffit de créer les fichiers et répertoires nécessaires.

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"

Liez les ports externes 80 et 443 au serveur proxy, et toutes les applications peuvent entrer à partir d'ici.

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

Le groupe d'utilisateurs en cours d'exécution et l'utilisateur www-data seront créés ici pour faciliter la configuration et le contrôle. Ce nom sera utilisé dans la configuration de 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;
}

Copiez simplement le contenu par défaut de nginx. Ce qui doit être modifié, c'est le nom d'utilisateur en cours d'exécution. Notez que le nom d'utilisateur doit être cohérent avec les paramètres précédents.

startup.sh

#!/bin/bash

# start crond in background
crond -l 2 -b

# start nginx in foreground
nginx

Ceci est utilisé pour démarrer le programme nginx. Le contenu est actuellement relativement petit, principalement pour faciliter l'expansion future du contenu.

Démarrez le conteneur du service proxy

docker-compose up -d nginx

Vérifiez si le démarrage est normal docker-compose ps, sinon, vérifiez s'il y a des erreurs dans la configuration.

Ça y est, laissez tomber pour l'instant et allez créer l'application.

3. Ajouter une application

Ajouter un site https://baipiaoquan.com/.

Configuration des conteneurs d'applications

Utilisez également docker-compose pour créer des applications.

Il s'agit d'un projet php, cette application nécessite donc au moins deux conteneurs de services, nginx et php-fpm. La structure du répertoire du projet est la suivante :

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

Afin de faciliter l'ajustement, l'environnement. les variables sont utilisées ici.

Notez le nom du conteneur nginx containers_name : ${compose_project_name}_nginx. Cette valeur est critique et sera utilisée dans les proxys suivants. Le nom du réseau proxy utilisé par

.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

est : proxy-network, qui a été créé précédemment ; le nom du conteneur de
nginx sera : baipiaoquan_nginx.

dockerfile de nginx

Ce fichier peut être directement extrait du précédent, puis ajouté des informations liées à 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

dockerfile de php-fpm

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"]

N'oubliez pas le fichier php.ini, vous pouvez également utiliser sa valeur par défaut, puis supprimer cette configuration associée.

La configuration du service 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;
  }
}

Je l'ai complète ici En fait, elle peut être rationalisée et n'a besoin que d'être configurée.

Démarrez l'application

À ce stade, vous pouvez démarrer le service de baipiaoquan.com Exécutez-le dans le répertoire de baipiaoquan :

docker-compose up -d nginx

S'il n'y a pas d'accident, l'application devrait démarrer et pouvoir recevoir. services. Vous pouvez également le tester en entrant dans le conteneur et en accédant à localhost pour voir si le résultat est celui que vous souhaitez. Je l'ai testé comme ceci :

docker-compose exec nginx wget localhost

Ensuite, j'ai regardé la taille des données renvoyées et j'ai jugé si cela avait réussi en fonction de la situation.
Vous pouvez vérifier si l'application est correctement connectée au réseau proxy via la commande suivante :

docker network inspect proxy-network

La prochaine étape consiste à rendre cette application accessible aux personnes du monde entier.

Ajouter la configuration du proxy à nginx-proxy

Remarque : vous devez d'abord démarrer l'application, puis démarrer le proxy, sinon nginx ne peut pas trouver l'erreur en amont.

Emplacement de stockage : proxy-nginx/sites/baipiaoquan.com.conf. Copiez simplement la configuration ci-dessus et modifiez quelques endroits. La configuration finale est la suivante :

# 我这配的仅支持 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 的容器名称
  }
}

Rechargez la configuration du serveur proxy dans nginx-proxy Exécutez sous le. annuaire :

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

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

Attendez un instant, si tout se passe bien, les gens du monde entier devraient désormais pouvoir accéder à ce site https://baipiaoquan.com/.

Si vous devez ajouter d'autres applications, la logique et le processus seront les mêmes. Par exemple, j'ai ajouté une autre application : https://chaohhuahui.com/, et vous pouvez pinger leurs adresses IP pour voir qu'elles sont les mêmes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer