背景:
要将nginx1.14.0升级到1.18.0,由于我的场景无需关注nginx相关的服务平滑过渡,且1.14.0和1.18.0差别很大,采取的是先卸载后安装的方法。
1、基于原镜像新建容器
nvidia-docker run -itd –-name newnginx -v 容器外路径:容器内路径 镜像名:latest
2、进入新容器
docker attach newnginx
3、查看当前ngnx版本及配置
nginx -V
复制arguments后面的一大串配置
4、拷贝原配置文件,卸载删除旧的nginx
cp /etc/nginx/nginx.conf 暂存路径
rm -rf /etc/nginx/
rm -rf /usr/sbin/nginx
apt-get remove nginx*
5、下载安装包并解压
下载所需版本的压缩包,并放到服务器指定目录下
tar -zxvf nginx-1.18.0.tar.gz
6、安装依赖
安装nginx需要一堆依赖,下面这些是我的ubuntu环境下需要的,按需安装。
apt-get update
apt-get install libxml2 libxml2-dev libxslt-dev
apt-get install libssl-dev
apt-get install -y libgd-dev
apt-get install libgeoip-dev
7、编译新nginx
A、
cd XXX/nginx-1.18.0
B、
将之前nginx -V获取到的原配置修改一下版本号放在./config 后执行
./config –with-cc-opt XXXXXX 。。。
C、
make
make 时如遇到openssl报错“make[1]: *** [/usr/local/ssl/.openssl/include/openssl/ssl.h] Error 127”,参考这篇文章[/usr/local/openssl//.openssl/include/openssl/ssl.h] Error 127-jiyilee-ChinaUnix博客
这篇文章指出,报错原因是openssl下的几个文件没找到。./configure XXX 参数包含--with-openssl= /usr/lib/ssl ,而/usr/lib/ssl下没有要求的几个文件。“vim . /auto/lib/openssl/conf” ,按照如下方式修改。实际上openssl version -a 打印出的openssl链接不一定就有指定的这些文件。一个镜像中可能有多处有openssl,用find指令可找到合适的-with-openssl路径:find / -name ssl.h
——————————
找到这么一段代码:
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
CORE_LIBS="$CORE_LIBS $NGX_LIBDL"
修改成以下代码:
CORE_INCS="$CORE_INCS $OPENSSL/include"
CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a"
CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
——————————
D、
make install
E、拷贝编译生成的可执行文件
cp objs/nginx /usr/sbin/nginx
默认是执行/usr/sbin/nginx下的文件
8、验证,查看是否安装成功及当前版本
nginx
nginx -V
9、创建虚拟主机配置文件
参考下文:
增加nginx虚拟主机配置文件(conf.d) - 与f - 博客园
nginx1.18.0默认的配置文件为/etc/nginx/nginx.conf,当很多服务要从这个镜像派生,那么就需要把服务对应的nginx配置单独管理,放在/etc/nginx/conf.d下,这个路径需要自己创建。此外,要赋予nginx.conf管理conf.d下的.conf文件的能力。
A、mkdir /etc/nginx/conf.d
B、vim /etc/nginx/nginx.conf 在http下新增include /etc/nginx/conf.d/*.conf;
如果是升级nginx而非首次安装nginx,最好提前拷贝一下nginx.conf文件,步骤B也可改为用原来备份的nginx.conf替代新的nginx.conf文件,第4步在卸载旧版本前就已手动保存旧的nginx.conf。
10、从容器外拷贝.conf文件到conf.d下
nginx是装在镜像内部,然后派生出容器,容器外是看不到/etc/nginx路径的,所以容器外拷贝到容器内需要用到docker cp命令。
docker cp 容器外.conf路径 容器名: /etc/nginx/conf.d
*.conf文件示例:
- server {
- listen 80; #监听容器内80端口
- server_name app1.mydomain.com; #配置域名,不重要,可以写成localhost
- error_log /home/workspace/error.log # 服务错误日志
- access_log /home/workspace/access.log # 接收请求日志
- location / { # 接收请求,可用正则过滤
- include uwsgi_params;
- uwsgi_pass 127.0.0.1:9090; #把所有nginx接收到的请求传给本地9090的uwsgi协议处理
- uwsgi_param UWSGI_PYHOME /var/www/myenv;
- uwsgi_param UWSGI_SCRIPT myapp1; #也可以是参数server:app或run:app等,似乎指服务类型
- uwsgi_param UWSGI_CHDIR /var/www/myappdir1; #项目根目录
- }
- }