centos nginx 容器?好用的docker容器
Docker实战:Docker安装nginx并配置SSL
在Docker实战中,我们将展示如何在Centos8环境下安装Nginx并配置SSL,以实现安全的Web服务部署。
首先,我们需要拉取Nginx镜像。通过执行docker pull nginx命令,获取Nginx容器镜像。
接着,启动Nginx容器。使用docker run-d-p 80:80--name nginx nginx命令,将Nginx容器在后台运行,并映射宿主机的80端口到容器内的80端口。
在浏览器中访问宿主机的80端口,可以看到Nginx的默认页面。
为了进行安全的Web服务,我们接下来需要备份Nginx目录到宿主机。通过mkdir/opt/nginx指令创建容器目录,然后使用docker cp nginx:/etc/nginx/opt/nginx命令,将容器内的Nginx配置文件复制到宿主机目录。
停止并删除Nginx容器,以便进行SSL配置。使用docker stop nginx命令停止容器,然后使用docker rm nginx命令删除容器。
重新启动Nginx容器,并添加SSL支持。执行docker run-d-p 80:80-p 443:443--name nginx-v/opt/nginx:/etc/nginx nginx命令,将容器内的端口映射到宿主机,并挂载Nginx配置文件。
查看目录挂载状态,通过docker inspect nginx命令获取容器详情。
在宿主机创建ssl目录,并将SSL证书文件放置于此目录。使用mkdir/opt/nginx/ssl命令创建目录,然后通过docker exec-it nginx/bin/bash指令进入容器内部,将证书文件复制到/etc/nginx/ssl目录下。
修改宿主机Nginx配置文件,加入SSL证书配置。使用vim/opt/nginx/nginx.conf指令打开配置文件,进行SSL相关配置修改。
重启Nginx容器,执行docker restart nginx命令。
访问Nginx页面,确认SSL证书配置是否生效。尝试访问或,以测试SSL加密效果。
为提升开发者的效率,我们推荐使用流程图工具来提升代码理解。整理在线笔记软件和远程协作工具以提高远程工作效率。此外,了解51单片机的基础知识、断路器、接触器、继电器等相关硬件知识,也能为硬件项目的开发提供支持。
centos如何安装指定版本的nginx
在 CentOS上安装指定版本的 Nginx,首先访问 Nginx官方网站获取所需版本的源码。下载完成后,使用命令行编译并安装源码。编译过程通常涉及解压源码,进入解压后的目录并执行./configure命令,以确保与系统兼容性。接着执行 make命令生成可执行文件,最后使用 make install命令安装 Nginx。
安装过程中,可能会遇到编译选项问题。确保正确配置编译选项,如指定安装路径、启用或禁用特定功能等。在执行./configure命令时,根据需要添加相应的选项参数。例如,要指定特定的安装目录,可使用--prefix=/usr/local/nginx选项;若需安装自定义模块,可以添加--add-module=/path/to/module选项。
另一个解决方案是使用 Docker容器技术。Docker可以提供一个隔离的环境,简化 Nginx的安装和配置过程。通过创建或拉取包含所需 Nginx版本的 Docker镜像,可以轻松地在 Docker容器中运行 Nginx。利用 Dockerfile编写构建脚本,可以进一步定制容器内的环境,如配置文件、自定义模块等。
无论选择编译安装还是使用 Docker,都需要确保系统依赖库满足 Nginx的要求,如 OpenSSL、zlib、pcre等。通过包管理器(如 yum或 apt)安装必要的依赖库,可以简化整个安装流程。安装完成后,可以通过 systemctl命令启动、停止或管理 Nginx服务,确保其正常运行。
总之,在 CentOS上安装指定版本的 Nginx,可以采用编译安装或 Docker容器技术。通过正确配置编译选项或选择合适的 Docker镜像,可以轻松实现目标,并确保 Nginx在 CentOS系统上的稳定运行。
Golang实践录:使用gin框架实现转发功能:利用nginx转发
近段时间需要实现一个转发 post请求到指定后端服务的小工具,由于一直想学习 gin框架,所以就使用这个框架进行尝试,预计会产生几篇文章。本文研究如何利用 nginx容器和后端服务进行转发工具的测试。
概述
转发的工具实现起来比较简单,但为了验证,还需要使用其它工具配合,本文自编后端程序,并使用 nginx实现多个后端程序的转发。为方便理解,下面给出示例图。不使用 nginx实现转发如下图所示:
使用 nginx实现转发如下图所示:
注1:两个图片相近,注意图中 URL的变化。注2:在本文中,客户端可以跨过 nginx直接访问后端的服务,在实际中似乎不太好,因只做演示,故不再深入考虑。
后端服务
前面文章已经实现了简单的后端服务响应函数,此处不再列出。需要注意的是,因本系列转发和后端均用同一套代码,如果要在程序中启动后端服务,必须修改后端服务可执行文件名称,参考前文代码。
nginx容器启动及重启
本文使用镜像centos/nginx-116-centos7进行测试。简单启动如下:
dockerrun-itd--namenginx-p8080:8080-v$PWD:/opt/bincentos/nginx-116-centos7bash
实践中使用docker-compose启动,docker-compose.yml文件如下:
version:'2'services:nginx:image:centos/nginx-116-centos7container_name:nginxcommand:/bin/bash-c"/home/latelee/bin/run.sh"volumes:-$PWD/bin:/home/latelee/bin-$PWD/nginx/log:/var/opt/rh/rh-nginx116/log/nginx-$PWD/nginx/etc:/etc/nginx-/etc/localtime:/etc/localtime#environment:#-ORACLE_HOME=/work/instantclient_12_1#-TNS_ADMIN=$ORACLE_HOMEports:-8080:8080-8090:8090
注:后端服务程序(和启动脚本)以及 nginx配置文件均放到主机目录,因为这样更容易更新。
为了在容器启动时运行自定义的命令,需要关闭 nginx服务的后台执行,启动脚本 run.sh内容如下:
#!/bin/bashecho"run..."cd/home/latelee/binnginx-g"daemonoff;"&sleep1./httpforward.exe-p8090
关于在容器中启动 nginx的方法,官方 docker有介绍:
If you add a custom CMD in the Dockerfile, be sure to include-g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly(otherwise your container will stop immediately after starting)!
大意是说,当我们自定义启动命令时,必须添加-g daemon off,否则自定义命令启动完毕后,容器就会自动退出。
启动容器:
docker-composeup-d
查看日志:
docker-composelogs-f
默认情况下 nginx已经启动了。如果修改了配置。可以重启容器,也可以在容器内重启,重启命令为nginx-s reload。nginx-s仅支持4个参数:stop, quit, reopen, reload,官方文档将其称为信号(signal)。如果执行nginx-s stop停止 nginx,再次重启,会提示nginx: [error] open()"/var/opt/rh/rh-nginx116/run/nginx/nginx.pid" failed(2: No such file or directory)。因此,修改 nginx配置后,使用reload即可。
nginx转发的一些测试
在笔者环境中,不论在容器内,还是在物理机,nginx配置文件为/etc/nginx/nginx.conf(注:实际,nginx还会读取/etc/nginx/conf.d目录,但不在本文讨论范围),修改该文件后,必须执行nginx-s reload重启 nginx。对于 location的配置,一般如下:
location/fee/9000{proxy_pass$proxy_host;proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;}
发送到 nginx服务器的请求,如果 URL为/fee/9000,则转发到本地的 9000端口的服务。(注:/fee/9000还可以继续添加后缀 URL,但不是本次讨论的范围),其它转发类似。经测试,直接用proxy_pass字段指定后端服务地址即可。如下:
location/fee/9000{proxy_pass;}
测试中发现,当使用上述转发规则时,后端程序必须实现/fee/9000的响应,即在容器中能正常请求。如果不实现,会提示 404。而本文的后端不能响应带后缀的URL。
经查,在后端程序 URL后添加斜杠/可解决问题,如下:
location/fee/9000{proxy_pass;}
两者对比如下:
不加斜杠:添加斜杠:添加斜杠的扩展:
对于笔者的应用,请求后端程序的URL必须是的形式,不能再额外添加后缀,由于对 nginx研究未深,暂不展开讨论。
实验结果
请求命令:
$curl"file=@sample.json"%Total%Received%XferdAverageSpeedTimeTimeTimeCurrentDloadUploadTotalSpentLeftSpeed10043410098100336392013440--:--:----:--:----:--:--18083{"code":0,"data":{"result":"okinbackendserver,port:9001info:runinport9001"},"msg":"ok"}
转发工具:
version:'2'services:nginx:image:centos/nginx-116-centos7container_name:nginxcommand:/bin/bash-c"/home/latelee/bin/run.sh"volumes:-$PWD/bin:/home/latelee/bin-$PWD/nginx/log:/var/opt/rh/rh-nginx116/log/nginx-$PWD/nginx/etc:/etc/nginx-/etc/localtime:/etc/localtime#environment:#-ORACLE_HOME=/work/instantclient_12_1#-TNS_ADMIN=$ORACLE_HOMEports:-8080:8080-8090:80900
nginx日志:
version:'2'services:nginx:image:centos/nginx-116-centos7container_name:nginxcommand:/bin/bash-c"/home/latelee/bin/run.sh"volumes:-$PWD/bin:/home/latelee/bin-$PWD/nginx/log:/var/opt/rh/rh-nginx116/log/nginx-$PWD/nginx/etc:/etc/nginx-/etc/localtime:/etc/localtime#environment:#-ORACLE_HOME=/work/instantclient_12_1#-TNS_ADMIN=$ORACLE_HOMEports:-8080:8080-8090:80901小结
本文中,自编的转发工具要管理和配置后端程序以及 nginx,即启动若干后端程序,根据规则分配端口号(从9000开始)和 URL,将其写到 nginx配置文件,最后重启 nginx服务。——当然,这些都是使用较简单的方法。在启动后端程序中,由于笔者使用相同的代码,因此花了一些时间排查问题。在测试 nginx转发 URL时,也花了较多的时间(前后大概2个深夜的时间)。
在后续中,笔者将研究如何自实现负载均衡算法。——计划做此事已了大半年,趁此机会抽点时间搞下。
参考
关于转发 URL的讨论 nginx镜像: