ubuntu16.04安装nginx-1.12.1开启http2

我的机子是ubuntu16.04,虽然说默认安装的openssl是1.0.2f.可是用apt安装的版本使用的openssl就是1.0.1f的,气死我了,所以我选择了编译安装

先看看nginx版本

$ nginx -V //注意V大写的

如果这行

nginx version: nginx/1.13.3

nginx版本不能低于1.9.0,不然无法支持HTTP/2.找个官方长期支持版本就好了

built with OpenSSL 1.1.0f 25 May 2017

openssl版本最好在1.0.2或者以上的.直接可以nginx配置下开启HTTP/2,不用瞎折腾,具体配置下面一起讲

编译安装openssl

openssl官网下载地址 https://www.openssl.org/source/

1、下载你需要的OpenSSL版本

我这儿的版本是 1.0.2j,我自己线上1.1.0f,怕太高碰到坑,还是稳定版用用好了

$ sudo wget https://www.openssl.org/source/openssl-1.0.2l.tar.gz
error_log  logs/error.log  error;
//日志 日志地址 变量(也不知道该怎么描述,反正我是这么认为)
//确保 logs文件夹存在哦

2、解压下载的OpenSSL压缩包

$ sudo tar -xzvf openssl-1.0.2l.tar.gz

3、开始编辑OpenSSL

$ cd openssl-1.0.2l
$ sudo ./config
$ sudo make install

4、建立软链

和所谓软连接,就相当于快捷方式吧,差不多可以这么理解

sudo ln -sf /usr/local/ssl/bin/openssl  openssl

5、版本验证

$ openssl version -v

如果版本是上面安装的1.0.2l,更新也会变化,这样子就对了,不然,嗯,洗洗睡吧…

编译nginx

1、下载nginx tar包

nginx官方下载地址 http://nginx.org/

$ sudo wget http://nginx.org/download/nginx-1.12.1.tar.gz
$ sudo tar -zxvf nginx-1.12.1.tar.gz
$ cd nginx-1.12.1

这儿就用官方长期维护版本好了,不然如果想用nginx amplify 就比较麻烦了.这儿插个嘴,nginx amplify是一个nginx官方搞得监控你服务器上nginx性能之类的可视化平台,有兴趣可以搞一搞

2、开始./configure

$ sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --with-openssl=./openssl-1.0.2j  --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module

可能你的openssl这儿报错啥的,自己随机应变

3、开始编译Nginx

$ sudo make
$ sudo make install

4、开启nginx

$ sudo nginx

5、验证Nginx

$ nginx -V

看看你 built with OpenSSL 1.0.2j 26 Sep 2016这行是不是1.0.2j,是的话就ok了,可以美滋滋的上去配置了,不是的话可以看下./configure 配置这儿的地址填自己的

6、nginx配置

少年,是不是以为这样子就完成了…呵呵呵太天真了,还需在nginx.conf里配置一下

   listen       443 ssl http2 fastopen=3 reuseport;
//在listen里加入http2即可,简单随意

然后重启下nginx,同时测试下配置有没有错误

$ nginx- q&&nginx -t&&nginx -s reload

7.查看是否成功打开

可以在chrome F12里的network中查看protocol是否是h2,是的话即开启成功

注:protocol需要自己打开,默认没有显示

当然也可以通过这个网站qualys来测试,他的比较全面,我就不一一介绍了。

ngx_http_mirror_module- nginx流量镜像模块用法

Nginx 1.13.4版本新增了ngx_http_mirror_module模块。

ngx_http_mirror_module模块适用于这样一种场景,可以把真实请求引流到测试环境。

配置示例

location / {

    mirror /mirror;

    proxy_pass http://backend;

}


location /mirror {

    internal;

    proxy_pass http://test_backend$request_uri;

}

配置两组后台服务器,http://backend指向生产服务器, http://test_backend指向测试服务器。

用户访问生产服务器的同时,请求会被nginx复制发送给测试服务器,需要注意的一点是mirror不会输出http返回内容。

Nginx流量拷贝ngx_http_mirror_module模块配置及分析

一、背景

