(转载)nginx 反向代理,Safari 无法访问网站的解决办法

今天在设置 nginx + apache2 时遇到 Safari 无法访问网站的问题,搜索到此解决方法,作者解释的非常详细,转载记录一下。

原文地址:http://www.ptbird.cn/nginx-apache-safari.html

原文标题:nginx 反向代理,safari 无法访问网站(HTTP/2.0 请求超时)的解决办法。

略微修改了部分格式。


昨天半夜 IOS 端开发者发现请求 API 无法拿到 response,一直是 timeout 。

排除了网络的原因,排除了客户端的原因,因为客户端请求其他的 API 都是成功的。


一、问题

iOS 开发使用 NSURLconnection 发送 HTTP POST 请求的时候,一直 timeout 。

继而发现 Safari 无法访问网站,但是 Chrome 和其他的浏览器都没有任何问题。

提前说一下,这个问题出现在 ngixn-1.9.0+/apache2.4 的反向代理上

我的服务器是 LANMP 组合的,其中 nginx 版本是 1.12.0,而 apache 的版本是 2.4


二、排查过程

1. 检查服务器通讯和网络原因

首先发现 iOS 端能够 ping 通服务器,但是新问题出现了 Safari 无法访问网站,同样的网站 Chrome 中能够访问。

2. 客户端排查

iOS 客户端开发者请求同样的 https API ,发现能够拿到 response,只有我的网站不行。

3. 网站系统排查

试了好几个 API 测试平台以及各种浏览器,发现都没有问题,最后发现:

苹果原生的应用 如 Safari,无论是 iOS 的 Safari 还是 macOS 的 Safari 都无法访问网站。

4. 排查 SSL 问题

因为我用的是 Let’s Encrypt 的 SSL 证书,因此测试了我其他使用 SSL 证书网站能否在 Safari 中打开, 发现都没问题。

5. 进一步排查网站系统

在排查过程中,发现当访问纯静态页面,如 https://www.demo.com/index2.html  的时候,没有任何问题,能够正常访问。

但是如果访问动态页面,如 https://www.demo.com/index2.php 的时候,都是错误的,也就是说 phpinfo() 都无法访问。

因此感觉问题可能出现在 nginx 或者是 apache 上。

6. 各种查资料

为此我在 segmentfault.com 上提问的问题也编辑了很多次,问清了 IOS 开发方面的一些概念后,最后确定了问题出现服务器方面。

所以在 stackoverflow 上各种关键字查,主要查的是

  • nginx
  • safari can not open website

在一个提问中发现,HTTP2 可能存在问题,因此我看了一下我的网站的 log,nginx.log 和 apache.log 我都配置了。

不看不知道,吓一跳:

demo.com_apache.log 中都是正常的 200 请求

demo.com_nginx.log 中也都正常,但是需要注意的是请求都是 HTTP/2.0 请求
访问一次网站,会出现好几十甚至一百次链接请求(这个我把日志清空后,访问一次,nginx 访问日志就出现了 N 多条),请求都是 200 的。

7. 确定了问题最终出现在 nginx 上面,而且是反向代理的问题。


三、解决

前后折腾了将近一天,最后在 stackoverflow 上找到了同样的问题,问题说:

Safari 因为使用 HTTP/2.0 请求而拿不到 response

问题地址: https://stackoverflow.com/questions/37762163/safari-fails-to-give-response-when-using-http-2

其中提到了我在别的问题中也看到的一个内容,已经有人在 nginx 中讨论过这个问题:

【”Upgrade” header should not be proxied over h2】

讨论地址:https://trac.nginx.org/nginx/ticket/915
隐藏 Nginx 的 Upgrade header

具体为什么,可以去 nginx 上的讨论看看,很详细。

操作:

修改 nginx proxy 配置中 proxy_hide_header 成 Upgrade

1
proxy_hide_header Upgrade

诺基亚 8110 4G 一周使用总结

首先纠正《诺基亚 8110 4G 开箱》中的一个错误:

不过进入界面后发现手机似乎并没有网络对时功能,时间为手机主板的初始时间。

8110 4G 是包含网络对时功能的,在菜单里面可以看到。

使用了 8110 4G 一周多的时间,可以感受到的除了怀旧外,更多的感受是 KaiOS 在中文化方面仍有一定的缺陷。最大的问题在于输入法,8110 4G 自带的拼音输入法已经回退到黑白机年代的水平,完全无法与当年 S60 甚至 S40 手机的输入法相提并论。没有词组输入,必须按完按键,然后选择拼音才能够进行选字。如此不智能的输入法,真的是回复一条短信都是一种磨难了。

