经过一些研究,我找不到答案:如何将Apache/httpd更新到最新版本以在我的 VPS 上使用 HTTP/2 协议。我正在使用 PHP7 和基于 Apache - CentOS 7 的服务器。
CentOS 默认存储库上没有软件包更新。
[root@vps270238 ~]# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built: Nov 19 2015 21:43:13
Run Code Online (Sandbox Code Playgroud)
我真的想保留我的实际设置和虚拟主机。
我正在尝试在新的 Ubuntu 18.04 vps 上的 nginx 中设置 http2 模块。Http2 在 Firefox 中工作正常(我检查了响应头)。一些第三方网站表明我的http2配置没问题:
但是,当我尝试在 Chrome 上打开该网站时,它甚至无法打开(无法访问此站点),尽管在访问日志 ( /var/log/nginx/access.log ) 中我收到了“HTTP/ 2.0" 来自 nginx 的 200 响应,表明 nginx 的行为好像一切正常。
从卷曲,我有这个答案:
$ curl -I https://example.com/
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
Date: Sun, 19 May 2019 13:20:33 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options:: nosniff
X-XSS-Protection: 1;mode=block
Strict-Transport-Security: max-age=15768000
Run Code Online (Sandbox Code Playgroud)
所以,不是 http2,但至少我可以使用 curl 回退到 http1.1
因此,显然 http2 有效,但在 Chrome(空白页面)中无效,我不知道问题出在哪里。
如果忘了说,当我用 Chrome 浏览页面时,我在错误日志中没有收到任何错误(/var/log/nginx/error.log),但是,不时会出现与 ssl 相关的错误(这是一个示例): …
我按照Digital Ocean 论文设置了我的 Nginx conf ,现在 http2 可用...
但是在 Chrome(版本 54.0.2840.98(64 位))开发工具中,它总是在 HTTP 1/1 上:
NAME METHOD STATUS PROTOCOL
shell.js?v=xx.. GET 200 http/1.1
Run Code Online (Sandbox Code Playgroud)
我的服务器运行的是支持 ALPN 和 NPN 的 Ubuntu 16.04 LTS,它附带的 openssl 版本是 1.0.2g
我使用此工具站点检查了 http2 支持,结果是:
Yeah! example.com supports HTTP/2.0. ALPN supported...
Run Code Online (Sandbox Code Playgroud)
也检查 curl 是可以的
$ curl -I --http2 https://www.example.com
HTTP/2 200
server: nginx/1.10.0 (Ubuntu)
date: Tue, 13 Dec 2016 15:59:13 GMT
content-type: text/html; charset=utf-8
content-length: 5603
x-powered-by: Express
cache-control: public, max-age=0
etag: W/"15e3-EUyjnNnyevoQO+tRlVVZxg"
vary: …Run Code Online (Sandbox Code Playgroud) 我试图启用我正在运行的http2模块,但它似乎不起作用。Apache/2.4.29Ubuntu 16.04
我是这样的:
sudo a2enmod http2
Run Code Online (Sandbox Code Playgroud)
然后通过添加单独激活:
Protocols h2 http/1.1
Run Code Online (Sandbox Code Playgroud)
我也在运行mpm_prefork模块,这是否会导致问题http2,如果是,有什么替代方法可以运行mpm_prefork?
我正在运行共享服务器的另一件事,它只允许运行 PHP。我正在检查 suPHP,但它在他们的网站上说:
suPHP 不再维护,不会收到任何进一步的更新,甚至安全补丁。
我花了将近一天的时间尝试为我的公司和社会使用 ALPN 和 http2 支持 EL6 和 EL7 的 Apache httpd 构建,就像我之前为 NGINX 所做的那样(针对 OpenSSL 1.0.2h 静态构建)。
首先,我尝试使用从 Fedora 获取的 OpenSSL 1.0.2h 重建 src rpms 并安装结果 rpms (openssl-devel-1.0.2h-1.el7.centos.x86_64.rpm, openssl-1.0.2h-1.el7.centos .x86_64.rpm) 来替换系统的。是的,我知道,这对于公共构建来说不是正确的方式,但我需要知道是否会起作用。
然后我重建了 nghttp2-1.7.1-1.fc24.src.rpm 并安装了结果 libnghttp2-devel-1.7.1-1.el7.centos.x86_64.rpm 和 libnghttp2-1.7.1-1.el7.centos .x86_64.rpm。
最后,在删除了一些补丁并破解了 apr 和 apr-util 之后,我成功地将 httpd-2.4.18-1.fc23.src.rpm 构建到了 httpd-2.4.18-1.el7.centos.x86_64.rpm。
普通的 HTTP/1.1 对我有用,而且还支持 ALPN,但 HTTP/2 不起作用:
$ curl -v --insecure --http2 --tlsv1.2 https://192.168.1.148
* Rebuilt URL to: https://192.168.1.148/
* Trying 192.168.1.148...
* Connected to 192.168.1.148 (192.168.1.148) port 443 (#0)
* Initializing NSS …Run Code Online (Sandbox Code Playgroud) 是否可以mod_proxy在带有 http2 协议的 Apache Tomcat 8.5 前面使用?如果是,很高兴看到示例配置。
编辑
具体做法是:是否可能,建议使用http2的客户端和服务器之间(Apache httpd),并继续与数据流ajp之间Apache httpd和Apache Tomcat?
编辑 2
此答案提供了有关该主题的一些详细信息:
我正在尝试更新我的 apache2(Apache/2.4.29 (Debian 8))服务器以支持,http2
但在使用以下代码启用 http2 后,由于mpm_prefork不支持而无法正常工作http2
<IfModule http2_module>
ProtocolsHonorOrder On
Protocols h2 h2c http/1.1
</IfModule>
Run Code Online (Sandbox Code Playgroud)
由于mpm_preforkapache (2.4.29) 不适用于http2,我尝试使用 mpm_event/mpm_worker
但它不起作用,所以我启用mpm_prefork
sudo a2dismod mpm_event
sudo a2dismod mpm_worker
sudo a2enmod mpm_prefork
Run Code Online (Sandbox Code Playgroud)
由于我仍在运行,php5
我应该怎么做才能在 Debian8 上获得 http2 支持?我是否必须将 php5 更新为 php7?是否有任何解决方法可以将 mpm_worker/mpm_event 与具有 http2 支持的 php5 一起使用?
阿帕奇错误日志
[http2:warn] [pid 11992] AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed …Run Code Online (Sandbox Code Playgroud) 在带有 HHVM(HipHop VM 3.14.1)和 Nginx(nginx/1.10.1)的 Ubuntu 14.04.4 LTS 上
我尝试在我的虚拟主机中启用如下所示的 HTTP/2
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /var/www/mydomain;
index index.html index.htm index.php;
server_name mydomain.com;
ssl_certificate /etc/nginx/ssl/www_mydomain_com.pem;
ssl_certificate_key /etc/nginx/ssl/server.key;
access_log /var/log/nginx/localhost.laravel-access.log;
error_log /var/log/nginx/locahost.laravel-error.log error;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; }
error_page 404 /index.php;
include hhvm.conf; # The HHVM Magic Here
# Deny …Run Code Online (Sandbox Code Playgroud) 对于 HTTP/0.9:
GET /
Run Code Online (Sandbox Code Playgroud)
对于 HTTP/1.0:
GET / HTTP/1.0
Run Code Online (Sandbox Code Playgroud)
对于 HTTP/1.1:
GET / HTTP/1.1
Host: example.com
Run Code Online (Sandbox Code Playgroud)
HTTP/2 的请求行是什么?是不是像这样:
GET / HTTP/2.0
Run Code Online (Sandbox Code Playgroud)
还是 HTTP/2?