最近nginx官网公布了nginx1.13.4最新的ngx_http_mirror_module模块,利用mirror模块,业务可以将线上实时访问流量拷贝至其他环境,基于这些流量可以做版本发布前的预先验证,进行流量放大后的压测等等。本着兴趣笔者调研了其实现原理和使用方式,通过demo的形式展示给读者,希望能解决大家在使用过程中遇到的问题。

二、mirror模块配置

mirror模块配置分为两部分,源地址和镜像地址配置,配置位置可以为nginx配置文件的http, server, location上下文,配置示例为:

# original配置
location / {
    mirror /mirror;
    mirror_request_body off;
    proxy_pass http://127.0.0.1:9502;
}

# mirror配置
location /mirror {
    internal;
    proxy_pass http://127.0.0.1:8081$request_uri;
    proxy_set_header X-Original-URI $request_uri;
}

1、original配置

  • location /指定了源uri为/

  • mirror /mirror指定镜像uri为/mirror

  • mirror_request_body off | on 指定是否镜像请求body部分,此选项与proxy_request_buffering、fastcgi_request_buffering、scgi_request_buffering和 uwsgi_request_buffering冲突,一旦开启mirror_request_body为on,则请求自动缓存;

  • proxy_pass 指定上游server的地址

2、mirror配置

  • internal 指定此location只能被“内部的”请求调用,外部的调用请求会返回”Not found” (404)

  • proxy_pass 指定上游server的地址

  • proxy_set_header 设置镜像流量的头部

未分类

按照上述配置,搭建了上图所示的验证环境,各个模块均部署在本机,由curl发起请求:

curl 127.0.0.1

original和mirror均为上游server PHP脚本,其中original返回响应response to client。 抓包结果如下图:

未分类

分析抓包结果,整个请求流程为:

  • curl向nginx 80端口发起GET / HTTP请求

  • nginx将请求转发至upstream 9502端口的original php脚本,nginx本地端口为51637

  • nginx将请求镜像发至upstream 8081端口的mirror PHP脚本,nginx本地端口为51638

  • original发送响应response to client至nginx

  • nginx将响应转发至curl,curl将响应展示到终端

  • mirror将响应发送至nginx,nginx丢弃。

由此可见,在整个流程中,nginx将请求转发送至original和mirror,然后等待响应,几乎不会对正常请求造成影响,整个处理过程是完全异步的。

三、mirror模块实现

static ngx_int_t
ngx_http_mirror_handler_internal(ngx_http_request_t *r)
{
    ngx_str_t                   *name;
    ngx_uint_t                   i;
    ngx_http_request_t          *sr;
    ngx_http_mirror_loc_conf_t  *mlcf;

    mlcf = ngx_http_get_module_loc_conf(r, ngx_http_mirror_module);

    name = mlcf->mirror->elts;

    for (i = 0; i < mlcf->mirror->nelts; i++) {
        if (ngx_http_subrequest(r, &name[i], &r->args, &sr, NULL,
                                NGX_HTTP_SUBREQUEST_BACKGROUND)
            != NGX_OK)
        {
            return NGX_HTTP_INTERNAL_SERVER_ERROR;
        }

        sr->header_only = 1;
        sr->method = r->method;
        sr->method_name = r->method_name;
    }

    return NGX_DECLINED;
}

nginx有关mirror的代码位于文件src/http/modules/ngx_http_mirror_module.c文件,上述为文件中的ngx_http_mirror_handler_internal函数。在开启了mirror之后此函数会被执行,可见其内部主要通过ngx_http_subrequest发起http子请求来实现的。

通过代码可见,nginx支持配置多个mirror uri,示例为:

location / {
    mirror /mirror;
    mirror /mirror2;
    mirror_request_body off;
    proxy_pass http://127.0.0.1:9502;
}

location /mirror {
    internal;
    proxy_pass http://127.0.0.1:8081$request_uri;
}

location /mirror2 {
    internal;
    proxy_pass http://127.0.0.1:8081$request_uri;
}

搭建nginx gunicorn mysql环境部署django应用