键盘上印刷的中文快捷键与当年 S60 、 S40 手机一致,但使用上却并非如此,有一种硬件与软件相割裂的感觉。此外,上方的功能键也是与 KaiOS 的操作有些不太匹配的地方,这说明诺基亚对于 KaiOS 的调教还远远不足。

以上两点希望诺基亚在日后的系统升级中能够改进。

而手机待机并没有带来很大的惊喜,在中国联通 4G 网络、开启 Wi-Fi 的情况下,待机时间也就是 1 周左右。一周的时间虽然看上去不错,但如此强度的使用,即便是 iPhone 和 Android 手机,也是能够达到 1 周的待机的,对于一个这样功能的手机,在待机上只能说中规中矩,完全没有惊喜。

对于这部手机来说,最大的优势还是小巧和轻便,但在其他方面,还是有很大改进空间。但对于厂家来说,这部手机毕竟还是一部低端手机,估计并没有投入多少研发的精力,未来能够怎样,非常难说了。

Debian 9 (Stretch) Apache 开启 HTTP/2

目前 Debian 9.5 默认的 Apache 版本已为 2.4.25,已直接支持 HTTP/2,开启 Apache 对 HTTP/2 的支持非常简单,步骤如下:

  1. 开启 HTTP/2 模块 1
    $sudo a2enmod http2
  2. 修改站点配置文件,增加 1
    Protocols h2 http/1.1
  3. 重启 apache1
    $sudo systemctl restart apache2

因 Debian 9 的 PHP 版本为 7.0,如开启 PHP,所 PHP 7.0 所需的 mpm_prefork 模块不支持 mod_http2,从而导致 Apache 的 HTTP/2 功能失效。如需开启 HTTP/2,可以等待 2019 年 Debian 10 发布后更新至更新版本的 PHP 或使用 nginx 来实现 HTTP/2 的支持。

–EOF–

诺基亚 8110 4G 开箱

在学生时代,作为一个索爱党,诺基亚的手机实在是用的不多,要说情怀也真没多少,不过出了诺基亚 8110 复刻版后,还是种草了,于是入了一台。

这种低端手机,京东竟然也要预约抢购,给跪了,黄色版无货,只好买了黑色版,不过也好,用起来显得不那么扎眼。

京东送货依旧相当的快,上午订购,下午送到。

与在京东销售的其他手机一样,手机包装外面有一层印有京东 Logo 的塑封,不过这封的有够粗糙……

包装1

打开塑封后,里面没有另外的塑封,包装盒子只是两头用塑料胶条封住而已,国行盒子上的像素画与外国版本相比,少了各类网站的 Logo,原因你懂的……

包装2

盒子背面是技术指标等信息,产地竟然不是中国……

包装背部

黑色的手机本体没有什么很大的亮点,滑盖的阻尼虽然不大,但也没有丝般顺滑的感觉,屏幕为塑料材质,很容易沾上手上的油污,不容易擦干净。机身滑盖之外只有一个右侧电源键,左边没有调整音量的按钮,这一点有些别扭。

手机机身

拿出手机后,在纸盒中还有说明书、保修卡、电池、耳机和充电器等内容。虽然手机机身是越南产,但充电头和电池依旧是 Made in China 。

配件

打开背壳,安装 SIM 卡,此处一定要好好看看手机的标示,SIM1 卡槽是放 Micro SIM 卡的不能插入 Nano SIM 卡,但 Nano SIM 卡的大小横过来也能放入卡槽,不过一旦推入的话,就只能用针才能把卡挑出来了。同时,SIM1 卡槽上方还可以添加 MicroSD 卡对手机扩容。

错误装卡

现在比较常见的 Nano SIM 卡只能放入 SIM2 卡槽:

正确装卡

装上电池,扣回背壳,开机。

首先看到的是 Powered by KaiOS,然后才是诺基亚的 Logo,随后就进入了初始设置界面。

开机1
开机2
开机3

与之前看到的新闻稿不同,国行预装的依旧是 KaiOS 而非 YunOS 。经过几步简单的设置后,便可进入手机主界面。

初始设置
主界面

不过进入界面后发现手机似乎并没有网络对时功能,时间为手机主板的初始时间。

