FPs

Articles with the nginx tag

Ngxfmt

接手一坨缩进、格式乱七八糟的Nginx 配置,简直要命。想起golang 有一个gofmt,动手做一个简单的ngxfmt。

Continue ->

ip.fangpeishi.com

server {
    listen 80;
    server_name ip.fangpeishi.com;
    location / {
        default_type text/plain;
        return 200 "$remote_addr\n";
    }
}

获取外网IP,给自己在某些脚本里面用,没有查询地址、运营商的需求。


高流量负载下Nginx 调优

  • 原文地址: Martin Fjordvald
  • 已获得原文作者翻译许可,本文遵循原文许可协议
  • 原文发表时间:April 27,2011

我曾经讨论过一些Nginx 最常见的问题,毫无疑问,其中一个问题就是关于如何优化nginx 获得高性能。不必惊讶,因为大多数nginx 新用户都是从Apache 迁移过来,所以他们习惯于调整配置和使用巫术来尽可能让服务器达到最佳性能。

恩,我得告诉你一些坏消息,你并不能真的显着优化nginx。没有什么配置能让你的负载降低一半,或让PHP 运行速度快2 倍。谢天谢地,好消息是nginx 不需要任何调优,因为直接使用它时就已经被优化过了。最大的优化发生在当你决定运行通过ape-get install ,yum install 或 make install 安装的nginx。(请注意这些仓库内容常常过期。Wiki 的安装页面上通常有最新的仓库。)

也就是说,有很多选项会影响nginx 的行为,但是这些选项的默认值并不全都为高流量的情况优化过。另外我们也需要考虑nginx 运行的平台,优化我们的操作系统,因为它们某些地方也会有瓶颈。

总之,我们没法优化单个连接的加载时间,但是可以确保nginx 处理高流量的情况时有优化过的理想的环境。当然,我所说的高流量是指每秒几百个请求,绝大多数人不需要为这种情况费心思,不过如果你有兴趣或者准备处理这种情况,请继续往下读吧。

Continue ->

Nginx 加载配置的顺序分析

问题背景

在部署HTTPS 的时候,2台Nginx 下都部署了多个域名的证书,即NginxA 部署了证书a.com 和b.com 的证书,NginxB 也部署了证书a.com 和b.com ,域名a.com 指向NginxA,域名b.com 指向NginxB。
在用SSL LABS 检测的时候,发现b.com 会出现“This site works only in browsers with SNI support.”,而a.com 不会。
SNI

SNI 介绍

关于SNI 的简单介绍:

在 Nginx 中可以通过指定不同的 server_name 来配置多个站点。HTTP/1.1 协议请求头中的 Host 字段可以标识出当前请求属于哪个站点。但是对于 HTTPS 网站来说,要想发送 HTTP 数据,必须等待 SSL 握手完成,而在握手阶段服务端就必须提供网站证书。对于在同一个 IP 部署不同 HTTPS 站点,并且还使用了不同证书的情况下,服务端怎么知道该发送哪个证书?
Server Name Indication,简称为 SNI,是 TLS 的一个扩展,为解决这个问题应运而生。有了 SNI,服务端可以通过 Client Hello 中的 SNI 扩展拿到用户要访问网站的 Server Name,进而发送与之匹配的证书,顺利完成 SSL 握手。

引用来源:关于启用 HTTPS 的一些经验分享(二)

使用OpenSSL 测试NginxA,NginxB,不指定Host 头,NginxA 返回的是a.com 的证书,NginxB 返回的也是a.com 的证书。

openssl s_client -connect nginx_ip:443 -showcerts < /dev/null 

Nginx 源码分析

基本确定是配置加载的顺序问题。在NginxA 和NginxB 中先加载的都是a.com。 在nginx.conf 中,我用 include 指令 引入了 某目录下的所有conf 结尾的配置:

include /home/xxxxx/*.conf;

怀疑Nginx include 是按照字典顺序,即a-z 的顺序。看下源代码,参考的Nginx 代码版本是1.11.0。
先找到include 指定相关的函数:
Continue ->