Nginx-高性能-Web-服务器实战教程-Notes

第4章 Nginx 基本配置

Nginx 所有功能的实现, 都是通过配置文件的设置完成的.

# 是注释符.

4.1.2 设置用户和组

4.1.3 自定义错误页

1. 为每种类型的错误设置单独的处理方式

1
2
error_page 403 /40x.html;
error_page 404 /404.jpg;

2. 利用在线资源进行错误处理

1
error_page 403 http://example.com/forbidden.html;

更改响应状态码

1
error_page 403=200 /40x.html;

4.2 访问控制

4.2.1 权限控制指令

两个用于配置访问权限的指令:

  • allow
  • deny
    指令后接 IP, IP 段或 all.

在内层中的设置优先级更高. 在同一个块中, 先出现的优先级更高.

所以这个权限控制一般放在模块的最后.

如:

1
2
allow 192.168.78.128;
deny all;

4.2.2 访问控制典型应用

对于网站下的 admin 目录仅允许管理员身份的用户访问.

location 块的前缀:
location 块的前缀

location 块是, 匹配成功了之后就执行后面的代码块.

如:

1
2
3
4
location /admin/auth {
allow 192.168.78.200;
}
deny all;

3. 最大前缀匹配

普通的 location 之间遵循 “最大前缀匹配原则”, 匹配度最高的 location 将会执行.

4.3 日志文件

Nginx 可以使每个块的配置拥有各自独立的日志进行记录.

可以分为:

  • 访问日志
  • 错误日志

4.4 虚拟主机

4.4.2 基于端口号配置虚拟主机

一个 Nginx 监听多个端口, 根据不同的端口号, 来区分不同的网站.

若要在 Nginx 中配置一个虚拟主机, 只需在 http 块中添加一个 server 块即可. 也就是说, http 块中的每个 server 块都是一个虚拟主机.

server_name 指令中也可以使用通配符 (*)与正则表达式来设置域名:

1
server_name *.test.com;

4.4.5 设置目录列表

Nginx 默认是不允许列出整个目录的.

开启目录列表功能后, 可以让该站点或目录下的文件以列表的形式展示.

开启:

1
autoindex on;

在 http 块中, 表示对于所有站点都有效, 在 server 块中, 表示对指定站点有效, 在 location 块中, 表示对某个目录起作用.

显示文件的时间格式与大小

audoindex_exact_size 指令设置精确显示文件大小还是大概显示文件大小.

autoindex_localtime 指令设置文件最后一次修改时间的格式.

1
2
autoindex_exact_size off; # 以 KB/MB/GB 显示
autoindex_localtime on;

4.4.6 子配置文件的引入

第6章 负载均衡与缓存

6.1.1 代理与反向代理

平时直接的称代理就是正向代理.

正向代理, 你还是直接向目标服务器发起请求, 只不过这个请求要先到达代理服务器.

反向代理, 你是直接向反向代理服务器发起请求.

6.1.2 反向代理服务配置

Nginx 服务器中, 反向代理的配置主要用 proxy_pass 指令. (直观看这两个单词, proxy 是代理, pass 是传递, 就是将反向代理服务器收到的请求转移给后方真正存储资源的服务器)

6.2 负载均衡

6.2.2 负载均衡的配置

通过 Nginx 中的 upstream 指令.

有四种实现负载均衡的方式:
负载均衡

在 upstream 指定的服务器组中, 若每个服务器的权重都设置为 1 (默认值) 时, 表示当前的负载均衡是一般轮循方式.

upstream 指令指定的服务器用于其前面的 proxy_pass 所指定的服务器.

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name test.com;

location / {
proxy_pass http://web_server;
}
}

upstream web_server {
server 192.168.78.128;
server 192.168.78.200;
}

也就是说, / 即任意请求, 或被 pass 到 http://web_server, 而 http://web_server 又是由两个 server 组成.

2. 加权轮循

使用 weight 参数设置权重大小:

1
2
3
4
upstream web_server {
server 192.168.78.128 weitht=1;
server 192.168.78.200 weitht=3;
}

其他状态参数:
state_args

设置为 backup 的服务器, 只有当其他所有的非 backup 机器出现故障或者忙碌的情况下, 才会请求 backup 服务器.

1
2
3
4
5
upstream web_server {
server 192.168.78.128 weitht=1;
server 192.168.78.200 weitht=3;
server 192.168.78.201 backup;
}

3. ip_hash 负载均衡

将每个请求按照访问 IP 的 hash 结果分配, 使得来自同一个 IP 的客户端固定访问一台 Web 服务器. 解决动态网页存在的 Session 共享问题.

1
2
3
4
5
6
upstream web_server {
ip_hash;
server 192.168.78.128;
server 192.168.78.200;
server 192.168.78.201;
}

使用 ip_hash 方式处理负载均衡时, Web 服务器在负载均衡列表中的状态不能使用 weight 和 backup 设置.

4. 利用第三方模块

6.3 缓存配置

6.3.2 永久缓存配置

Nginx 提供的 proxy_store 指令可以用于将内容源服务器响应的内容缓存到本地, 若不手动删除, 该缓存文件会一直生效.

如:

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name 192.168.78.3;
location / {
root cache;
proxy_store on; # 开启本地缓存
proxy_store_access user:rw group:rw all:r; # 设置读写权限
proxy_temp_path cache_tmp; # 设置临时目录
if (!-e $request_filename) {
proxy_pass http://192.168.78.128;
}
}
}

cache 这个目录的权限要与 Nginx 工作进程 (worker_process)相同.

6.3.3 临时缓存配置

6.3.4 缓存清理配置

6.4 邮件服务

第7章 模块配置应用

7.1 模块概述

7.1.1 模块化结构设计

