Tengine 2.2.2 配置 http2 协议出现的坑
昨天本站将
nginx
配置改为支持http2
协议,发帖,浏览帖子都很正常,但上传图片出现504
,改回http 1.1
恢复正常,于是确定是配置http2
造成的恶果,于是 google 搜索 "tengine http2 504" 等关键字,最终发现了阿里官方 issue:https://github.com/alibaba/tengine/issues/1003
此 issue 作者遇到同样的情况:
从 nginx 1.10.1 升级为
tengin 2.1.2
后, 用户通过multipart/form-data
上传文件时 如果文件大于1M
就会上传失败 抓包分析后,发现在用户在上传大文件时,http body 内容不完整 导致java MultipartHttpServletRequest request
拿到的request.getFileNames()
size 为0
抓取了 tengin 与 tomcat 之间的报文,异常报文中 http body 内容异常
看这个 issue,确定是 2.2.2 的一个 BUG,接着回退到 2.2.1,问题依旧,回退到 2.2.0,问题得到解决。
在此提醒大家,如果使用 Tengine 需要配置
http2
,建议不要使用 2.2.1 和 2.2.2 版本。Golang 中 Goroutine 的调度器模型
Goroutine 可以说是 Golang 最大的特色
Go 语言的 Goroutine 和 channel
进程,线程的概念在操作系统的书上已经有详细的介绍。进程是内存资源管理和cpu调度的执行单元。为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间,但cpu调度的最小单元变成了线程。
那协程又是什么东西,以及与线程的差异性??
协程,可以看作是轻量级的线程。但与线程不同的是,线程的切换是由操作系统控制的,而协程的切换则是由用户控制的。
Go 语言中 json 的操作以及常见问题
常见问题
结构体里的字段首字母必须大写
type Person struct{ Name string Age int } func main(){ person := Person{"小明",18} if result, err := json.Marshal(&person);err == nil { fmt.Println(string(result)) } }
控制台输出:
{"Name":"小明","Age":18}
如果字段首字母为小写的话,解析会有问题,得到的值为空。
可以通过字段的 tag 指定 struct 转 json 后的首字母小写
type Person struct { Name string `json:"name"` Age int `json:"age"` Time int64 `json:"-"` // 忽略字段 } func main(){ person:=Person{"小明",18, time.Now().Unix()} if result,err:=json.Marshal(&person);err==nil{ fmt.Println(string(result)) } }
控制台输出:
{"name":"小明","age":18}
Go 语言的面向对象使用场景
目前大部分高级语言都支持面向对象,比如 C++, JAVA, PHP 等,那么 Go 语言的面向对象怎么使用? 下面我们从面向对象的三个基本特性说起:封装、继承和多态。
封装,就是指运行的数据和函数绑定在一起,C++ 中主要是通过 this 指针来完成的; 继承,就是指 class 之间可以相互继承属性和函数; 多态,主要就是用统一的接口来处理通用的逻辑,每个 class 只需要按照接口实现自己的回调函数就可以了。
封装
package main import "fmt" type data struct { val int } func (p_data* data)set(num int) { p_data.val = num } func (p_data* data)show() { fmt.Println(p_data.val) } func main() { p_data := &data{4} p_data.set(5) p_data.show() }
继承
package main import "fmt" type parent struct { val int } type child struct { parent num int } func main() { var c child c = child{parent{1}, 2} fmt.Println(c.num) fmt.Println(c.val) }
多态
package main import "fmt" type act interface { write() } type xiaoming struct { } type xiaofang struct { } func (xm *xiaoming) write() { fmt.Println("xiaoming write") } func (xf *xiaofang) write() { fmt.Println("xiaofang write") } func main() { var w act; xm := xiaoming{} xf := xiaofang{} w = &xm w.write() w = &xf w.write() }
以下就是 Go 语言的面向对象的使用方法。使用上比 C++ 表现得更加简洁和直接。
Go 语言中使用 defer 的几个场景
简化资源回收,相当于析构函数
在 Go 语言中,没有析构函数,如果需要在实例完成后进行资源回收的情况,可以使用 defer 语句。 defer 是先进后出,这样做很合理,后面的语句会依赖前面的资源,如果先前面的资源先释放了,那后面的语句就没法执行了。 当然, defer 也有一定的开销, 也有为了节省性能而回避使用的 defer 的。 使用示例:
func set(mu *sync.Mutex, i int) { mu.Lock() mu.Unlock() }
panic 异常捕获,recover 只能在 defer 语句中使用
使用方法如下:
func main() { defer func() { if r := recover(); r != nil { fmt.Println(r) } }() panic("Error") }
修改返回值,适用于特定场景
func doubleSum(a, b int) (sum int) { defer func() { sum *= 2 }() sum = a + b }
安全回收资源,即使 panic 抛出异常,recover 也可捕获
不使用 defer 的情况,前面的语句出现异常,后面的语句就没有机会执行。
func set(mu *sync.Mutex, i, v int) { mu.Lock() i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行 mu.Unlock() }
使用 defer 的情况,即使前面出现异常,后面的语句照样可以执行。
func set(mu *sync.Mutex, i, v int) { mu.Lock() i := v / 0 // 0 不能做除数,会抛出异常,后面的语句不能被执行 mu.Unlock() }
SVN 仓库完美迁移到 Git 的方法
使用 git svn clone 命令拷贝 svn 仓库
cd ~ mkdir temp git svn clone url/to/svn/repo/ -T trunk -b branches -t tags
svn 的 url 不要加 trunk ,否则不能迁移 branches 和 tags
新建 git 的裸仓库
cd ~ mkdir temp.git cd temp.git git init --bare
将 git 的 master 和 svn 的 trunk 分支对应
git symbolic-ref HEAD refs/heads/trunk
阿里云服务器添加 Swap 分区
Linux 中 Swap(即:交换分区),类似于 Windows 的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。
由于我的 MySQL 总是报错
InnoDB: Fatal error: cannot allocate memory for the buffer pool
分配内存不足,使用 Swap 分区可以缓解内存不够的情况。Tengine 配置优化小结
Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。
从2011年12月开始,Tengine成为一个开源项目,Tengine团队在积极地开发和维护着它。Tengine团队的核心成员来自于淘宝、搜狗等互联网企业。Tengine是社区合作的成果,我们欢迎大家参与其中,贡献自己的力量。
阿里云登录报错 Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
vim /etc/ssh/sshd_config
PasswordAuthentication yes
重启服务器
Mac OSX 升级系统后 Git 出现 Error Running Git
Mac 更新系统后 Git 不能用,提示信息如下:
errors while executing git -- version. exitCode=1 errors: xcrun: error : invalid active developer path(/Library/Developer/CommandLineTools),missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
解决办法:
xcode-select --install
使用 go 命令升级至 go1.9beta2
从 go1.9beta2 运行 go 命令。
若要安装 go1.9beta2,请运行:
$ go get golang.org/x/build/version/go1.9beta2 $ go1.9beta2 download
升级 Windown 10 内置 Ubuntu 子系统
查看当前版本
打开命令提示符,输入
bash
,然后输入lsb_release -a
更换阿里云源
vim /etc/apt/sources.list
内容替换为
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
$ aptitude update $ aptitude safe-upgrade -y # 注1:升级过程中会提示你重启服务(restart services),选yes # 注2:还会出现文件冲突,保留当前版本(current version)即可,输入N
把所有包升级至 16.04 (xenial) 的最新版,并重装丢失的aptitude包,最后清理无用包
$ apt-get dist-upgrade $ apt-get install aptitude $ apt-get autoremove
lxrun 使用方法
对 LX 子系统执行管理操作 用法: /install - 安装子系统 可选参数: /y - 不提示用户接受 /uninstall - 卸载子系统 可选参数: /full - 执行完全卸载 /y - 不提示用户接受 /setdefaultuser - 配置将用于启动 bash 的子系统用户。如果该用户不存在,则会创建该用户。 可选参数: username - 提供用户名 /y - 如果提供了用户名,则不提示创建密码 /update - 更新子系统的包索引
卸载旧版本
打开命令提示符
C:\WINDOWS\system32>lxrun /uninstall /full /y 这将在 Windows 中卸载 Ubuntu。 这将删除 Ubuntu 环境以及任何修改、新应用程序和用户数据。 正在卸载...
安装新版本
打开命令提示符
C:\WINDOWS\system32>lxrun /install -- Beta 版功能 -- 这将在 Windows 上安装由 Canonical 分发的 Ubuntu, 根据其条款的授权参见此链接: https://aka.ms/uowterms 键入“y”继续: y 正在从 Windows 应用商店下载... 100% 正在提取文件系统,这将需要几分钟的时间... 请创建默认的 UNIX 用户帐户。该用户名不需要与 Windows 用户名匹配。 有关详细信息,请访问: https://aka.ms/wslusers 请输入新的 UNIX 用户名: root 找到 UNIX 用户: root 安装成功!
不卸载直接升级Ubuntu 14.04:
sudo do-release-upgrade
微软和Canonical官方均不推荐使用该方法,如果你要使用请参考:Ubuntu 16.04 安装指南。
CentOS 安装 PHP7
yum --enablerepo=remi-php70 install php-opcache php-mbstring php-mysql php-gd php-xml php-json php-devel php-pear ImageMagick-devel
Windows 10 Linux 子系统安装 php 环境
准备必要的源
sudo add-apt-repository ppa:ondrej/php sudo add-apt-repository ppa:jonathonf/vim sudo apt update sudo apt upgrade
安装必备软件
apt-get install zsh
apt-get install php5 php5-mysql php5-gd php5-curl php5-cli mysql-server apache2 silversearcher-ag make
安装 vim
sudo apt install vim // 卸载方法 apt remove vim add-apt-repository --remove ppa:jonathonf/vim
安装 tmux
apt-get install libevent-dev apt-get install ncurses-dev wget https://github.com/tmux/tmux/releases/download/2.3/tmux-2.3.tar.gz tar xzvf tmux-2.3.tar.gz ./configure && make mv tmux /usr/bin/
修改 ~/.minttyrc
Locale=zh_CN Charset=UTF-8 Font=DejaVu Sans Mono for Powerline Term=xterm-256color RightClickAction=paste CursorType=block ClicksTargetApp=no BoldAsFont=no BoldAsColour=no CopyAsRTF=no Scrollbar=none ForegroundColour=131,148,150 BackgroundColour=0,43,54 CursorColour=220,50,47 Black=7,54,66 BoldBlack=0,43,54 Red=220,50,47 BoldRed=203,75,22 Green=133,153,0 BoldGreen=88,110,117 Yellow=181,137,0 BoldYellow=101,123,131 Blue=38,139,210 BoldBlue=131,148,150 Magenta=211,54,130 BoldMagenta=108,113,196 Cyan=42,161,152 BoldCyan=147,161,161 White=238,232,213 BoldWhite=253,246,227 FontWeight=400
.tmux.conf
# 设置默认shell和terminal set -g default-shell /usr/bin/zsh set -g default-terminal "screen-256color" # 支持自动更新标题 setw -g automatic-rename on set -g set-titles on set -g set-titles-string 'Tmux - #S:#W' # 滚动时使用vi模式 setw -g mode-keys vi # 设置窗口和面板索引 set -g base-index 1 set -g pane-base-index 1 # 打开鼠标模式 set -g mouse on # 选择 pane bind-key k select-pane -U bind-key j select-pane -D bind-key h select-pane -L bind-key l select-pane -R # 扩展 pane bind H resize-pane -L 10 bind L resize-pane -R 10 bind K resize-pane -U 5 bind J resize-pane -D 5 # 复制模式 bind-key -t vi-copy 'v' begin-selection bind-key -t vi-copy 'C-v' rectangle-toggle bind-key -t vi-copy 'y' copy-selection # 状态条定制 set -g status-left-length 30 set -g status-right-length 100 set -g status-fg white set -g status-bg colour234 set -g window-status-activity-attr bold set -g pane-border-fg colour245 set -g pane-active-border-fg colour39 set -g message-fg colour16 set -g message-bg colour221 set -g message-attr bold set -g status-left '#[fg=colour235,bg=colour252,bold] ❐ #S #[fg=colour252,bg=colour238,nobold]#[fg=colour245,bg=colour238,bold] #(whoami) #[fg=colour238,bg=colour234,nobold]' set -g window-status-format "#[fg=colour234,bg=colour238]#[fg=colour245,bg=colour238,bold] #I #W#F #[fg=colour238,bg=colour234,nobold]" set -g window-status-current-format "#[fg=colour234,bg=colour39]#[fg=colour25,bg=colour39,noreverse,bold] #I #W#F #[fg=colour39,bg=colour234,nobold]" set -g status-right '#T %F %A %H:%M ' set -g window-status-separator ''
微博 TEAM BUILD - 韩国首尔
CentOS 7 安装 Nginx+Apache+PHP+Mariadb
使用 unoconv 将 PPT 转换成 PDF
Composer 安装时报错 "Internal Error [ERR_INVALID], exit code 0"
修改
php.ini
extension_dir = "\xampp\php\ext"
改为
extension_dir = "D:\xampp\php\ext"
browscap = "\xampp\php\extras\browscap.ini"
改为
browscap = "D:\xampp\php\extras\browscap.ini"
在 RedHat 或 CentOS 安装 Sphinx 安装包
文章归档
文章日历
2025 年 07 月 | ||||||
---|---|---|---|---|---|---|
日 | 一 | 二 | 三 | 四 | 五 | 六 |
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
文章标签
- Linux
- Go
- Yii
- 新浪
- CentOS
- PHP
- Git
- WSL
- Composer
- Mac
- 入职
- Bootstrap
- pyenv
- UCenter
- 厦门
- 出差
- 长沙
- 湖南卫视
- 微博
- Tengine
- YUI
- 泰国
- pecl
- 优化
- GitLab
- 迁移
- rootless
- 年会
- 生日
- Tengin
- RedHat
- Sphinx
- cygwin
- Windows
- Tmux
- Zsh
- 升级
- MySQL
- sql_mode
- Shadowsockets
- 面向对象
- HTTP
- 状态码
- grep
- unoconv
- PPT
- Nginx
- htpasswd
- golang
最新评论
-
崔亮 于 19-05-23 评论了Tengine 2.2.2 配置 http2 协议出现的坑
-
王媛 于 19-01-31 评论了Yii China 是官方唯一认可的中文社区
-
三杯蛙 于 19-01-24 评论了Go 语言中 json 的操作以及常见问题
-
三杯蛙 于 19-01-24 评论了新浪赴泰国曼谷和芭提雅团建
-
巡洋舰 于 18-09-05 评论了CentOS 安装 PHP7
-
小不点 于 11-03-02 评论了WordPress 如何控制每页显示的条数
-
白领厕工 于 10-12-22 评论了关于 phpMyAdmin 免输入用户名和密码,直接进入管理界面
-
清晨的欣赏 于 10-08-04 评论了PHP 5.4 的新特性
-
易赛官网 于 10-07-27 评论了PHP 5.4 的新特性
-
文秘之家 于 10-07-17 评论了PHP 5.4 的新特性
常用工具
- 时间戳转换
- URL ENCODE/DECODE
- JSON
- 正则测试