本文主要介绍在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
将外部端口80和443绑定到代理服务器,所有应用程序都可以从这里进入。
Dockerfile
这里会创建一个运行用户组和用户www-data,方便配置和控制,nginx的配置会用到这个名字。
nginx.conf
这个内容复制nginx的默认就可以了。需要更改的是运行用户名。请注意,用户名应该与之前的设置一致。
startup.sh
这是用来启动nginx程序的,目前内容比较少,主要是为了以后方便扩展内容。
启动代理服务容器
检查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.inidocker-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"] EXPOSE80443php-fpm的dockerfile
不要忘记php.ini文件,你也可以使用它的默认,所以你必须删除这个相关的配置。
服务配置baipiaoquan.com.conf
我这里都有。其实是可以精简的。你只需要配置你需要的。
启动应用程序
至此,已经可以启动百票圈.com的服务,在百票圈的目录下运行了:
docker-composeup-dnginx如果不出意外,应用程序应该可以启动并接受服务。您也可以测试它,进入容器并访问localhost,看看结果是否是您想要的。我是这样测试的:
docker-composeexecnginxwgetlocalhost然后看返回数据的大小,根据情况判断是否成功。
您可以通过以下命令检查应用程序是否成功连接到代理网络:
接下来,让全世界的人都能接触到这个应用。
向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是相同的。
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)