说实在的第一次用服务器来部署django确实有点不知所措,上网查了一些资料,准备部署一个nginx+gunicorn+django+mysql的一个博客系统。

用户环境

  • 服务器:阿里云服务器ECS
  • 镜像系统:ubuntu16.04 64位
  • 准备建立:nginx+gunicorn+django+mysql的博客系统

首先登陆到云服务器,也不知道先干什么,那么先更新一下吧

sudo apt-get update
sudo apt-get upgrade

中间可能会询问一些问题,输入y即可。

nginx

简单介绍一下,nginx是一个轻量级的高性能的web服务器,反向代理服务器以及邮件服务器。首先来配置一下nginx

sudo apt-get install nginx

一阵等待之后nginx就安装好了,首先来看一下nginx.conf配置

# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

这一段代码是安装nginx后的nginx的默认配置,关于nginx的配置优化后续再讲,现在重要的是将服务器给搭建起来,首先简单的讲解一下

在默认配置中,nginx总共分为四个部分:

1、全局设置,主要用来设置nginx的相关配置,比如设定nginx运行的用户和用户组、运行的进程数、运行的文件等。该部分设置在{}之外。

2、events设置,从字面理解,events就是事件的意思,这里是设置事件的相关配置,如事件处理方式是epoll还是select、单个进程的最大连接数,网络IO模型等。

3、http设置,这里是http服务器的相关配置,从默认配置看,大致有五种,基本配置、SSL配置、Log配置、Gzip配置以及虚拟端口设置。这里我们先看虚拟端口这只,这里用include引入了两个文件,/etc/nginx/conf.d/.conf 和/etc/nginx/site-enabled/。我这里就直接将我自己的服务器配置放在conf.d/blog.conf文件中。

server {
    listen 80;
    server_name final-skynet.xin;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

这段代码的意思是nginx监听80端口,服务器的地址是final-skynet.xin,location是一个匹配规则,匹配到监听的url,具体的匹配规则这里就不详细赘述了。匹配成功后,转发到本地的http://127.0.0.1:8080地址,这是gunicorn监听的地址,然后设置其他需要转发的内容。

4、最后一个是mail设置,由于本项目现在还用不着,所以就将默认的代码注释删除了。nginx的基本配置就到这里了。

安装gunicorn和django

sudo pip install gunicorn
sudo apt-get install django

输入上述命令就可以安装好django和gunicorn了,这里先简单的配置一下django,创建一个简单的blog应用。

1、创建新项目

django-admin startproject SkyNet

在根目录输入该命令就可以创建一个新的django项目SkyNet,然后创建一个新的blog应用

进入SkyNet文件夹可以看到该文件夹的目录结构如下

/SkyNet
    manage.py
    /SkyNet
        __init__.py
        settings.py
        urls.py
        wsgi.py

然后在SkyNet目录下运行以下命令

python manage.py startapp blog

然后可以看见SkyNet目录下多了一个blog的文件夹,这个就是新创建的blog app

2、创建index页面

那先创建一个index页面来验证一下我们的配置。

  • 在urls.py中进行配置
from django.conf.urls import url
from django.contrib import admin
from blog.views import *

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$',index,name='index')
]
  • 创建index视图
from __future__ import unicode_literals

from django.shortcuts import render
from django.http import HttpResponse

def index(request):
    return HttpResponse('Hello , this is my first index')

现在需要在INSTALL_APPS配置创建的app和gunicorn

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'gunicorn',
    'blog',
]

下面需要通过gunicorn来启动django

gunicorn Skynet.wsgi:application -b 127.0.0.1:8080

最后在浏览器中输入网址进行验证

未分类

可能你需要重启一下你的nginx
讲到这个地方,云服务的环境部署应该是告一段落了

但是呢,在文章的开头,需要建立的是nginx+gunicorn+django+mysql的一个服务器,剩下的就是mysql的安装了

sudo apt-get install mysql-server

然后在安装的过程中提示需要设置密码,这个时候你可以选择设置密码,或者直接选择OK跳过。

