高性能Linux服务器构建实战-Notes
第10章 高性能 Web 服务器 Nginx (engine x)
10.1.1 Nginx 的组成与工作原理
Nginx 仅仅通过查找配置文件将客户端的请求映射到一个 location block.
location block 用于 URL 匹配.
Nginx 的模块直接被编译进 Nginx, 属于静态编译方式.
模块感觉相当与插件, 包含一些指令.
在解析配置文件时, Nginx 的每个模块都有可能去处理某个请求, 但是同一个请求只能由一个模块来完成.
10.3 配置与调试 Nginx
10.3.1 Nginx 配置文件结构
10.3.2 Nginx 配置文件详解
location 中的 expires
指令用来指定静态文件的过期时间.
1 |
|
这一段将所有以 .jsp
后缀的文件都交给本机的 8080 端口处理.
错误信息的返回页面的大小要超过 512KB, 否则会被 IE 浏览器替换为 IE 默认的错误页面.
10.3.3 Nginx 日常维护技巧
1. Nginx 配置正确性检查
配置文件调试功能:
1 |
|
或
1 |
|
-t
参数用于检查配置文件是否正确, 但并不执行.
-c
参数用于指定配置文件路径, 不指定的话默认到安装目录下查找 conf/nginx.conf
10.4 Nginx 常用功能介绍
10.4.1 Nginx 反向代理应用实例
当一台代理服务器能够代理外部网络上的访问请求来访问内部网络时, 这种代理服务的方式称为反向代理.
1. 多域名跳转应用实例
一个网站可以有多个域名.
1 |
|
2. 通过 Nginx 重定向实现新旧域名过渡
1 |
|
rewrite
模块用于重定向.
3. alias 在 Nginx 下的应用
设置别名的功能:
1 |
|
将请求中的 /i
替换为 /var/www/html/images/
.
还比如:
1 |
|
这里的 $1
是引用正则表达式中捕获的内容.
在 Nginx 中, alias 命令和 root 命令有些类似, 但还是有差别.
alias 指定的目录是当前目录, 而 root 指定的是根目录.
一般情况下, 建议在 location /
中通过 root 命令来配置根目录, 而在其他目录配置的位置使用 alias 命令.
location 命令应用实例
实现 IP 访问控制, 需要使用 ngx_http_access_module
模块 (也就是编译时加入这个模块), 如:
1 |
|
禁止访问某个目录:
1 |
|
10.4.2 Nginx 的 URL 重新应用实例
常见的 URL 重写模块命令有 if, rewrite, set, break 等.
1. if 命令
语法和 C 语言一样.
可以在 server, location 部分使用.
几个可以在判断部分使用的匹配.
正则匹配:
~
, 区分大小写匹配~*
, 不区分大小写匹配!~
和!~*
, 非
文件及目录匹配, 这里和 shell script 差不多:
-f
, 是否是文件-d
, 是否是目录-e
, 是否存在-x
, 文件是否可执行
Nginx 配置文件的内置变量:
2. rewrite 命令
Nginx 通过 ngx_http_rewrite_module
模块支持 URL 重写和 if 条件判断, 但要使用 rewrite 功能, 需要 pcre 支持, 应在编译 Nginx 时指定 pcre 源码目录.
语法是:
1 |
|
可以在 server, location, if 部分使用.
主要的 flag 标记:
- last
- break
- redirect
- permanent
3. set 命令
set
命令可以设置一个变量并为其赋值.
不能使用 set
设置 $http_xxx
头部变量的值.
语法:
1 |
|
可以在 server, location, if 字段中使用.
如:
1 |
|
break 命令
表示完成当前设置的规则后, 不再匹配后面的重写规则.
语法:
1 |
|
可以在 server, location, if 字段中使用.
如:
1 |
|
10.5 案例: Nginx 作为 Web 缓存服务器应用
10.6 案例: Nginx 作为负载均衡服务器应用
Nginx 的负载均衡功能是通过 upstream 命令实现的.
10.6.1 Nginx 的负载均衡算法
10.7 Nginx 性能优化技巧
三个方面:
- 编译安装
- 第三方插件
- 系统内核
10.7.1 编译安装过程优化
编译之前, 学该相关源代码, 取消 debug
模式.
注释掉 auto/cc/gcc
中的:
1 |
|
使用以下两个参数:
1 |
|
利用 cat /proc/cpuinfo | grep "model name"
来确定.