Maison > Opération et maintenance > Nginx > le corps du texte

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

WBOY
Libérer: 2023-05-13 15:55:17
avant
1983 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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"
Copier après la connexion

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
Copier après la connexion

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;
}
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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"]
Copier après la connexion

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;
  }
}
Copier après la connexion

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
Copier après la connexion
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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 的容器名称
  }
}
Copier après la connexion

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
Copier après la connexion

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!