高性能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 配置文件结构

Nginx 配置文件结构

10.3.2 Nginx 配置文件详解

location 中的 expires 指令用来指定静态文件的过期时间.

1
2
3
4
location ~ .*.jsp$ {
index index.jsp;
proxy_pass http://localhost:8080;
}

这一段将所有以 .jsp 后缀的文件都交给本机的 8080 端口处理.

错误信息的返回页面的大小要超过 512KB, 否则会被 IE 浏览器替换为 IE 默认的错误页面.

10.3.3 Nginx 日常维护技巧

1. Nginx 配置正确性检查

配置文件调试功能:

1
$ /usr/local/nginx/sbin/nginx -t

1
$ /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

-t 参数用于检查配置文件是否正确, 但并不执行.

-c 参数用于指定配置文件路径, 不指定的话默认到安装目录下查找 conf/nginx.conf

10.4 Nginx 常用功能介绍

10.4.1 Nginx 反向代理应用实例

当一台代理服务器能够代理外部网络上的访问请求来访问内部网络时, 这种代理服务的方式称为反向代理.

1. 多域名跳转应用实例

一个网站可以有多个域名.

1
2
3
4
5
6
7
8
9
10
11
server www.tb.com
location / {
proxy_pass http://192.168.66.90:8080/web/;
}
location /admin {
proxy_pass http://192.168.66.90:8080/admin/;
}
server m.tb.com
location / {
proxy_pass http://192.168.66.90:8080/wap/;
}

2. 通过 Nginx 重定向实现新旧域名过渡

1
2
3
4
server {
server_name www.taob.com;
rewrite ^/(.*)$ http://www.tb.com/$1 permanent;
}

rewrite 模块用于重定向.

3. alias 在 Nginx 下的应用

设置别名的功能:

1
2
3
location /i {
alias /var/www/html/images/;
}

将请求中的 /i 替换为 /var/www/html/images/.

还比如:

1
2
3
location ~ ^/download/(.*)$ {
alias /home/webdata/www/$1;
}

这里的 $1 是引用正则表达式中捕获的内容.

在 Nginx 中, alias 命令和 root 命令有些类似, 但还是有差别.

alias 指定的目录是当前目录, 而 root 指定的是根目录.

一般情况下, 建议在 location / 中通过 root 命令来配置根目录, 而在其他目录配置的位置使用 alias 命令.

location 命令应用实例

实现 IP 访问控制, 需要使用 ngx_http_access_module 模块 (也就是编译时加入这个模块), 如:

1
2
3
4
5
location / {
deny 192.168.66.80;
allow 192.168.66.0/24;
deny all;
}

禁止访问某个目录:

1
2
3
location ~ ^/(WEB-INF)/ {
deny all;
}

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
rewrite regex flag

可以在 server, location, if 部分使用.

主要的 flag 标记:

  • last
  • break
  • redirect
  • permanent

3. set 命令

set 命令可以设置一个变量并为其赋值.

不能使用 set 设置 $http_xxx 头部变量的值.

语法:

1
set variable value

可以在 server, location, if 字段中使用.

如:

1
2
3
4
5
location / {
proxy_pass http://127.0.0.1:8080/;
set $query $query_string;
rewrite /dede /wordpress?query?;
}

break 命令

表示完成当前设置的规则后, 不再匹配后面的重写规则.

语法:

1
break

可以在 server, location, if 字段中使用.

如:

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name www.tb.cn www.taob.com;

if ($host != 'www.tb.cn') {
rewrite ^/(.*)$ http://www.tb.cn/error.txt
break;
rewrite ^/(.*)$ http://www.tb.cn/$1 permanent;
}
}

10.5 案例: Nginx 作为 Web 缓存服务器应用

10.6 案例: Nginx 作为负载均衡服务器应用

Nginx 的负载均衡功能是通过 upstream 命令实现的.

10.6.1 Nginx 的负载均衡算法

10.7 Nginx 性能优化技巧

三个方面:

  • 编译安装
  • 第三方插件
  • 系统内核

10.7.1 编译安装过程优化

编译之前, 学该相关源代码, 取消 debug 模式.

注释掉 auto/cc/gcc 中的:

1
2
# debug
CFLAGS=" $CFLAGS -g"

使用以下两个参数:

1
2
--with-cc-opt='-O3'
--with-cpu-opt=CPU # 这里要指定一个特定的 CPU

利用 cat /proc/cpuinfo | grep "model name" 来确定.


高性能Linux服务器构建实战-Notes
http://example.com/2022/10/02/高性能Linux服务器构建实战-Notes/
作者
Jie
发布于
2022年10月2日
许可协议