7.1.2 Nginx 模块分类及应用

通常将 Nginx 分为 5 大模块, 分别为:

  • 核心模块
  • 标准 HTTP 模块
  • 可选 HTTP 模块
  • 邮件服务模块
  • 第三方模块

核心模块是 Nginx 服务器正常运行必不可少的模块, 如同操作系统的内核. 它提供了 Nginx 最基本的 核心服务.

标准 HTTP 模块用于支持标准 HTTP 的相关功能, 是编译 Nginx 时默认安装的模块.

可选 HTTP 模块主要用于扩展 HTTP 功能.

邮件服务模块主要用于支持邮件服务.

第三方模块是为了扩展 Nginx 的应用.

Nginx 的模块命名规则, 是以 ngx_ 开头, 以 _module 结尾.

ngx_core_module 表示该模块提供的是 Nginx 的核心功能.

7.1.3 Nginx 手册的使用

官网, Modules reference 中提供了 Nginx 所有模块以及指令的使用.

在指令或变量名称的后面, 若标注了具体的模块名称, 即表示该指令或变量只能在此模块下使用, 未标注的则表示通用指令和变量.

7.2 调试输出

7.2.1 调试输出的配置

使用 echo-nginx-module 这个第三方模块.

下载, 具体查看 github 上的相关部分

1. 查看当前 Nginx 版本及其编译选项

1
$ nginx -V

在原编译选项的基础上添加对 echo 模块的编译.

如:

1
2
3
4
5
$ ./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--add-module=/root/echo-nginx-module
$ make

这样就是重新编译.

3. 备份并复制 nginx 的可执行文件

1
2
3
$ cd objs
$ mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
$ cp nginx /usr/local/nginx/sbin/nginx

使用 echo 指令输出字符串:

1
2
3
4
5
6
location / {
root html;
index index.html index.htm;
default_type text/plain;
echo "This is an echo module.";
}

7.2.2 常见的应用案例

echo-nginx-module 中最常用的就是 echo 指令, 且该指令只能在 location 块或 location 块下 if 指令中使用.

7.3 查看响应状态与响应内容

7.3.1 安装所需模块

利用 ngx_http_stub_status_modulengx_http_sub_module 模块.

./configure 时添加:

1
2
--with-http_stub_status_module \
--with-http_sub_module

7.4 网页压缩传输

7.4.1 gzip 压缩技术

gzip (GNU-ZIP) 是一种压缩技术.

gzip 网页压缩的实现需要浏览器和服务器的支持:
gzip

7.4.2 网页压缩传输配置

相关配置指令:
gzip directives
gzip directives

7.5 重写与重定向

7.6 防盗链的配置

7.7 配置 HTTPS 网站

想要实现 HTTPS 加密网站, 在服务器端首先要获得 CA (CertificationAuthority) 认证机构颁发的服务器数字证书 (CRT), 然后浏览器在发起 HTTPS 请求时会验证服务器的 CRT 是否合法, 若不合法则给出一个 warning 提示信息, 若合法, 用户在与网站交互时, 所传输的数据都是加密后的数据.

Nginx 服务器中的 ngx_http_ssl_module 模块用于提供 HTTPS 网站的配置.

在学习阶段, Nginx 服务器若要获取数字证书, 可以使用 OpenSSL 开源软件将自己作为 CA 为自己颁发证书.

7.7.2 颁发认证证书

OpenSSL 是一个非常强大的安全套接字层密码库, 它包含了主要的密码算法, 常用的密钥, 证书封装管理以及 SSL 协议, 证书签发等多种功能.

OpenSSL 程序由 3 部分组成:

  • openssl 命令行工具
  • libcrypto 公共加密库
  • libssl 实现 SSL 协议

1. 生成服务器的 RSA 私钥

1
2
3
$ mkdir /usr/local/nginx/conf/ssl
$ cd /usr/local/nginx/conf/ssl
$ openssl genrsa -out server.key 2048

openssl 的参数及含义:

  • genrsa, 生成 rsa 私钥
  • -out server.key, 表示输出的文件名为 server.key, 文件所在目录为执行 openssl 命令时所在目录
  • 2048, 密钥长度, 越长, 安全性越强.

2. 生成服务器的 CSR 证书请求文件

CSR 是 Certificate Signing Request 的简称 (直接翻译过来就是 “证书签发请求” 这个东西当作公钥用, 也就是用来加密).

CSR 证书请求文件是服务器的公钥, 用于提交给 CA 机构进行签名.

生成 CSR:

1
$ openssl req -new -key server.key -out server.csr

req 表示证书签发申请.

-new 表示新请求.

-key server.key 指定私钥为 server.key. k

-out server.csr 表示生成的 CSR 证书请求文件名称为 server.csr.
openssl 生成 CSR 参数含义

这里, 私钥用于对数据进行数字签名, 签名后的数据可以利用公钥进行验证.

3. CA 为服务器认证证书

1
2
$ openssl x509 -req -days 30 \
-in server.car -signkey server.key -out server.crt

使用 CA 的私钥 server.key 为服务器的 CSR 证书申请文件 server.csr 进行签名认证.

x509 是签名证书格式. -days 30 用于设置签发证书的有效期.

7.7.3 配置 HTTPS 网站

需要在编译安装 Nginx 时添加对 ngx_http_ssl_module 模块的支持.

示例 nginx.conf 内容:

1
2
3
4
5
6
7
8
server {
listen 443;
server_name www.test.com;
root html/test.com;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl/server.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/server.key;
}

443 端口专门用于 HTTPS.

ssl on 开启 Nginx 对 SSL 的支持.

ssl_certificate 指定 CRT 文件.

ssl_certificate_key 指定服务器私钥.


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