Swoft| Swoft官網全站 HTTP2 實踐

date: 2018-3-8 13:50:03
title: Swoft| Swoft官網全站 HTTP2 實踐php

Swoft1.0正式來襲, Swoft 也迎來本身的一個里程碑, star數正式突破 1k. Swoft官網做爲項目組服務開發者們的重要渠道, 也迎來了本身的一次重大更新:css

  • 重構, 升級到 Swoft1.0
  • 全站實現HTTP2

本篇先介紹 Swoft官網全站 HTTP2 實踐html

先來一張 Swoft 官網 效果圖鎮樓:python

swoft 官網: 全站 HTTP2

  • 靜態資源由 nginx 託管, 開啓 http2
  • 業務代碼交由 Swoft 執行, 設置 SwooleHttpServer 使用 HTTP2 協議

要實現 HTTP2 很是簡單:mysql

  • nginx 開啓 HTTP2
  • Swoft 開啓 HTTP2
  • nginx + Swoft 配合使用
  • 福利: 域名證書申請 輕鬆指南

nginx 開啓 HTTP2

首先查看 nginx 中是否開啓了 HTTP2 module(模塊)linux

# -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中查看到示例:nginx

# 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 提供的 Dockerfilegit

# 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 文件github

# 默認配置
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 配置便可, 代碼示例能夠參考 個人開源項目-dockerredis

# 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/c5c...

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 的懷抱吧

相關文章
相關標籤/搜索