初始手机菜单三屏,包含了电话、信息、通讯录等基础功能,同时也包含相机、相册、音乐、视频、计算器等等功能机常见的应用,当然作为 KaiOS,毕竟是智能系统,也带有应用商店、浏览器、电子邮箱等应用。另外,手机通讯录等也可以与 Gmail 和 Outlook 同步、甚至有类似 iPhone Find My Phone 的在线防盗功能,也体现了智能机的特质。

菜单

进入设置界面,整个界面的内容与 Android 手机非常相似,不过为了键盘操作,将功能做了分类,另外 VoLTE 还单独设置了菜单。

设置界面

虽然与 Android 相似,但 KaiOS 的应用商店,目前来看是相当凄惨的,只有屈指可数的几款游戏和一个天气应用,比较有意思的是,第一次进入应用商店时能看到 Twitter,但再次进入后,整个社交分类消失了,只剩下工具和游戏。

应用商店

不过从 Twitter 这一点也看到这部手机本地化的不足,在设置中的搜索界面又看到的类似的问题,可以设置的搜索引擎默认为 Google,其他的也是 Yahoo 、 Bing 和 DuckDuckGo,没有任何一个国内的搜索引擎。而注册 KaiOS 账号等,收到的激活邮件也是英文版。应用商店中也没有任何一款国产应用。

搜索设置
激活邮件

不过较为惊喜的是,此款手机的通话十分清晰。另外,包括通过应用商店下载的应用在内,各应用启动速度较快,如果将来诸如微信、支付宝、微博等应用如果能够入住 KaiOS 的话,此款手机还是有些玩头的。

不过就目前来讲,基本上只有通话和短信能用的上,虽然作为一个备机是合格的,但 499 的价格确实有点偏高了。

Hexo AirCloud 主题安装笔记

下载 Air Cloud 主题

直接通过 Github 下载 zip 文件,放入 Hexo 的 themes 文件夹下:
https://github.com/aircloud/hexo-theme-aircloud

修改 Hexo 的 _config.yml 文件:

1
theme: aircloud

注释掉 title,增加 SEOTitle: [网站标题]

AirCloud 主题功能配置

为了增加搜索功能,需安装插件:

1
$npm i hexo-generator-search –save

编辑 Hexo 的 _config.yml 文件,增加:

1
2
3
search:
path: search.json
field: post

主题相关页面配置

标签页面

在 Hexo 的 source 文件夹下建立 tags 文件夹,并在 tags 文件夹下新建 index.md 文件,文件内容如下:

1
2
3
4

layout: “tags”
title: “Tags”

关于页面

在 Hexo 的 source 文件夹下建立 about 文件夹,并在 about 文件夹下新建 index.md 文件,文件头需包含以下内容:

1
2
3
4
5
6

layout: “about”
title: “About”
date: 2016-04-21 04:48:33
comments: true

头像设置

在 Hexo 的 source 文件夹下建立 img 文件夹,并将头像文件命名为 avatar.jpg

编辑 Hexo 的 _config.yml 文件,增加:

1
sidebar-avatar: img/avatar.jpg

社交网络链接

可以在 Hexo 的 _config.yml 文件中增加社交网络的账户信息,在页面下方生成链接:

1
2
weibo_username: 用户名
zhihu_username: 用户名

主题可设置的社交网络可详见 aircloud 主题官方实例:
https://github.com/aircloud/hexo-aircloud-blog

高 DPI 下 Java 软件放大显示

工作上用的一个软件是基于 JRE6 开发的,在传统分辨率的屏幕下工作正常,不过在现代的高 DPI 笔记本上,用起来简直就是噩梦,软件窗口小到眼瞎,不过好在在 javaw 后面加上下面这一条后缀就可以在高 DPI 下显示合适大小的界面了:

1
-Dsun.java2d.dpiaware=false

macOS 安装 Hexo 笔记

注:macOS 10.13.6 已安装 Xcode 、 brew 、 Git 等

安装 nvm 及 nodejs

在终端中通过如下命令安装 nvm:

$curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash

修改.bash_profile 文件,添加国内镜像:

export NVM_NODEJS_ORG_MIRROR=http://npm.taobao.org/mirrors/node

安装稳定版 node.js:

$nvm install stable

设置 npm 国内镜像:

npm config set registry='http://registry.npm.taobao.org'

安装 Hexo

$npm install -g hexo-cli

Hexo 初始化

$hexo init bubuyu
$cd bubuyu
$npm install

完成

鲁公网安备 37010202001399号 鲁ICP备18034499号-1