遇到的问题
最近在一个windows环境中部署nginx,遇到了以下问题:
1. nginx启动了九个线程(1master+8woekr),但是所有链接都被1个woker接收,其余worker不工作
2. 用户端访问web很慢,登录服务器使用127.0.0.1访问本地页面也很慢
3. 已知服务器带宽、内存、磁盘读写均不存在任何瓶颈
4. 服务器并发访问数大概在500-1500左右,ngxin只占用15%的cpu和少量内存
5. 根据网上教程对nginx做了各种参数优化均不起作用。
后来我翻了以下nginx的官方文档,在有关windows环境的说明中提到了以下几点:
Version of nginx for Windows uses the native Win32 API (not the Cygwin emulation layer). Only the
select()
andpoll()
(1.15.9) connection processing methods are currently used, so high performance and scalability should not be expected. Due to this and some other known issues version of nginx for Windows is considered to be a beta version. At this time, it provides almost the same functionality as a UNIX version of nginx except for XSLT filter, image filter, GeoIP module, and embedded Perl language.windows版本的nginx使用Win32原生api,只有select()和poll()两种链接处理方式(nginx上则支持像是epoll()这种高性能的处理方式),所以不要对性能和可拓展性抱有期望了。因为以上原因和一些其他已知的问题,windows版本的nginx被认为是一个beta测试版。目前windows for nginx提供和UNIX版本几乎相同的功能,除了XSLT filter, image filter, GeoIP module, and embedded Perl language.
Known issues
- Although several workers can be started, only one of them actually does any work.
- The UDP proxy functionality is not supported.
已知问题
- 虽然nginx会启动很多worker线程,但是只有一个worker线程在真正工作。
- 不支持UDP代理功能
根据nginx官方的描述,结合本人的实践,得出的结论是在面对高并发场景时,最好不要选择在windows上使用nginx。至于这个高并发到底有多高? 就我目前的windows server大概在保持不到300个连接数的时候就已经出现了非常验证的卡顿问题了。
解决方案
更换web服务器,可以使用IIS,如果你对IIS不熟悉的话,也可以换caddy
我将web服务迁移到caddy后,web访问慢的现象立马就解决了,并且cpu占用率也降低至5%(nginx cpu占用率长期为12%,不会增加也不会减少,很奇怪)。
从下列地址可以下载到caddy的发行包
Releases · caddyserver/caddy · GitHub
caddy的优势:
1. 使用go编写,天然跨平台,对windows友好
2. 配置简单。(风格和nginx接近,但是仍然有很多差异,需要好好读一下官方文档)
3. 有开源社区翻译的中文文档提供支持。我大概用了两三个小时的实践根据文档将nginx迁移到了caddy。
4. 原生支持ACME自动更新https证书。
最后补一张对比图,更换caddy后cpu占用降低,且上行带宽消耗增加。幅度可能不大明显,但是web访问速度是明显增加了的,更换之前系统基本处于半瘫痪状态。