Swoft| Swoft官网全站 HTTP2 实践

date: 2018-3-8 13:50:03
title: Swoft| Swoft官网全站 HTTP2 实践

Swoft1.0正式来袭, Swoft 也迎来自己的一个里程碑, star数正式突破 1k. Swoft官网作为项目组服务开发者们的重要渠道, 也迎来了自己的一次重大更新:

  • 重构, 升级到 Swoft1.0
  • 全站实现HTTP2

本篇先介绍 Swoft官网全站 HTTP2 实践

先来一张 Swoft 官网 效果图镇楼:

swoft 官网: 全站 HTTP2
  • 静态资源由 nginx 托管, 开启 http2
  • 业务代码交由 Swoft 执行, 设置 \Swoole\HttpServer 使用 HTTP2 协议

要实现 HTTP2 非常简单:

  • nginx 开启 HTTP2
  • Swoft 开启 HTTP2
  • nginx + Swoft 配合使用
  • 福利: 域名证书申请 轻松指南

nginx 开启 HTTP2

首先查看 nginx 中是否开启了 HTTP2 module(模块)

# -V: show version and configure options then exit
/var/www # nginx -V

# 新版 nginx 默认开启了 HTTP2: --with-http_v2_module
nginx version: nginx/1.13.8
built by gcc 6.2.1 20160822 (Alpine 6.2.1)
built with OpenSSL 1.0.2n  7 Dec 2017
TLS SNI support enabled
configure arguments: --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 --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-http_slice_module --with-mail --with-mail_ssl_module --with-compat --with-file-aio 
--with-http_v2_module

nginx 开启 HTTP2 配置示例, 可以在我的开源项目-docker中查看到示例:

# http2
server {
    listen 80;
    server_name www.daydaygo.top;
    # 将 HTTP 请求强制跳转到 HTTPS
    rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
    # 开启 HTTP2
    listen 443 ssl http2 default_server;
    server_name www.daydaygo.top;

    # 证书极简设置
    ssl on;
    ssl_certificate daydaygo.top.crt;
    ssl_certificate_key daydaygo.top.key;

    root /var/www/https_test;
    index index.php index.html;
    location / {}
    location ~ \.php$ {
        fastcgi_pass fpm:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Swoft 开启 HTTP2

Swoole 开启 HTTP2, 可以参考 Swoft 提供的 Dockerfile

# Debian系Linux
apt-get install -y libssl-dev libnghttp2-dev

# Swoole 添加编译参数
./configure --enable-async-redis --enable-mysqlnd --enable-coroutine --enable-openssl --enable-http2

Swoft 配置中开启 HTTP2, 参考 .env.example 文件

# 默认配置
OPEN_HTTP2_PROTOCOL=false
SSL_CERT_FILE=/path/to/ssl_cert_file
SSL_KEY_FILE=/path/to/ssl_key_file

# 开启 HTTP2: 这里是将证书放到项目 resource/ 目录下
OPEN_HTTP2_PROTOCOL=true
SSL_CERT_FILE=@res/ssl/ssl_cert_file
SSL_KEY_FILE=@res/ssl/ssl_key_file

nginx 配合 Swoft 使用

nginx 配合 Swoft 使用, 类似 nginx+fpm 配置即可, 代码示例可以参考 我的开源项目-docker

# swoft-site
server {
  listen 80;
  server_name swoft.daydaygo.top;
  # 将 HTTP 请求强制跳转到 HTTPS
  rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
  # 开启 HTTP2
  listen 443 ssl http2;
  server_name swoft.daydaygo.top;

  # 证书极简配置
  ssl on;
  ssl_certificate 1_swoft.daydaygo.top_bundle.crt;
  ssl_certificate_key 2_swoft.daydaygo.top.key;

  root /var/www/swoole/swoft-offcial-site/public;
  index index.php index.html;
  error_log /var/log/nginx/swoft-site.error.log;
  access_log /var/log/nginx/swoft-site.access.log;

  # nginx 转发请求给 swoft
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Connection "keep-alive";
    proxy_pass https://swoft:9501;
  }
  location ~ \.php(.*)$ {
    proxy_pass https://swoft:9501;
  }

  # nginx 托管静态文件
  location ~* \.(js|map|css|png|jpg|jpeg|gif|ico|ttf|woff2|woff)$ {
    expires       max;
  }
}

福利: 域名证书申请 轻松指南

先确认你知道关于域名的几个基础知识:

  • 为什么用域名?
  • 什么是子域名?
  • 为什么域名要备案?
  • 什么是域名证书?

如果这些都不熟悉, 建议申请一个域名体验一下.

域名证书分为 2 种: 单域名证书 泛域名证书, 区别来自于 什么是子域名. 比如我拥有域名 .daydaygo.top, 那么我可以设置任意子域名, 比如 www.daydaygo.top, test.www.daydaygo.top. 如果是单域名证书, 那么我每一个子域名都需要一个证书, 泛域名证书则可以对我所有的子域名生效.

域名证书由相关机构发放, 一般需要花钱购买. 既然是 福利, 这里介绍 2 个免费好用的途径:

  • 动动鼠标, 证书到手, 腾讯云-申请免费单域名证书
  • 终于等到免费泛域名证书, Let's Encrypt 泛域名证书

单域名证书实践

腾讯云-申请免费单域名证书: https://console.qcloud.com/ssl

全程只需要动动鼠标即可:

  • 到腾讯云官网申请


    腾讯云 - 单域名证书申请
  • 配置域名解析验证域名所有权


    配置域名解析

然后下载证书, 配置到 nginx 中即可. 详细教程请参考腾讯云官方文档.

不过要注意:

  • 证书有效期 1 年
  • 同一域名最多只能申请 20 个证书

通配符域名证书实践

Let's Encrypt 终于支持通配符证书了: https://www.jianshu.com/p/c5c9d071e395

Let's Encrypt 在免费域名证书领域算是 家喻户晓, 现在终于支持 通配符证书 了. 不过按照上面 blog 的教程, 很是一番折腾. 虽然一波三折, 但是得益于自己使用 docker 作为开发环境, 在尝试各种解决方案时, 都没有太大阻碍.

这里记录下来最终成功使用的一种方式:

# 安装 certbot
yum install certbot-nginx

# 稍微修改教程中的命令
certbot certonly -d *.daydaygo.top --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

之后一路确认, 最后添加 配置域名解析验证域名所有权, 大功告成!

[root@e6be50c34c81 www]# ll /etc/letsencrypt/live/daydaygo.top/
total 4
-rw-r--r-- 1 root root 543 Mar 16 16:48 README
lrwxrwxrwx 1 root root  36 Mar 16 16:48 cert.pem -> ../../archive/daydaygo.top/cert1.pem
lrwxrwxrwx 1 root root  37 Mar 16 16:48 chain.pem -> ../../archive/daydaygo.top/chain1.pem
lrwxrwxrwx 1 root root  41 Mar 16 16:48 fullchain.pem -> ../../archive/daydaygo.top/fullchain1.pem
lrwxrwxrwx 1 root root  39 Mar 16 16:48 privkey.pem -> ../../archive/daydaygo.top/privkey1.pem

查看 README, 所得证书与 nginx 配置对应关系如下:

ssl_certificate  -> fullchain1.pem
ssl_certificate_key -> privkey1.pem

certbot 还可以配置 crontab 来 自动更新证书, 按照 官方教程 配置即可

折腾的过程颇为一波三折, 简单记录一下, 希望能给大家帮助:

  • 我本人喜欢使用 alpine linux, 所以直接使用自己的 docker 开发环境 - alpine 安装 certbot: apk add certbot, 然而执行后报错不支持泛域名
  • 百度之, 出现的第一篇文章是 Let's Encrypt 官方新闻, 发现里面的 url 和教程的 url 不同, 没细看下 以为是 url 错误, 其实看到的这篇新闻比较早, url 是预发布时的 url
  • 继续看 Let's Encrypt 官方新闻, 评论中看到正式 url 放出的新闻, 这就是上面教程中提到的链接, 从而知道使用的 certbot 版本不对: Certbot (Certbot >= 0.22.0)
  • 另一条错误的尝试是使用 certbot-auto, 根据报错发现运行需要依赖 python + gugeas, 于是又尝试使用自己的 docker 开发环境 - python 来尝试, 但 pip install python-gugeas 时一直报错, 解决软件依赖无果

写在最后

对技术保持好奇并勇于尝试新技术, 实在是一件颇为有趣的事.

荐书: 图灵社区 - HTTP/2基础教程

不要因为环境, 限制了你的能力, 投入 docker 的怀抱吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容