nginx配置ssl证书

CentOS下配置nginx的https报错

Posted by fengdi on November 28, 2018

首次安装nginx没带ngx_http_ssl_module编译,导致配置ssl证书后重启服务报错

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:

背景

因为网站要加SSL证书的原因,把nginx折腾了一番,结果SSL相关的配置加到了nginx的配置文件中后,nginx竟然启动不起来了,用 systemctl status nginx 查看到的错误信息大致如下:

Failed to start SYSV: Nginx is an HTTP(S) server, HTTP(S) reverse ...

于是用如下命令测试问题所在(其中/usr/local/nginx/sbin/nginx 是我的nginx安装后的可执行程序路径,/usr/local/nginx/conf/nginx.conf 是我的nginx主配置文件路径):

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

该命令输出如下:

nginx: [emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:41

可见,nginx缺少SSL模块支持。这是因为我当年建站的时候根本没用到SSL啊,所以以前编译nginx的时候使用了不带SSL支持的默认编译参数。 为了让nginx添加SSL模块,只能重新编译它。但是,如何在现有nginx的基础上,添加一个支持SSL的编译参数呢?首先要找回原来编译nginx时的编译参数,然后再加上支持SSL的编译参数。如果不这样做,那么编译出来的nginx可能就会有问题(某些旧的编译参数被去掉了,使得nginx不能支持某些功能)。

所以先查看旧的nginx的编译参数:

/usr/local/nginx/sbin/nginx -V

输出的信息中,最重要的一句是:

configure arguments: --prefix=/usr/local/nginx

也有可能没有冒号后面的参数

可见,当时我编译nginx的时候,只是指定了一个安装路径,没有其他特殊的编译参数。那么现在事情就好办了:回到nginx的源码目录下,加上SSL支持参数重新编译:

1、查看现有nginx配置

首先找到nginx安装包的位置,一般安装位置为/usr/local/nginx,查看nginx编译时的配置:

/usr/local/nginx/sbin/nginx -V  

查看configure arguments:后边有没有值,如果有,就复制下来。

2、编译生成新nginx配置

解压nginx的tar包,进入nginx根目录,加上SSL支持参数重新编译:

./configure --prefix=/usr/local/nginx --with-http_ssl_module

如果这步有一下内容的报错:

./configure: error: SSL modules require the OpenSSL library.

说明缺少openssl,执行以下命令安装:

yum -y install openssl openssl-devel

执行成功之后再执行:

./configure

到此openssl安装完毕,重新进行nginx的configure

成功之后编译:

make

注意,此时千万不能手快直接 make install!因为我原来的nginx还有一堆的配置文件,不能被覆盖。我们应该只覆盖编译出来的nginx可执行程序: 如果需要重新安装,则执行make install,会安装到你configure时指定的路径下

3、把编译好的nginx覆盖掉原有的nginx

先备份已有nginx/sbin目录下的nginx文件

cp /usr/local/nginx/sbin/nginx nginx.bak

拷贝重新编译好的nginx覆盖原有的nginx,在ojbs目录下

cp ./objs/nginx /usr/local/nginx/sbin/

附:安装nginx

更新一些库和必要的支持
#yum update

下载nginx包
#wget http://nginx.org/download/nginx-1.13.6.tar.gz

解压缩
#tar -zvxf nginx-1.13.6.tar.gz /usr/local/

进入程序目录
#cd /usr/local/nginx-1.13.6

nginx有很多很多编译配置项,我基本上都使用了默认的配置:
#./configure --with-http_ssl_module --with-http_gzip_static_module
我只加了两个选项,--with-http_ssl_module表示使用ssl模块,--with-http_gzip_static_module表示使用gzip模块,其它更详细的配置就要参考nginx的文档了:http://nginx.org/en/docs/configure.html

如果没configure成功(会显示XXX not found),那是因为有些依赖没有被正确安装.那么先安装一下这些依赖条件,通常是pcre,zlib这些,这么一下就基本上可以了:
#yum install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

编译
#make
#make install

可执行文件就会被安装在: /usr/sbin/nginx (默认配置)

4、启动nginx

在nginx/sbin目录下执行如下命令:

 ./nginx -c /usr/local/nginx/conf/nginx.conf

5、附录:nginx启动、重启、关闭方法

1.启动

启动代码格式:nginx安装目录地址 -c nginx配置文件地址

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
2.关闭

从容停止

ps -ef|grep nginx
kill -QUIT 2072

快速停止

ps -ef|grep nginx
kill -TERM 2132/kill -INT 2132

强制停止

ps -ef|grep nginx
kill -9 2132/pkill -9 nginx
3.重启

验证nginx配置文件是否正确

方法一:进入nginx安装目录sbin下,输入命令./nginx -t

看到如下显示,说明配置文件正确!

nginx.conf syntax is ok
nginx.conf test is successful

方法二:在启动命令-c前加-t

/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

重启nginx服务 方法一:进入nginx可执行目录sbin下,输入命令./nginx -s reload 即可

方法二:查找当前nginx进程号,然后输入命令:kill -HUP 进程号 实现重启nginx服务