天使时代:一篇文章让你成为Nginx专家

配置的修改没有起效浏览器缓存。你的配置可能是对的,但怎么尝试结果总是不对,百思不得其解。 罪魁祸首是你的浏览器缓存。当你下载东西的时候,浏览器做了缓存。

怎么修复:

在 Firefox 里面 Ctrl + Shift + Delete,检查缓存,点击立即清理。可以用你喜欢的搜索引擎找到其他浏览器清理缓存的方法。 每次更改配置后,都需要清理下缓存(除非你知道这个不必要) ,这会省很多事儿。

使用 curl。

VirtualBox

如果你在 VirtualBox 的虚拟机中运行 Nginx,而它不工作,可能是因为 sendfile() 引起的麻烦。 只用简单的注释掉 sendfile 指令,或者设置为 off。该指令大都会写在 Nginx .conf 文件中:

sendfile off;

丢失(消失) 的 HTTP 头

如果你没有明确的设置 underscores_in_headers on; , Nginx 将会自动丢弃带有下划线的HTTP 头(根据 HTTP 标准,这样做是完全正当的). 这样做是为了防止头信息映射到 CGI 变量时产生歧义,因为破折号和下划线都会被映射为下划线。

没有使用标准的 Document Root Location

在所有的文件系统中,一些目录永远也不应该被用做数据的托管。这些目录包括 / 和 /root。

你永远不应该使用这些目录作为你的 document root。

使用这些目录的话,等于打开了潘多拉魔盒,请求会超出你的预期获取到隐私的数据。

永远也不要这样做!!! ( 对,我们还是要看下飞蛾扑火的配置长什么样子)

server {

root /;

location / {

try_files /web/$uri $uri @php;

}

location @php {

[...]

}

}

当一个对 /foo 的请求,会传递给 PHP 处理,因为文件没有找到。 这可能没有问题,直到遇到 /etc/passwd 这个请求。没错,你刚才给了我们这台服务器的所有用户列表。 在某些情况下,Nginx 的 workers 甚至是 root 用户运行的。那么,我们现在有你的用户列表, 以及密码

哈希值,我们也知道哈希的方法。这台服务器已经变成我们的肉鸡了。

Filesystem Hierarchy Standard (FHS) 定义了数据应该如何存在。你一定要去阅读下。 简单点儿说,你应该把 web 的内容 放在 /var/www/ , /srv 或者 /usr/share/www 里面。

使用默认的 Document Root

在 Ubuntu、Debian 等操作系统中,Nginx 会被封装成一个易于安装的包, 里面通常会提供一个“默认”的配置文件作为范例,也通常包含一个 document root 来保存基础的 HTML 文件。

大部分这些打包系统,并没有检查默认的 document root 里面的文件是否修改或者存在。 在包升级的时候,可能会导致代码失效。有经验的系统管理员都知道,不要假设默认的document root 里面的数据在升级的时候会原封不动。

你不应该使用默认的 document root 做网站的任何关键文件的目录。 并没有默认的 document root 目录会保持不变这样的约定,你网站的关键数据, 很可能在更新和升级系统提供的Nginx 包时丢失。

使用主机名来解析地址

糟糕的配置:

upstream {

server http://someserver;

}

server {

listen myhostname:80;

# [...]

}

你不应该在 listen 指令里面使用主机名。 虽然这样可能是有效的,但它会带来层出不穷的问题。 其中一个问题是,这个主机名在启动时或者服务重启中不能解析。 这会导致 Nginx 不能绑定所需的 TCP socket 而启动失败。

一个更安全的做法是使用主机名对应 IP 地址,而不是主机名。 这可以防止 Nginx 去查找 IP地址,也去掉了去内部、外部解析程序的依赖。

例子中的 upstream location 也有同样的问题,虽然有时候在 upstream 里面不可避免要使用到主机名, 但这是一个不好的实践,需要仔细考虑以防出现问题。

推荐的配置:

upstream {

server http://10.48.41.12;

}

server {

listen 127.0.0.16:80;

# [...]

}

在HTTPS 中使用 SSLv3

由于 SSLv3 的 POODLE 漏洞, 建议不要在开启 SSL 的网站使用 SSLv3。 你可以简单粗暴的直接禁用 SSLv3,用 TLS 来替代:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2

本文就介绍到这里,下篇将正式介绍OpenResty


分享到:


相關文章: