Docker中使用Nginx代理多个应用站点的方法

Docker中使用Nginx代理多个应用站点的方法,第1张

Docker中使用Nginx代理多个应用站点的方法

本文主要介绍在Docker中使用Nginx代理多个应用站点的方法。通过示例代码进行了非常详细的介绍,对于大家的学习或者工作都有一定的参考价值。有需要的朋友下面跟边肖学习。

前言

代理的作用是什么?
-多个域名解析到同一个服务器。

-方便一个服务器的多个应用只开放一个端口对外。

-不需要用烦人的端口访问应用,直接访问域名即可。

-应用隔离

-降低耦合度

-...

总的来说维护方便,维护一个应用的时候不会影响其他应用。

如何代理(容器之间如何通信)?

直接用nginx的代理功能就行了(相关能力请另参考)。这里的问题是docker容器之间的通信。

集装箱之间主要有四种通信方式:

-通过容器IP访问:容器重新启动后,IP将发生变化。

-通过ip访问:主机的端口:如果主机的IP变了,每一个应用都要重新变,端口也要绑定,比较麻烦。

-通过link建立链接:相互依赖太紧,不利于维护。

-自定义网络:同一桥接网络中的容器可以相互访问。

很明显,你会选择自定义网络,让相关应用链接到同一个网络。这样,应用和代理之间实际上就没有了依赖,不仅方便维护,也方便迁移。配置也不麻烦,把常规的IP或者域名改成对应的容器名就行了。

一、统一网络

然后,首先,您需要创建一个共享桥接网络:

dockernetworkcreateproxy-network #查看 dockernetworkls

二。代理服务容器

创建一个代理专用的nginx服务容器,命名为proxy-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

FROMnginx:alpine LABELmaintainer="chuoke" COPYnginx.conf/etc/nginx/ RUNapkupdate &&apkupgrade &&apkadd--no-cacheopenssl &&apkadd--no-cachebash RUNset-x; addgroup-g82-Swww-data; adduser-u82-D-S-Gwww-datawww-data&&exit0;exit1 ADD./startup.sh/opt/startup.sh RUNsed-i's/.//g'/opt/startup.sh CMD["/bin/bash","/opt/startup.sh"] EXPOSE80443

这里会创建一个运行用户组和用户www-data,方便配置和控制,nginx的配置会用到这个名字。

nginx.conf

userwww-data; worker_processes4; pid/run/nginx.pid; daemonoff; events{ worker_connections2048; multi_accepton; useepoll; } http{ server_tokensoff; sendfileon; tcp_nopushon; tcp_nodelayon; keepalive_timeout15; types_hash_max_size2048; client_max_body_size20M; include/etc/nginx/mime.types; default_typeapplication/octet-stream; access_log/dev/stdout; error_log/dev/stderr; gzipon; gzip_disable"msie6"; ssl_protocolsTLSv1TLSv1.1TLSv1.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_cacheoff;#Disabledforissue619 charsetUTF-8; }

这个内容复制nginx的默认就可以了。需要更改的是运行用户名。请注意,用户名应该与之前的设置一致。

startup.sh

#!/bin/bash #Startcrondinbackground crond-l2-b #Startnginxinforeground nginx

这是用来启动nginx程序的,目前内容比较少,主要是为了以后方便扩展内容。

启动代理服务容器

docker-composeup-dnginx

检查docker-composeps是否正常启动,如果不正常,检查配置错误。

就这样,让我们把它放在一边,创建一个应用程序。

三。添加应用程序

添加站点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的容器名container_name:${compose_project_name}_nginx,这很关键,后续代理会用到。

。包封/包围(动词envelop的简写)

#宿主机中代码的位置 APP_CODE_PATH_HOST=../ #容器中代码的位置 APP_CODE_PATH_CONTAINER=/var/www #这个是抄的laradock APP_CODE_CONTAINER_FLAG=:cached #选择机器上的存储路径。适用于所有储存系统 DATA_PATH_HOST=~/.baipiaoquan/data ###Drivers################################################ #Allvolumesdriver VOLUMES_DRIVER=local #网络驱动 NETWORKS_DRIVER=bridge #代理网络名称,这是前面创建的 PROXY_NETWORK_NAME=proxy-network ###Dockercomposefiles################################## # COMPOSE_FILE=docker-compose.yml #Changetheseparatorfrom:to;onWindows COMPOSE_PATH_SEPARATOR=: #项目名称 COMPOSE_PROJECT_NAME=baipiaoquan

使用的代理网络名称是:proxy-network,是之前创建的;
nginx的容器名会是:baipiaoquan_nginx。

nginx的dockerfile

这个文件可以直接取前一个,然后加一些php相关的东西。

FROMnginx:alpine COPYnginx.conf/etc/nginx/ RUNapkupdate &&apkupgrade &&apk--updateaddlogrotate &&apkadd--no-cacheopenssl &&apkadd--no-cachebash RUNset-x; addgroup-g82-Swww-data; adduser-u82-D-S-Gwww-datawww-data&&exit0;exit1 ARGPHP_UPSTREAM_CONTAINER=php-fpm ARGPHP_UPSTREAM_PORT=9000 #Setupstreamconfandremovethedefaultconf RUNecho"upstreamphp-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 RUNsed-i's/.//g'/opt/startup.sh CMD["/bin/bash","/opt/startup.sh"] EXPOSE80443

php-fpm的dockerfile

FROMphp:7.3-fpm ARGPUID=1000 ENVPUID${PUID} ARGPGID=1000 ENVPGID${PGID} RUNgroupmod-o-g${PGID}www-data&& usermod-o-u${PUID}-gwww-datawww-data EXPOSE9000 WORKDIR/var/www CMD["php-fpm"]

不要忘记php.ini文件,你也可以使用它的默认,所以你必须删除这个相关的配置。

服务配置baipiaoquan.com.conf

server{ listen80default_server; #Forhttps listen443ssldefault_server; ssl_certificate/etc/nginx/ssl/3243258_baipiaoquan.com.pem; ssl_certificate_key/etc/nginx/ssl/3243258_baipiaoquan.com.key; ssl_session_timeout5m; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_cipherson; add_headerX-Frame-Options"SAMEORIGIN"; add_headerX-XSS-Protection"1;mode=block"; add_headerX-Content-Type-Options"nosniff"; #localhost一定要 server_namelocalhostbaipiaoquan.comwww.baipiaoquan.com; root/var/www/;#这个和前面的配置保持一致 indexindex.phpindex.htmlindex.htm; location/{ try_files$uri$uri//index.php$is_args$args; } location~.php${ try_files$uri/index.php=404; fastcgi_passphp-upstream;#这个是nginxDockerfile里配置的 fastcgi_indexindex.php; fastcgi_buffers1616k; fastcgi_buffer_size32k; fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name; #fixestimeouts fastcgi_read_timeout600; includefastcgi_params; } location~/.ht{ denyall; } location/.well-known/acme-challenge/{ root/var/www/letsencrypt/; log_not_foundoff; } }

我这里都有。其实是可以精简的。你只需要配置你需要的。

启动应用程序

至此,已经可以启动百票圈.com的服务,在百票圈的目录下运行了:

docker-composeup-dnginx

如果不出意外,应用程序应该可以启动并接受服务。您也可以测试它,进入容器并访问localhost,看看结果是否是您想要的。我是这样测试的:

docker-composeexecnginxwgetlocalhost

然后看返回数据的大小,根据情况判断是否成功。
您可以通过以下命令检查应用程序是否成功连接到代理网络:

dockernetworkinspectproxy-network

接下来,让全世界的人都能接触到这个应用。

向nginx-proxy添加代理配置[/s2/]

注意:先启动应用,再启动代理,否则nginx会报告找不到上游。

存储位置:proxy-nginx/sites/baipianoquan.com.conf复制上面的配置,改几个地方就行了。最终配置如下:

#我这配的仅支持https,如果没要求,这个就不需要 server{ listen80; server_namebaipiaoquan.comwww.baipiaoquan.com; return301https://$host$request_uri; } server{ #如果是http就配置这个 #listen80default_server; #如果是https就配置这个 listen443ssl; ssl_certificate/etc/nginx/ssl/3243258_baipiaoquan.com.pem; ssl_certificate_key/etc/nginx/ssl/3243258_baipiaoquan.com.key; ssl_session_timeout5m; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_ciphersECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_cipherson; server_namebaipiaoquan.comwww.baipiaoquan.com; add_headerX-Frame-Options"SAMEORIGIN"; add_headerX-XSS-Protection"1;mode=block"; add_headerX-Content-Type-Options"nosniff"; location/{ proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; proxy_set_headerX-Forwarded-Proto$scheme; proxy_set_headerX-Forwarded-Host$host; proxy_set_headerX-Forwarded-Port$server_port; proxy_passhttp://baipiaoquan_nginx/;#这个值就是应用nginx的容器名称 } }

重新加载代理服务器的配置,并在nginx-proxy目录下运行它:

#先测试下配置文件,这步一定要执行成功 docker-composeexecnginxnginx-t #如果提示成功,则重新加载,否则就按提示检查修改配置文件 docker-composeexecnginxnginx-sreload

等一下,如果一切顺利,那么全世界的人现在都应该可以访问这个https://baipiaoquan.com/网站了。

如果需要添加其他应用,也是同样的逻辑,流程复制。例如,我添加了另一个应用程序:https://chaohuahui.com/.你可以ping他们的IP是相同的。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/774709.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存