我在这里是选择的跳过,安装完毕验证一下数据是否安装成功。由于我这里没有设置密码,故直接输入mysql就进入了mysql的命令行,设置密码的可以输入

mysql -u root -p

然后输入密码进入命令行。

在mysql创建数据库的时候经常出现编码问题,这里我先解决一下mysql的编码问题,在/etc/mysql/my.cnf中引用了conf.d中的文件,所以直接在/etc/mysql/conf.d/mysql.cnf进行修改。
首先查看一下mysql的编码,进入mysql命令行

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
//或者
mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using  EditLine wrapper

Connection id:      4
Current database:
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.19-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         1 min 16 sec

可以看到db和server的characterset都默认为latin1,这里需要设置[mysqld]的character-set-server = utf8即可

//mysql.cnf
[mysqld]
character-set-server = utf8

然后重启mysql服务,在命令行输入

service mysql restart

然后重新查看,可以看到mysql的默认编码已经改过来了。

如果你不想这么麻烦,可以在创建数据库的时候设置编码为utf8即可
如下命令

CREATE DATABSE db_name DEFUALT CHARACTER SET utf8;

下面在django中配置mysql

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog',
        'USER': 'root',
        'PASSWORD': '',
        'HOST':'',
        'PORT':'',
    }
}

这里由于我的mysql用户没有设置密码所以,password为空,后续再进行设置
先需要在mysql中创建数据库。

CREATE DATABASE blog;

这个时候django还没有和mysql连接起来,需要安装mysqlclient或者MySQL-python,我在这里安装的是mysqlclient,在安装mysqlclient之前还需要安装libmysqlclient-dev

sudo apt-get install libmysqlclient-dev
pip install mysqlclient

这个时候就可以用django的数据迁移

python manage.py makemigrations
python manage.py migrate

这个时候进入mysql命令行,查看blog数据库中是否插入了django数据迁移来的数据库表

mysql> use blog
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------------------+
| Tables_in_blog             |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
+----------------------------+
10 rows in set (0.00 sec)

看到数据库中的表就可以指导mysql已经配置完成了。
这样SkyNet的服务器配置基本上就完成了。后面需要解决一下代码上传和nginx等优化的问题。

nginx php-fpm的php.ini设置最大上传大小不生效

问题

虽然这种问题网上已经有很多人提出过,但我还是弄不明白。服务器为ubuntu,安装了nginx。
使用phpinfo()发现使用的配置文件是/etc/php/7.0/fpm/php.ini。
设置了如下属性:

upload_max_filesize = 256M
post_max_size = 256M

重启了nginx和php7.0-fpm进程,但是最大上传大小没有改变。
我使用的是wordpress,甚至我还安装了插件来提高最大上传大小,不过仍然没有用。
我也尝试在.htaccess文件增加了如下配置,也一样没有效果:

php_value post_max_size 256M
php_value uploads_max_filesize 256M

最佳答案

nginx默认的上传大小限制为1MB。要更改这个值的话需要设置client_max_body_size变量。可以在nginx.conf http区块设置:

http {
    #...
        client_max_body_size 100m;
        client_body_timeout 120s; # Default is 60, May need to be increased for very large uploads
    #...
}

如果你想上传一个非常大的文件,并且上传时间超过了60秒,这时候也需要提高client_body_timeout变量的值。
更新nginx配置文件后,不要忘记重启nginx。
需要重启nginx和php来重载配置。可以使用如下命令完成:

sudo service nginx restart
sudo service php7.0-fpm restart

注意:如果nginx上没有配置多个站点,可以直接在server区块加上:

server {
    client_max_body_size 8M;
}

Laravel Nginx出现404 Not Found错误

问题

刚刚开始用了几天Laravel,发现URL路由有点问题,http://localhost:8017/laravel能正常打开,不过http://localhost:8017/laravel/foo返回

404 Not Found

系统为Ubuntu 16.04,Laravel 5.4
routes/web.php

Route::get('/', function () {
    return view('welcome');    
});

// oedin
Route::get('foo', function () {
    return 'Hello World';
});

nginx配置文件:

server {
    listen 8017 default_server;
    listen [::]:8017 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Note: You should disable gzip for SSL traffic.
    # See: https://bugs.debian.org/773332
    #
    # Read up on ssl_ciphers to ensure a secure configuration.
    # See: https://bugs.debian.org/765782
    #
    # Self signed certs generated by the ssl-cert package
    # Don't use them in a production server!
    #
    # include snippets/snakeoil.conf;

    #root /var/www/html;
    root /home/oedin/webdev;

    # Add index.php to the list if you are using PHP
    index index.php index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        #try_files $uri /index.php =404;
        #fastcgi_split_path_info ^(.+.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        #fastcgi_index index.php;
        #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #include fastcgi_params;

    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /.ht {
    #   deny all;
    #}
}

最佳答案

如果你想要你的应用与nginx使用,推荐新建一个nginx vhost配置文件,其中包含你的项目root目录。
不过可以直接执行php artisan serve命令来提供服务,这样不需要nginx。

部署在Nginx的wordpress全部页面都出现404错误

问题

虽然这个问题网上已经有很多人回答过了,但是还是不能解决我的问题。Nginx上的wordpress,除了首页外,其它页面全部出现404。
下面是nginx的配置:

server {
        listen 80 ;
        listen [::]:80;

        root /var/www/html/p/swear;
        index index.php index.html index.htm;

        server_name skinnybikiniswimwear.org;

        location / {
                try_files $uri /$uri/ /index.php?args =404;
        }


            location ~ .php$ {
                fastcgi_split_path_info ^(.+.php)(/.+)$;
                try_files $uri /index.php?args =404;
                fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
}

从这个配置我找不出有什么问题。
wordpress安装在/var/www/html/p/swear。
多谢.

最佳答案

尝试如下配置:

    location / {
                # This is cool because no php is touched for static content.
                # include the "?$args" part so non-default permalinks doesn't break when using query string
                try_files $uri $uri/ /index.php?$is_args$args =404;
    }


    if (!-e $request_filename) {
            rewrite ^.*$ /index.php last;
    }

许多wordpress上配置nginx不成功,大多数是重写规则不对导致的404问题。

CentOS 7系统Nginx申请免费SSL安全证书Let’s Encrypt教程

Let’s Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

Let’s Encrypt虽然还在测试当中,但是市场需求非常大,已经有非常多的朋友迫不及待地安装并用上了Let’s Encrypt。Let’s Encrypt向广大的网站提供免费SSL证书,不管是对于网站站长、互联网用户,还是对整个Web互联网,都是非常有利的,它有利于整个互联网的安全。

本篇文章就来为大家讲解一下如何获取Let’s Encrypt免费SSL证书,并附上Nginx的SSL证书配置方法。

未分类

使用 HTTPS 前的一些疑惑

现在是 2017 年,使用 HTTPS 已经不像几年前是一件昂贵的事情。当然我也是自己了解了一圈才消除了自己的疑惑,主要是:

  • 我的网站(一个简单的博客)可能没必要使用 HTTPS
  • HTTPS 会不会让网站速度变慢?
  • HTTPS 需要花钱吧?证书好像不便宜
  • 配置和维护 HTTPS 代价很高

要回答这些问题,推荐大家去看一下 Google I/O 2016 的视频(Youtube):https://www.youtube.com/watch?v=YMfW1bfyGSY

视频里把所有问题都详细一一解答,强烈推家把视频看完。

我简单总结:

  • 每个网站都应该用 HTTPS,就算是全静态站点也同样如此,运营商劫持严重干扰访问者的体验
  • 有几项技术可以提高 HTTPS 的性能,包括 Strict Transport Security,TLS False Start 和 HTTP/2 ,这些技术让 HTTPS 速度不慢,某些情况下会甚至更快
  • HTTPS 针对个人单个(或者几个)域名的使用来说,已经是免费的
  • 配置和维护 HTTPS 异常简单,Let’s Encrypt 这个项目通过自动化把事情简单化了

有哪些靠谱的免费 HTTPS 证书提供商?

选择证书提供商有3个主要考量:

  • 浏览器和操作系统支持程度
  • 证书类型
  • 维护成本

1、浏览器和操作系统支持程度

基本你能查到的热门证书提供商,支持程度都不会太差。例如 Let’s Encrypt 的支持可以访问:Which browsers and operating systems support Let’s Encrypt

可以看到,Android 2.3.6 以上,Firefox 2.0 以上,Windows Vista 以上,iOS 3.1 以上,Google Chrome全平台都是支持的。这一点就不用太担心了,看你你的网站受众情况来决定。对于我来说,我完全不在乎 Windows XP 的 IE 用户。

2、证书类型

HTTPS 证书分为3类, 1. DV 域名验证证书 2. OV 组织机构验证证书 3. EV 增强的组织机构验证证书。每类证书在审核和验证方面要求严格程度不同,浏览器会在地址栏给予不同证书不一样的展现。

一般个人使用DV证书完全够了,浏览器表现为地址栏前会有绿色的小锁。下面聊到的免费证书都是 DV 域名验证证书。

3、维护成本

我调研不多,使用过 StartSSL,现在用 Let’s Encrypt。StartSSL 的免费证书有效期是1年,1年后需要手动更换。配置过程还挺麻烦的。

更推荐 Let’s Encrypt,虽然有效期只有3个月,但可以用 certbot 自动续期,完全不受影响。而且 Let’s Encrypt 因为有了 certbot 这样的自动化工具,配置管理起来非常容易。

4、如何安装

第一种办法:通过官网申请安装:

  • Let’s Encrypt官网:

官方网站:https://letsencrypt.org/
项目主页:https://github.com/letsencrypt/letsencrypt

  • 生成 Let’s Encrypt 证书

未分类

Let’s Encrypt 证书生成不需要手动进行,官方推荐 certbot 这套自动化工具来实现。3步轻松搞定:

  • 下载安装 certbot (Let’s Encrypt项目的自动化工具)
  • 创建配置文件
  • 执行证书自动化生成命令

你可以在 certbot 网站上,选择你的 Web Server 和 操作系统,就能看到对应的安装和配置教程。

(本文主要介绍下面的安装办法)

第二种办法:手动申请安装(由于 CentOS的复杂性,我使用的这种办法)

一、 安装Let’s Encrypt免费SSL准备

安装Let’s Encrypt脚本依赖环境:(这一部分可以跳过,因为官方提供的Let’s Encrypt脚本会自动检测并安装)

# Debian

apt-get install git

# CentOS 7

yum install epel-release

cd /root/

wget https://dl.eff.org/certbot-auto --no-check-certificate

chmod +x

./certbot-auto

./certbot-auto -n

./certbot-auto -n只是用来安装依赖包的,也可以跳过直接到下面的生成证书的步骤,国内VPS或服务器上使用的话建议先修改为国内的pip源。

二、Let’s Encrypt免费证书生成

单域名生成证书:

./certbot-auto certonly --email [email protected] --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.smusic.cc

多域名单目录生成单证书:(即一个网站多个域名使用同一个证书)

./certbot-auto certonly --email [email protected] --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.vpser.net -d bbs.smusic.cc

多域名多目录生成一个证书:(即一次生成多个域名的一个证书)

./certbot-auto certonly --email [email protected] --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.smusic.cc -d www.smusic.cc -d bbs.smusic.cc -w /home/wwwroot/smusic.cc -d www.smusic.cc -d smusic.cc

提示:

IMPORTANT NOTES:

– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.vpser.net/fullchain.pem. Your cert will
expire on 2016-10-01. To obtain a new or tweaked version of this
certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
“certbot-auto renew”
– If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

就是生成 成功。

生成的证书会存在:/etc/letsencrypt/live/www.smusic.cc/ 目录下

三、证书续期

cerrbot的续期比原来的更加简单,因为证书只有90天,所以建议使用crontab进行自动续期:

crontab 里加上如下规则:0 3 */5 * * /root/certbot-auto renew –renew-hook “/etc/init.d/nginx reload” 这样每5天就会执行一次所有域名的续期操作。当然时间也可以自行进行调整,建议别太频繁,因为他们都有请求次数的限制,如果需要强制更新可以在前面命令上加上 –force-renew 参数。

具体方法参考:www.smusic.cc/2094.html

四、SSL证书注意事项:

1、因为默认LNMP的虚拟主机里是禁止 . 开头的隐藏文件及目录的,所以访问http://abc.com/.well-known/acme-challenge/**** 这个链接的话返回403错误,所以必须要将对应虚拟主机配置文件里的

location ~ /.
{
deny all;
}
这段配置删掉或注释掉或在这段配置前面加上
location ~ /.well-known {
allow all;
}

以上配置代码,然后重启nginx。

2、如果要启用http2的话,建议编辑lnmp.conf,将里面的Nginx_Modules_Options的单引号里加上 –with-openssl=/root/openssl-1.0.2h

并执行:

cd /root && wget -c https://www.openssl.org/source/openssl-1.0.2h.tar.gz && tar zxf openssl-1.0.2h.tar.gz 

然后使用升级脚本 ./upgrade.sh nginx 升级nginx至1.9.5或更高版本。

3、国内有些用户反映会卡在Installing Python packages…这个地方不动,因为pip的默认源是国外的,国内可能会有点慢,可以执行下面命令来修改pip源为国内的:

mkdir ~/.pip
cat > ~/.pip/pip.conf <<EOF
[global]
index-url = https://pypi.doubanio.com/simple/

[install]
trusted-host=pypi.doubanio.com
EOF

执行完,再重新运行certbot的命令应该正常安装python的包了。

五、Nginx虚拟主机的设置

配置文件地址: /usr/local/nginx/conf/vhost/www.smusic.cc.conf (根据自己的环境确认)

接下来进行配置Nginx虚拟主机文件,完整配置如下:

server
{
listen 443 ssl;   #lnmp1.3+版本默认支持http2,可以加上http2,lnmp1.2版本默认支持spdy,可以加上spdy
server_name www.smusic.cc;     ##这里是你的域名
index index.html index.htm index.php default.html default.htm default.php;
root /home/wwwroot/www.smusic.cc;            #网站目录
ssl_certificate /etc/letsencrypt/live/www.smusic.cc/fullchain.pem;    #前面生成的证书,改一下里面的域名就行
ssl_certificate_key /etc/letsencrypt/live/www.smusic.cc/privkey.pem;   #前面生成的密钥,改一下里面的域名就行
ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;

include wordpress.conf;  #这个是伪静态根据自己的需求改成其他或删除
#error_page 404 /404.html;
location ~ [^/].php(/|$)
{
# comment try_files $uri =404; to enable pathinfo
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;     #lnmp 1.0及之前版本替换为include fcgi.conf;
#include pathinfo.conf;
}

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*.(js|css)?$
{
expires 12h;
}

access_log off;
}

需将上述配置根据自己的实际情况修改后,添加到虚拟主机配置文件最后面。

添加完需要执行:/etc/init.d/nginx reload 重新载入配置使其生效。
重启Nginx:/etc/init.d/nginx restart

如果需要HSTS,可以加上add_header Strict-Transport-Security “max-age=63072000; includeSubdomains; preload”; 前面参数里的数值是秒。 开启后有效期内必须只能https访问,不确定的话不要开启。

LNMPA模式下只需要在Nginx上设置,只需要将php解析部分替换为 include proxy-pass-php.conf; 即可。

六、下面说一下可能会遇到的问题:

1、国内DNS服务商可能会不行,目前已知dnspod、cloudxns不行dnspod、cloudxns目前已经可以

Namecheap、Route 53的都可以。

2、Linode福利或IPv6用户福利

可能目前Linode用户应该遇到了

An unexpected error occurred:
There were too many requests of a given type :: Error creating new registration :: Too many registrations from this IP
Please see the logfiles in /var/log/letsencrypt for more details.

这个不一定是因为IP注册的次数过多,可能是因为IPv6的事,具体解决方法如下:

执行:sysctl -w net.ipv6.conf.all.disable_ipv6=1 来临时禁用IPv6
再生成证书后执行:sysctl -w net.ipv6.conf.all.disable_ipv6=0 再来解除禁用IPv6

3、如果启用了防火墙需要将443端口加入允许规则,一般iptables可以参考:https://www.vpser.net/security/linux-iptables.html

4、如果LNMP下访问http://abc.com/.well-known/acme-challenge/**** 这个链接403的话是因为默认LNMP 1.3的虚拟主机里是禁止.开头的隐藏文件及目录的。

需要将

location ~ /.
{
deny all;
}
这段配置删掉或注释掉或在这段配置前面加上

location ~ /.well-known {
allow all;
}

以上配置代码,然后重启nginx。

5、同时这里提醒一下如果设置了http 301跳到https的用户,再续期前还需要在nginx设置如下:

让启用 Nginx 启用 SSL,两种方法,单一支持HTTPS,或者同时支持 HTTP 和 HTTPS 两种协议。

备注 Nginx 默认没有安装 SSL 模块,安装时需要手动添加 –with-http_ssl_module 参数。(如果您使用LNMP安装包,可以忽视,默认已安装了)
80端口的虚拟主机上需要添加上,不加的话会无法验证的

location /.well-known/ {
add_header Content-Type 'text/plain;';
root /网站目录完整路径;
}

附完整的nginx下301 http跳到https的配置:

server
{
listen 80;
server_name www.vpser.net;
location /.well-known/ {
add_header Content-Type 'text/plain;';
root /网站目录完整路径;
}
location / {
return 301 https://www.vpser.net$request_uri;
}
}

用专业在线工具测试你的服务器 SSL 安全性

Qualys SSL Labs 提供了全面的 SSL 安全性测试,填写你的网站域名,给自己的 HTTPS 配置打个分。

如果你完全按照我上面教程配置,遵循了最佳实践,你应该和我一样得分是 A+

未分类

这意味着你启用了HTTPS,现在足够的安全,并且使用了最新技术,保证了性能。

解决nginx 502 php-cgi.sock failed (13: Permission denied)问题

报错信息是

connect() to unix:/tmp/php-cgi.sock failed (13: Permission denied) while connecting to upstream

此时需要检查一下 /tmp/php-cgi.sock 的运行权限

如果php的运行权限是www,而php-cgi.sock的权限是root,则会出错

此时需要修改 php-fpm.conf (如果没有,增加此配置即可)

listen.owner = www
listen.group = www

意思是和php的运行权限保持一致,如果你的php运行权限不是www,则此处对应修改即可。

如何隐藏Nginx版本号和Server响应头

隐藏 Nginx 版本号

其实隐藏 Nginx 版本号无非就是为了防止“漏洞”被人利用而已,这点 Nginx 其实很早就考虑到了,在 Nginx 的配置文件里只要加上server_tokens off就可以在网页head里隐藏掉 Nginx 的版本号了。

具体操作如下:

第一步:

vim /usr/local/nginx/conf/nginx.conf

在http{}中加入

server_tokens off;

第二歩:

vi /usr/local/nginx/conf/fastcgi_params

将里面的

fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

修改为:

fastcgi_param SERVER_SOFTWARE nginx;

隐藏 Web 服务器名称

关于如何隐藏Web 服务器名称,目前看除了在编译 Web 服务器名称的时候进行伪装以外没有很好的办法了。下面以 Nginx 为例:

伪装Nginx的具体办法

vi /src/core/nginx.h

修改其中:

#define NGINX_VERSION “1.0″

#define NGINX_VER “GWS/” NGINX_VERSION

重新编译nginx即可。

注:程序重新编译完后,要reload不会生效,需要用kill命令杀死原来的进程,再重新启动 Nginx 。

其实还有一个最简单的隐藏 Web 服务器名称的方法,那就启用 CDN 服务,当客户端访问的是 CDN 节点的时候,看到的当然也就是 CDN 节点的 Web 服务器名称了,至于自己网站的 Web 服务器名称只要没有“真实IP”几乎是不可能获得了,国内很多的免费 CDN 都可以的,这里明月就自己的经验推荐百度云加速、360网站卫士这两个免费的 CDN 。