如果环境里已经有编译好的tengine/nginx了, 注意备份,尤其是conf文件
安装过程
首先在shell里用apt工具安装一下依赖包, openssl或者手动编译libressl来替代openssl
apt-get install openssl wget make gcc libpcre3-dev zlib1g-dev
在官网上下载tengine的安装包, 最新的安装包在github和官网都有下载
wget http://tengine.taobao.org/download/tengine-2.4.1.tar.gz
下载了之后解包
tar zxvf tengine-2.4.1.tar.gz
进入tengine目录
cd tengine-2.4.1
这里需要修改一下tengine自动安装脚本里的依赖库路径, 否则极有可能报错
修改哪个文件呢? 注意此时你应该在tengine-2.3.3的安装包路径下
vim auto/lib/openssl/conf
打开之后找到
CORE_INCS="$CORE_INCS $OPENSSL/.openssl/include" CORE_DEPS="$CORE_DEPS $OPENSSL/.openssl/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/.openssl/lib/libcrypto.a"
把中间的.openssl全干了, 变成:
CORE_INCS="$CORE_INCS $OPENSSL/include" CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/libcrypto.a"
OK...
开始配置, 这里笔者发现--with-http_concat_module在debian下报错的, 所以先把这段指令给抹掉了, 也没有安装jemalloc, 所以命令长这样:
./configure --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_v2_module \ --with-http_secure_link_module \ --with-openssl=/usr/local/openssl
最后一行需要注意, 有的时候debian通过apt-get工具自动安装的openssl会到/usr/include/openssl路径下, 也许上面的命令根本就没办法make, 提示各种找不到文件, 那么你需要重新编辑auto/lib/openssl/conf文件一个一个指定位置, 同时在configure的--with-openssl=后面的参数中填入正确的路径变量, 例如, 笔者在某台服务器上的配置文件是这样的:
CORE_INCS="$CORE_INCS $OPENSSL/include" CORE_DEPS="$CORE_DEPS $OPENSSL/include/openssl/ssl.h" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/x86_64-linux-gnu/libssl.a" CORE_LIBS="$CORE_LIBS $OPENSSL/lib/x86_64-linux-gnu/libcrypto.a"
而配置的时候命令长成这样:
./configure --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_v2_module \ --with-http_secure_link_module \ --with-openssl=/usr
如果你实在搞不清楚openssl到底安装到哪里了, 运行
whereis openssl
再插播一段话: 如果你之前安装过nginx到/usr/local/nginx目录下, 最好备份一手, 重命个名之类的。不过你不备份也没关系,反正配置文件丢不了。
之后make一手
make && make install
完结, 撒花?并没有,接下来你需要配置一手http2。网上一大堆配置方案,这里只说最简单的。http2需要你网站有SSL证书, 别听外头忽悠, 买什么收费证书, 免费的证书他不香吗? 绑定完了免费SSL证书之后, 要在监听端口后边追加一个http2尾缀, 就像这样:
server { listen 80; listen 443 ssl http2; # 就看这一行 server_name wwooo.com www.wwooo.com;
然后保存配置, 重读一遍nginx。完结撒花。
释放不必要的编译工具
如果你经常需要升级和编译, 请忽略此段。如果你不想让编译工具包和文档占据太大的空间,可以清理掉, 命令为
apt autoremove gcc make wget libpcre3-dev openssl zlib1g-dev
附一篇文章, 手动编译openssl
https://www.wkwkk.com/articles/ba416b8616aebff6.html
开启http2之后报错net::ERR_HTTP2_PROTOCOL_ERROR
通过报错日志是很难看到问题的关键的。首先请把配置指向到一个默认的后端程序, 或者把网站指向一个纯粹的静态文件, 如index.html
如果正常了, 证明不是nginx配置的问题, 就得检查后端程序了。
一些程序员会到处爬博客,copy网上的header配置, 为header手动赋值, 搞出一些不标准的。首先返回到http1.1的模式下, 让网站正常运行, 通过网站的response header观察都加入了哪些头部参数。挨个在后端程序里面找对应的值,是不是和网上的标准定义有差别,看看多写了还是少写了。浏览器在http2.0版本对response header的要求非常严格, http1.1能忍的, http2忍不了。实在嫌麻烦就先把后端手工定义的header删掉, 再启动http2看看是不是header手工定义的问题。
查出来之后优化掉对应的后端程序段。