Nginx安装SSL证书,配置符合百度SEO要求的HTTPS

一,首先购买SSL证书
阿里云腾讯云这些大公司的云平台都有提供免费的SSL证书,对于百度来说,免费证书和付费证书有没有什么区别,不是很了解。我的思路是,个人网站,经济不宽裕的,用免费证书,公司网站,尽量用付费证书,买一个通配符域名证书,一年1200元左右。

在阿里云申请证书,然后绑定域名申请签发,会审核个几十分钟就下来了。

二,下载SSL证书
在阿里云SSL证书列表,每个证书后面都有一个下载按钮,点击后根据服务器类型选择对应的证书。常见的web服务器类型有Tomcat,Apache,Nginx,IIS。这里我们选择Nginx的证书,下载后解压,得到2个文件,类似:3029185__xxoo.com.key3029185__xxoo.com.pem

.

三,上传SSL证书
1,把.key和.pem2个证书文件放在一个cert文件夹里
2,上传cert文件夹到Linux服务器Nginx的conf目录下。我用lnmp套件搭建的环境,具体路径是/usr/local/nginx/conf/

四,Nginx虚拟主机配置SSL证书
1,我的每个网站都单独生成了一个虚拟主机配置文件.conf,参考:nginx的虚拟主机配置的有序管理
2,打开对应网站虚拟主机配置文件,你会看到如下代码,这说明网站启用了80端口,且开通了http访问

server {
    listen 80;
    server_name www.xxoo.com;
    index index.html index.php;
    root  /home/wwwroot/www.xxoo.com;
    ......
}

3,再加一段server,启用443端口,且启用https访问的代码,如下:

server {
    listen 443;
    server_name www.xxoo.com;
    ssl on;
    root /home/wwwroot/www.xxoo.com;
    index index.html index.php; 

    ssl_certificate  cert/3029185__xxoo.com.pem;
    ssl_certificate_key  cert/3029185__xxoo.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;
}

最好要能明白上面每一行代码:
A,listen 443;表示监听443端口
B,server_name www.xxoo.com;表示启用域名www.xxoo.com
C,ssl on;启用SSL
D,root /home/wwwroot/www.xxoo.com;网站在服务器上的目录路径
E,index index.html index.php;默认首页文件,先找index.html,再找index.php,2个文件都找不到的话,就会返回403之类的错误。
F,ssl_certificate和ssl_certificate_key,这两行指定证书位置,我们第三步的操作和这里对应的,注意相对路径和文件名不要出错
G,ssl_session_timeout、ssl_ciphers、ssl_protocols、ssl_prefer_server_ciphers这四行就按上面代码设置即可。

五,让HTTPS生效
1,上传第四点修改的虚拟主机配置文件.conf,重启Ningx服务
2,浏览器访问https://www.xxoo.com,看是不是可以访问了
3,如果不能访问,看看你的服务器是不是开放了443端口访问(很多人忘记了这一步)。阿里云服务器是在安全组配置。

到这里,你网站http和https两个协议都可以访问了,属于共存的。当然,这肯定不符合百度SEO的规范,百度会当成2个站进行收录,造成镜像站。所以要进行下一步。

六,让HTTP301重定向到HTTPS
1,让http://www.xxoo.com 301重定向到https://www.xxoo.com,把原来80端口的server代码段精简成下面:

server {
    listen 80;
    server_name www.xxoo.com;
    return 301 https://www.xxoo.com$request_uri;
}

2,让http://xxoo.com 301重定向到https://www.xxoo.com,新增下面server代码段:

server {
    listen 80;
    server_name xxoo.com;
    return 301 https://www.xxoo.com$request_uri;
}

3,让https://xxoo.com 301重定向到https://www.xxoo.com,新增下面server代码段:

server {
    listen 443;
    server_name xxoo.com;
    return 301 https://www.xxoo.com$request_uri;
}

当然熟悉这个配置的同学,可以把上面的四个server代码合并,但这样写出来更井井有条。这样就实现了:
访问http://www.xxoo.com/首页及其下面任何页面,都会301到https://www.xxoo.com对应的页面
访问http://xxoo.com/首页及其下面任何页面,都会301到https://www.xxoo.com对应的页面
访问https://xxoo.com/首页及其下面任何页面,都会301到https://www.xxoo.com对应的页面
真正实现了网站域名的统一和权重的集中。

七,虚拟主机配置的完善
1,https网站的一些静态资源比如css/js/png/jpg这些文件设置一些缓存时间。
2,http的301跳转以及https的一些访问要记录到日志log文件里。
3,其他相关配置

八,用https://myssl.com测试你网站SSL配置是否正确。

九,奉上我整个网站的配置代码:

server {
    listen 443;
    server_name www.xxoo.com;
    ssl on;
    root /home/wwwroot/www.xxoo.com;
    index index.html index.php; 
    access_log  /home/wwwlogs/www.xxoo.com.log  access;

    ssl_certificate  cert/2550234__xxoo.com.pem;
    ssl_certificate_key  cert/2550234__xxoo.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 ~ [^/]\.php(/|$)
    {
        try_files $uri =404;
        fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        access_log off;
    }
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        access_log off;
    }
}
server {
    listen 443;
    server_name xxoo.com;
    return 301 https://www.xxoo.com$request_uri;
    access_log  /home/wwwlogs/www.xxoo.com.log  access;
}
server {
    listen 80;
    server_name xxoo.com;
    return 301 https://www.xxoo.com$request_uri;
    access_log  /home/wwwlogs/www.xxoo.com.log  access;
}
server {
    listen 80;
    server_name www.xxoo.com;
    return 301 https://www.xxoo.com$request_uri;
    access_log  /home/wwwlogs/www.xxoo.com.log  access;
}