Rumah  >  Artikel  >  Operasi dan penyelenggaraan  >  Cara menggunakan Nginx untuk memproksi berbilang tapak aplikasi di Docker

Cara menggunakan Nginx untuk memproksi berbilang tapak aplikasi di Docker

WBOY
WBOYke hadapan
2023-05-13 15:55:171922semak imbas

Bagaimana untuk membuat proksi (bagaimana untuk berkomunikasi antara bekas)?

Anda boleh terus menggunakan fungsi proksi nginx (lihat keupayaan berkaitan secara berasingan).

docker Terdapat 4 cara komunikasi utama antara bekas:

- Akses melalui ip kontena: Selepas bekas dimulakan semula, ip akan berubah.

- Akses melalui ip:port hos: Jika IP hos berubah, setiap aplikasi mesti ditukar dan port mesti terikat, yang menyusahkan.

- Bina pautan melalui pautan: Terlalu banyak pergantungan antara satu sama lain tidak sesuai untuk penyelenggaraan.

- Rangkaian tersuai: Bekas dalam rangkaian jambatan yang sama boleh mengakses satu sama lain.

Jelas sekali, kami akan memilih untuk menyesuaikan rangkaian dan membiarkan aplikasi berkaitan dipautkan ke rangkaian yang sama, sebenarnya tidak ada pergantungan antara aplikasi dan aplikasi, ejen dan proksi , tetapi juga mudah untuk berhijrah. Konfigurasi tidak menyusahkan, cuma gantikan IP biasa atau nama domain dengan nama bekas yang sepadan.

1. Rangkaian bersatu

Kemudian, pertama anda perlu mencipta rangkaian jambatan kongsi:

docker network create proxy-network

# 查看
docker network ls

2. Proksi service Container

Buat bekas perkhidmatan nginx khusus untuk proksi, bernama: proxy-nginx, dibina di sini menggunakan docker-compose, dan struktur direktori akhir adalah seperti berikut:

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

Sesetengah fail dijana semasa operasi seterusnya Semasa konfigurasi, anda hanya perlu mencipta fail dan direktori yang diperlukan.

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"

Ikat port luaran 80 dan 443 ke pelayan proksi dan semua aplikasi boleh masuk dari sini.

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

Kumpulan pengguna yang sedang berjalan dan www-data pengguna akan dibuat di sini untuk memudahkan konfigurasi dan kawalan Nama ini akan digunakan dalam konfigurasi 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;
}

Salin sahaja kandungan lalai nginx Apa yang perlu ditukar ialah nama pengguna yang sedang dijalankan. Sila ambil perhatian bahawa nama pengguna mesti konsisten dengan tetapan sebelumnya .

startup.sh

#!/bin/bash

# start crond in background
crond -l 2 -b

# start nginx in foreground
nginx

Ini digunakan untuk memulakan program nginx pada masa ini agak kecil, terutamanya untuk kemudahan pengembangan kandungan masa hadapan.

Mulakan bekas perkhidmatan proksi

docker-compose up -d nginx

Semak sama ada permulaan adalah ps docker-compose biasa Jika tidak, semak jika terdapat sebarang ralat dalam konfigurasi.

Itu sahaja, biarkan ia buat masa ini dan buat aplikasi.

3. Tambah aplikasi

Tambah tapak https://baipiaoquan.com/.

Mengkonfigurasi bekas aplikasi

Juga gunakan docker-compose untuk mencipta aplikasi.

Ini adalah projek php, jadi aplikasi ini memerlukan sekurang-kurangnya dua bekas perkhidmatan, nginx dan php-fpm Struktur direktori projek adalah seperti berikut:

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

Untuk memudahkan pelarasan, pembolehubah persekitaran digunakan di sini.

Perhatikan nama bekas nginx container_name: ${compose_project_name}_nginx, nilai ini kritikal dan akan digunakan dalam proksi seterusnya.

.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

Nama rangkaian proksi yang digunakan ialah: rangkaian proksi, yang telah dibuat sebelum ini;

nama bekas nginx ialah: baipiaoquan_nginx.

fail docker nginx

Fail ini boleh diambil terus daripada yang sebelumnya, dan kemudian menambah maklumat berkaitan 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

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

Jangan lupa fail php.ini, anda juga boleh menggunakan lalainya, kemudian padamkan konfigurasi berkaitan ini.

Konfigurasi perkhidmatan 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;
  }
}

Saya rasa ia dikonfigurasikan sepenuhnya di sini, anda hanya perlu mengkonfigurasi apa yang diperlukan.

Mulakan aplikasi

Pada ketika ini, anda boleh memulakan perkhidmatan baipiaoquan.com Jalankannya dalam direktori baipiaoquan:

docker-compose up -d nginx

Jika tiada perkara yang tidak dijangka berlaku, aplikasi harus dimulakan dan boleh menerima perkhidmatan. Anda juga boleh mengujinya dengan memasukkan bekas dan mengakses localhost untuk melihat sama ada hasilnya adalah yang anda mahukan. Saya mengujinya seperti ini:

docker-compose exec nginx wget localhost

Kemudian saya melihat saiz data yang dikembalikan dan menilai sama ada ia berjaya berdasarkan situasi.

Anda boleh menyemak sama ada aplikasi berjaya disambungkan ke rangkaian proksi melalui arahan berikut:

docker network inspect proxy-network

Seterusnya, benarkan semua orang di seluruh dunia mengakses aplikasi ini.

Tambah konfigurasi proksi pada nginx-proxy

Nota: Anda mesti memulakan aplikasi dahulu, dan kemudian mulakan proksi, jika tidak, nginx tidak dapat mencari ralat huluan .

Lokasi storan: proxy-nginx/sites/baipiaoquan.com.conf Hanya salin konfigurasi di atas dan tukar beberapa tempat Konfigurasi akhir adalah seperti berikut:

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

Muat semula Pelayan proksi konfigurasi, jalankan dalam direktori nginx-proxy:

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

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

Tunggu sebentar, jika semuanya berjalan lancar, orang di seluruh dunia kini boleh mengakses laman web https://baipiaoquan.com/ ini.

Jika anda perlu menambah aplikasi lain, logik dan prosesnya akan sama. Sebagai contoh, saya menambah aplikasi lain: https://chaohhuahui.com/, dan anda boleh ping alamat IP mereka untuk melihat bahawa ia adalah sama.


Atas ialah kandungan terperinci Cara menggunakan Nginx untuk memproksi berbilang tapak aplikasi di Docker. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam