ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Docker nginx部署多个web静态资源,且隐藏端口

2021-10-24 14:30:16  阅读:289  来源: 互联网

标签:web 容器 nginx web1 proxy conf home Docker


背景:

将多个静态资源部署在docker上,希望能直接使用域名访问,而非域名+端口号

具体思路:

先使用docker创建3个nginx容器
1、web1网站部署的nginx 端口81
2、web2网站部署的nginx 端口82
3、proxy_nginx 用于代理转发的nginx 端口80

说明:

1、统一使用proxy_nginx容器来做入口的代理和转发,这种方法,笔者认为比较理想且优质。需要注意的是,proxy_nginx的端口,必须是80,因为你浏览器访问域名,默认不写端口,就是80端口。

提前准备:

1、先到云服务器解析域名,以及在安全组重开放以上使用到的80/82端口。
2、本文使用到的演示域名为xxx1.com,xxx2.com(请自行替换成自己的实际域名)


具体步骤:

一、拉取镜像

docker pull nginx

拉取成功后执行 docker images 即可看nginx 镜像

二、使用docker创建容器,并且映射(挂载)配置文件等

  1. 先新建一个nginx容器,只是为了拷贝其中的配置文件,供后续映射的时候使用 (在nginx.conf中) 。

注: 也可以自己手写映射文件中的内容。或者等创建好容器后直接进入容器中拷贝对应的配置文件也可以。

docker run nginx
  1. 新建一个目录管理web1项目,比如笔者这里是/home/web1/,并在/home/web1/目录下创建conf,www,logs目录
mkdir conf  # 用于管理nginx.conf
mkdir www   # 用于管理静态资源
mkdir logs	# 用于管理日志
  1. 拷贝事先创建的nginx容器中的配置文件到/home/web1/conf下
# 查找container的ID
docker ps -a

# 拷贝事先创建的nginx容器中的配置文件到自己的管理目录下
# xxx为上述创建的nginx容器的ID
docker cp xxx:/etc/nginx/nginx.conf /home/web1/conf/

拷贝完成之后,上述新建的nginx使命完成,直接删除即可

# xxx为上述创建的nginx容器的ID
docker rm xxx
  1. 上传静态网站到/home/web1/www下面(这个目录就是存放网页的)
# -C选项可以启用SSH远程压缩功能,传输速度更快
scp -P 服务器端口号 -C /静态资源路径/ 用户名@主机ip:/home/web1/www/
  1. 创建nginx容器
    注:以下命令为一行,笔者为了方便注释才做了换行
docker run
--privileged #使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
-it     #-t让docker分配一个伪终端并绑定到容器的标准输入上, -i则让容器的标准输入保持打开
-d     #保证容器在后台运行
-p 81:80     #映射本机端口81到容器端口80
--name web1     #container的名字web1
-v /home/web1/www:/usr/share/nginx/html     #映射网页存放目录
-v /home/web1/conf/nginx.conf:/etc/nginx/nginx.conf     #映射配置文件
-v /home/web1/logs:/var/log/nginx     #映射log文件目录
nginx     #镜像

注:这里本机的ip是81,容器内是80(多个容器内的80端口是不会相互冲突影响的,因为docker的容器就是隔离的),外界访问是通过81。

  1. 修改 /home/web1/conf/nginx.conf 的配置( 在其http节点下添加 server ),即可修改容器里面的nginx.conf配置(因为做了映射)。
vim /home/web1/conf/nginx.conf

# 注:本机中的/home/web1/conf/nginx.conf已经映射到实际容器内,实际应以容器为准
server {
	listen 80; #监听的容器内的端口
	# server_name xxx.com; #做好映射的域名
	server_name 120.xx.xx.xx; #或者本机的IP
	location / {
		root /usr/share/nginx/html; #静态资源在实际容器中的路径
		index index.htm index.html;
	}
}
  1. 按esc,:wq 保存成功,重启web1容器就可以了
    注:此处直接重启web1容器也可以,不过此用法的弊端是,如果配置有报错,则不能显示
#方法一
docker restart web1

#方法二
docker exec -it web1 nginx -t
docker exec -it web1 nginx -s reload

这样就成功了,访问http://120.xx.xx.xx:81http://xxx.com:81就能访问网站了;

  1. 参考如上步骤,新建容器web2:
docker run --privileged -it -d -p 82:80 --name web2 -v /home/web2/www:/usr/share/nginx/html -v /home/web2/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/web2/logs:/var/log/nginx nginx

9. 新建容器proxy_nginx用于代理转,且配置代理文件

注意:proxy_nginx容器使用本机的80端口,用于代理转发静态资源web1,web2

docker run --privileged -it -d -p 80:80 --name proxy_nginx -v /home/proxy_nginx/www:/usr/share/nginx/html -v /home/proxy_nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/proxy_nginx/logs:/var/log/nginx nginx

配置代理文件/home/proxy_nginx/conf/nginx.conf

#直接贴代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    # web1
    server {
		listen 80; #本机的80端口
		server_name xxx1.com;
		location / {
			proxy_redirect off;
			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_pass http://120.xx.xx.xx:81/;
		}
    }

    # web2
    server {
		listen 80; #本机的80端口
		server_name xxx2.com;
		location / {
			proxy_redirect off;
			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_pass http://120.xx.xx.xx:82/;
        }
    }
}
  1. 把 xxx1.com 转发到http://120.xx.xx.xx:81(web1);
  2. 把 xxx2.com转发到http://120.xx.xx.xx:82(web2);
  3. 修改了之后,docker restart proxy_nginx;
  4. 直接在浏览器中访问xxx1.com,xxx2.com就可以咯

~end

标签:web,容器,nginx,web1,proxy,conf,home,Docker
来源: https://blog.csdn.net/qq_30669833/article/details/120931562

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有