环境:
CentOS Linux release 8.2.2004 (Core)
nginx/1.18.0
前提是域名已经解析到ESC,并且能够http://www.yunchenit.com访问
接下来重点处理SSL,最终实现https://www.yunchenit.com访问,并且https前面有一把锁的标志。
一、域名申请SSL
登录阿里云,搜索SSL
点击SSl证书,免费证书
第一步0元购买,接下来第二步,按要求填写即可,等待审核。一般15分钟即可。
然后选择Nginx下载到你的电脑
解压如下
这两个文件等下要上传到阿里云的ECS
二、去服务ECS操作
1、用PuTTY登录ECS,创建目录用来放SSL证书文件
进入目录conf
[root@XXX ~]#cd /usr/local/nginx/conf
创建目录cert
#mkdir cert
然后,用FTP上传到/data/www,再拷贝到cert目录下
#cp /data/www/www.test.com.pem /usr/local/nginx/conf/cert
#cp /data/www/www.test.com.key/usr/local/nginx/conf/cert
2、编辑vhost
#cd /usr/local/nginx/conf/vhost
#vi test.conf,粘贴以下内容
server {
listen 80;
server_name www.yunchenit.com test.com;
rewrite ^/.*$ https://www.yunchenit.com permanent;
}
server {
listen 443 ssl;
server_name www.yunchenit.com;
root /data/www/yunchenit/public;
index index.html index.htm index.php;
ssl_certificate /usr/local/nginx/conf/cert/www.yunchenit.com.pem;
ssl_certificate_key /usr/local/nginx/conf/cert/www.yunchenit.com.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|json|swg)$ {
expires 30d;
}
location ~ .*\.(js|css)?$ {
expires 12h;
}
location ~ ^.+\.php {
#fastcgi_pass bakend;
fastcgi_pass unix:/usr/local/php/var/run/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi.conf;
}
access_log /data/www/nginx_log/yunchenit.log access;
}
保存:wq
3、重启看效果
重启nginx
#cd /usr/local/nginx/sbin,输入命令./nginx -s reload
正常来说这样就可以了。
我的情况到这一步就出了问题,重启失败。显示nginx:[emerg]unknown directive ssl
那么,接下来就是一系列的处理。
首先进入nginx下载并解压的源码包目录,我的是下载到/home/soft
#cd /home/soft/nginx-1.18.0
编译
#./configure --prefix=/usr/local/nginx --with-http_ssl_module
这里出错了(SSL模块需要OpenSSL库),那么安装OpenSSL,输入yum -y install openssl openssl-devel,安装完了,
再来#./configure --prefix=/usr/local/nginx --with-http_ssl_module
这下可以了,查看一下效果
#cd /usr/local/nginx/sbin
[root@XXX sbin]# ./nginx -V
nginx version: nginx/1.18.0
built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
built with OpenSSL 1.1.1g FIPS 21 Apr 2020
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module
接下来进行nginx编译
#cd /home/soft/nginx-1.18.0
#make,这里千成不要执行make install,否则就要覆盖安装了
接下来备份原来的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak
然后将刚刚编译好的nginx覆盖掉原有的nginx,nginx需要停止
cp ./objs/nginx /usr/local/nginx/sbin/,这一步覆盖nginx我的又出错了(cp: cannot create regular file `/usr/bin/nginx': Text file busy),真是头大,先关掉
#cd /usr/local/nginx/sbin,输入命令./nginx -s stop
再覆盖就OK了,接下来重启nginx
./nginx -s reload,又出错了([error] open() “/usr/local/var/run/nginx/nginx.pid” failed)
真是麻烦多多,不过离成功不远了
网上资料说没有nginx.pid文件,我一看/usr/local/nginx/logs目录下是真的没有nginx.pid,
那么如何生成这个文件?在sbin/ 路径下执行
#cd /usr/local/nginx/sbin
./nginx -c /usr/local/nginx/conf/nginx.conf,回车
再重./nginx -s reload,成功!
现在在浏览器输入http://www.yunchenit.com,还是打不开,奇怪的很
又是一翻折腾,去看了阿里云的文档,https://help.aliyun.com/document_detail/98728.htm?spm=a2c4g.11186623.2.18.238960e0caAi6H#section-wy0-022-q1s
有这么一句话(#如果您使用Nginx 1.15.0及以上版本,请使用listen 443 ssl代替listen 443和ssl on。),我才发现是配置文件出了问题,打开配置文件
#cd /usr/local/nginx/conf/vhost
#vi test.conf
server{
listen 443;
}
试一下,把listen 443;改成listen 443 ssl;再重启ngnix
打开浏览器输入http://www.yunchenit.com,这次看到了hello world,并且有一把锁。OK搞定。
总结:这次在阿里云nginx环境下部署免费的SSL证书实战,可以说是非常不顺利,虽然最后解决了问题,但是全靠网上搜索,好在有网络哈哈,突然很无奈的感慨:搜索也是一种解决文案
大家有没有像我一样的,从事互联网工作,解决问题全部搜索,哈哈。