Nginx使用手册
# nginx相关知识
# 系统
CENTOS>=7.0,位数 X64 CENTOS 7.2
# nginx优势
IO多路复用 多个描述符的IO操作都能在一个线程里并发交替顺序完成,复用线程.
Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
接收来自外界的信号,向各worker进程发送信号,每个进程都有可能来处理这个连接。
master 进程能监控 worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。
worker 进程数,一般会设置成机器 cpu 核数。因为更多的worker 数,只会导致进程相互竞争 cpu,从而带来不必要的上下文切换。
使用多进程模式,不仅能提高并发率,而且进程之间相互独立,一个 worker 进程挂了不会影响到其他 worker 进程。CPU亲和 把CPU内核和nginx的工作进程绑定在一起,让每个worker进程固定在一个CPU上执行,从而减少CPU的切换并提高缓存命中率,提高 性能
sendfile 零拷贝传输模式
默认配置下,Nginx 读取本地文件后,在进行网络传输时会先将硬盘文件从硬盘中读取到 Nginx 的文件缓冲区中,操作流程为:硬盘 → 内核文件缓冲区 → 应用缓冲区。然后将 Nginx 文件缓冲区的数据写入网络接口,操作流程:应用缓冲区 → 内核网络缓冲区 → 网络接口。Nginx 的本地文件在进行网络传输的过程中,经历了上述读取与写入两个操作过程,两次操作都在内核缓冲区中存储了相同的数据。为了提高文件的传输效率,内核提供了零复制技术,该技术支持文件在内核缓冲区内直接交换打开的文件句柄,无须重复复制文件内容到缓冲区,则上述两个操作的流程变为:硬盘 → 内核文件缓冲区 → 内核网络缓冲区 → 网络接口。
零复制技术减少了文件的读写次数,提升了本地文件的网络传输速度。内核缓冲区的默认大小为 4096B。
# nginx版本
- Mainline version 开发版
- Stable version 稳定版
- Legacy versions 历史版本
nginx下载地址 (opens new window) nginx linux package (opens new window)
CentOS下YUM安装
路径:/etc/yum.repos.d/nginx.repo
文件内容:
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
2
3
4
5
命令:
yum install nginx -y
nginx -v
nginx -V
2
3
# 配置文件及用途
查看配置文件和目录
rpm -ql nginx
配置文件及用途
类型 | 路径 | 用途 |
---|---|---|
配置文件 | /etc/logrotate.d/nginx | 用于logrotate服务的日志切割 |
配置文件 | /etc/nginx /etc/nginx/nginx.conf /etc/nginx/conf.d /etc/nginx/conf.d/default.conf | 主配置文件 |
配置文件 | /etc/nginx/fastcgi_params /etc/nginx/scgi_params /etc/nginx/uwsgi_params | cgi配置,fastcgi配置 |
配置文件 | /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/win-utf | 编码转换映射转化文件 |
配置文件 | /etc/nginx/mime.types | 设置http协议的Content-Type与扩展名对应关系 |
配置文件 | /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /etc/sysconfig/nginx /etc/sysconfig/nginx-debug | 用于配置系统守护进程管理器管理方式 |
配置文件 | /etc/nginx/modules /usr/lib64/nginx/modules | nginx模块目录 |
命令 | /usr/share/doc/nginx-1.14.0 /usr/share/doc/nginx-1.14.0/COPYRIGHT | nginx的手册和帮助文件 |
目录 | /var/cache/nginx | nginx的缓存目录 |
目录 | /var/log/nginx | nginx的日志目录 |
安装目录和路径
--prefix=/etc/nginx # 安装目录
--sbin-path=/usr/sbin/nginx # 可执行文件
--modules-path=/usr/lib64/nginx/modules # 安装模块
--conf-path=/etc/nginx/nginx.conf # 配置文件路径
--error-log-path=/var/log/nginx/error.log # 错误日志
--http-log-path=/var/log/nginx/access.log # 访问日志
--pid-path=/var/run/nginx.pid # 进程ID
--lock-path=/var/run/nginx.lock # 加锁对象
2
3
4
5
6
7
8
执行对应模块时,nginx所保留的临时性文件
--http-client-body-temp-path=/var/cache/nginx/client_temp # 客户端请求体临时路径
--http-proxy-temp-path=/var/cache/nginx/proxy_temp # 代理临时路径
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
2
3
4
5
设置nginx进程启动的用户和用户组
--user=nginx # 指定用户
--group=nginx # 指定用户组
2
设置额外的参数将被添加到CFLAGS
变量,CFLAGS
变量用来存放C语言编译时的优化参数
--with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong
设置链接文件参数,链接系统库。
定义要传递到C链接器命令行的其他选项。
PCRE库,需要指定–with-ld-opt="-L /usr/local/lib"
--with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
其它参数
--with-compat
--with-file-aio
--with-threads
--with-http_addition_module
--with-http_auth_request_module
--with-http_dav_module
--with-http_flv_module
--with-http_gunzip_module
--with-http_gzip_static_module
--with-http_mp4_module
--with-http_random_index_module
--with-http_realip_module
--with-http_secure_link_module
--with-http_slice_module
--with-http_ssl_module
--with-http_stub_status_module
--with-http_sub_module
--with-http_v2_module
--with-mail
--with-mail_ssl_module
--with-stream
--with-stream_realip_module
--with-stream_ssl_module
--with-stream_ssl_preread_module
--param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
主要的配置文件
/etc/nginx/nginx.conf # 核心配置文件
/etc/nginx/conf.d/*.conf # 包含conf.d目录下面的所有配置文件
/etc/nginx/conf.d/default.conf # 默认http服务器配置文件
2
3
# cgi配置文件
- CGI是common gateway interface(通用网关接口)
- Web Server 通过cgi协议可以把动态的请求传递给如php、jsp、python和perl等应用程序
- FastCGI 实际上是增加了一些扩展功能的 CGI ,是 CGI 的改进,描述了客户端和Web服务器程序之间传输数据的一种标准。
- SCGI协议是一个CGI(通用网关接口)协议的替代品· 它是一个应用与HTTP服务器的接口标准,类似于FastCGI,但是它设计得更为容易实现
- uwsgi是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议
路径 | 用途 |
---|---|
/etc/nginx/fastcgi_params | fastcgi配置 |
/etc/nginx/scgi_params | scgi配置 |
/etc/nginx/uwsgi_params | uwsgi配置 |
# 编码转换映射转化文件
- 这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码
- koi8-r是斯拉夫文字8位元编码,供俄语及保加利亚语使用。在Unicode未流行之前,KOI8-R 是最为广泛使用的俄语编码,使用率甚至起ISO/IEC 8859-5还高。这3个文件存在是因为作者是俄国人的原因。
路径 | 用途 |
---|---|
/etc/nginx/koi-utf | koi8-r <--> utf-8 |
/etc/nginx/koi-win | koi8-r <--> windows-1251 |
/etc/nginx/win-utf | windows-1251 < -- > utf-8 |
# 扩展名文件
/etc/nginx/mime.types
设置http协议的Content-Type与扩展名对应关系
# 守护进程管理
用于配置系统守护进程管理器管理方式
路径 |
---|
/usr/lib/systemd/system/nginx-debug.service |
/usr/lib/systemd/system/nginx.service |
/etc/sysconfig/nginx |
/etc/sysconfig/nginx-debug |
systemctl restart nginx.service
# nginx模块目录
/etc/nginx/modules
最基本的共享库和内核模块。
目的是存放用于启动系统和执行root文件系统的命令的如/bin
和/sbin
的二进制文件的共享库,或者存放32位,或者64位(file命令查看)
/usr/lib64/nginx/modules
64位共享库
# nginx的手册和帮助文件
路径 | 用途 |
---|---|
/usr/share/doc/nginx-1.14.2 | 帮助文档 |
/usr/share/doc/nginx-1.14.0/COPYRIGHT | 版权声明 |
/usr/share/man/man8/nginx.8.gz | 手册 |
# nginx服务的启动管理的可执行文件
路径 | 用途 |
---|---|
/usr/sbin/nginx | 可执行命令 |
/usr/sbin/nginx-debug | 调试执行可执行命令 |
# nginx内容配置
# nginx配置语法
# 使用#可以添加注释,使用$符号可以使用变量
# 配置文件由指令与指令块组成,指令块以{}将多条指令组织在一起
http {
# include语句允许把多个配置文件组合起来以提升可维护性
include mime.types;
# 每条指令以;(分号)结尾,指令与参数之间以空格分隔
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
# 有些指令可以支持正则表达式
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 全局和服务配置
分类 | 配置项 | 作用 |
---|---|---|
全局 | user | 设置nginx服务的系统使用用户 |
全局 | worker_processes | 工作进程数,一般和CPU数量相同 |
全局 | error_log | nginx的错误日志 |
全局 | pid | nginx服务启动时的pid |
# 事件配置
分类 | 配置项 | 作用 |
---|---|---|
events | worker_connections | 每个进程允许的最大连接数 10000 |
events | use | 指定使用哪种模型(select/poll/epoll),建议让nginx自动选择,linux内核2.6以上一般能使用epoll,提高性能。 |
# http配置
配置的文件/etc/nginx/nginx.conf
,一个HTTP下面可以配置多个server。
user nginx; # 设置nginx服务的系统使用用户
worker_processes 1; # 工作进程数,一般和CPU数量相同
error_log /var/log/nginx/error.log warn; # nginx的错误日志
pid /var/run/nginx.pid; # nginx服务启动时的pid
events {
worker_connections 1024; # 每个进程允许的最大连接数 10000
}
http {
include /etc/nginx/mime.types; # 文件后缀和类型类型的对应关系
default_type application/octet-stream; # 默认content-type
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; # 日志记录格式
access_log /var/log/nginx/access.log main; # 默认访问日志
sendfile on; # 启用sendfile
#tcp_nopush on; # 懒发送
keepalive_timeout 65; # 超时时间是65秒
#gzip on;gzip压缩
include /etc/nginx/conf.d/*.conf; # 包含的子配置文件
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# server配置
文件为/etc/nginx/conf.d/default.conf
,一个server下面可以配置多个location。
server {
listen 80; # 监听的端口号
server_name localhost; # 用域名方式访问的地址
#charset koi8-r; # 编码
#access_log /var/log/nginx/host.access.log main; # 访问日志文件和名称
location / {
root /usr/share/nginx/html; # 静态文件根目录
index index.html index.htm; # 首页的索引文件
}
#error_page 404 /404.html; # 指定错误页面
# redirect server error pages to the static page /50x.html
# 把后台错误重定向到静态的50x.html页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
# 代理PHP脚本到80端口上的apache服务器
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 把PHP脚本9000端口上监听的FastCGI服务
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
# 不允许访问.htaccess文件
# location ~ /\.ht {
# deny all;
# }
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Systemd配置
系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其他进程,根据管理,字母d是守护进程(daemon)的缩写。
# 配置目录
配置目录 | 用途 |
---|---|
/usr/lib/systemd/system | 每个服务最主要的启动脚本设置,类似于之前的/etc/initd.d |
/run/system/system | 系统执行过程中所产生的服务脚本,比上面的目录优先运行 |
/etc/system/system | 管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行,在三者之中,此目录优先级最高 |
# systemctl
配置nginx的systemctl命令 (opens new window)
- 监视和控制systemd的主要命令是systemctl
- 该命令可用于查看系统状态和管理系统及服务
命令:systemctl command name.service
启动:service name start –> systemctl start name.service
停止:service name stop –> systemctl stop name.service
重启:service name restart –> systemctl restart name.service
状态:service name status –> systemctl status name.service
2
3
4
5
# 启动和重新加载
systemctl restart nginx.service
systemctl reload nginx.service
nginx -s reload
2
3
# 日志相关
/var/log/nginx/access.log 访问日志 /var/log/nginx/error.log 错误日志
- log_format
类型 | 用法 |
---|---|
语法 | log_format name [escape=default[json] string] |
默认 | log_format combined ... |
Context | http |
log_format例子 (opens new window)
ngx_http_log_module (opens new window)
内置变量
名称 | 含义 |
---|---|
$remote_addr | 客户端地址 |
$remote_user | 客户端用户名称 |
$time_local | 访问时间和时区 |
$request | 请求行 |
$status | HTTP请求状态 |
$body_bytes_sent 发送给客户端文件内容大小 |
- HTTP请求变量
注意要把-转成下划线,比如User-Agent对应于$http_user_agent
名称 | 含义 | 例子 |
---|---|---|
arg_PARAMETER | 请求参数 | $arg_name |
http_HEADER | 请求头 | $http_referer $http_host $http_user_agent $http_x_forwarded_for(代理过程) |
sent_http_HEADER | 响应头 | sent_http_cookie |
IP1->IP2(代理)->IP3 会记录IP地址的代理过程
http_x_forwarded_for=Client IP,Proxy(1) IP,Proxy(2) IP
定义日志格式
# 定义一种日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format zfpx '$arg_name $http_referer sent_http_date"';
# 指定写入的文件名和日志格式
access_log /var/log/nginx/access.log main;
2
3
4
5
6
7
8
查看日志
tail -f /var/log/nginx/access.log
221.216.143.110 - - [09/Jun/2018:22:41:18 +0800] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36" "-"
2
3
# 核心模块
- 监控ngin客户端的状态
模块名:
--with-http_stub_status_module
Syntax: stub_status on/off;
Default: -
Context: server->location
2
3
实战
文件:/etc/nginx/conf.d/default.conf
server {
+ location /status{
+ stub_status on;
+ }
2
3
4
systemctl reload nginx.service
http://192.171.207.104/status
Active connections: 2
server accepts handled requests
3 3 10
Reading: 0 Writing: 1 Waiting: 1
2
3
4
5
6
7
8
参数 | 含义 |
---|---|
Active | connections |
accepts | 总共处理的连接数 |
handled | 成功创建握手数 |
requests | 总共处理请求数 |
Reading | 读取到客户端的Header信息数 |
Writing | 返回给客户端的Header信息数 |
Waiting | 开启keep-alive的情况下,这个值等于 active – (reading + writing) |
- 在根目录里随机选择一个主页显示
模块名:--with-http_random_index_module
Syntax: random_index on/off;
Default: off
Context: location
2
3
实战
/etc/nginx/conf.d/default.conf
+ location / {
+ root /opt/app;
+ random_index on;
+ }
2
3
4
- 内容替换
模块名:--with-http_sub_module
文本替换
Syntax: sub_filter string replacement;
Default: --
Context: http,service,location
只匹配一次
Syntax: sub_filter_once on|off;
Default: off
Context: http,service,location
2
3
4
5
6
7
8
9
实战
文件位置:/etc/nginx/conf.d/default.conf
location / {
root /usr/share/nginx/html;
index index.html index.htm;
+ sub_filter 'world' 'mamingjuan';
+ sub_filter_once off;
}
2
3
4
5
6
- 请求限制
模块名
--with-limit_conn_module 连接频率限制
--with-limit_req_module 请求频率限制
一次TCP请求至少产生一个HTTP请求
SYN > SYN,ACK->ACK->REQUEST->RESPONSE->FIN->ACK->FIN->ACK
ab
Apache的ab命令模拟多线程并发请求,测试服务器负载压力,也可以测试nginx、lighthttp、IIS等其它Web服务器的压力。 其中-n 总共的请求数、-c 并发的请求数。
ab -n 40 -c 20 http://127.0.0.1/
请求限制
模块:limit_req_zone
# 可以以IP为key zone为空间的名称 size为申请空间的大小
Syntax: limit_req_zone key zone=name:size rate=rate;
Default: --
Context: http(定义在server以外)
2
3
4
模块:limit_req
# zone名称 number限制的数量
Syntax: limit_req zone=name [burst=number] [nodelay];
Default: --
Context: http,server,location
2
3
4
案例
limit_req_zone $binary_remote_addr zone=req_zone:1m rate=1r/s;
server {
location /{
limit_req req_zone;
# 缓存区队列burst=3个,不延期,即每秒最多可处理rate+burst个.同时处理rate个
limit_req zone=req_zone burst=3 nodelay;
}
}
2
3
4
5
6
7
8
$binary_remote_addr 表示远程的IP地址
zone=req_zone:10m 表示一个内存区域大小为10m,并且设定了名称为req_zone
rate=1r/s 表示请求的速率是1秒1个请求
zone=req_zone 表示这个参数对应的全局设置就是req_zone的那个内存区域
burst=3 表示请求队列的长度
nodelay 表示不延时
连接限制
模块:limit_conn_zone
# 可以以IP为key zone为空间的名称 size为申请空间的大小
Syntax: limit_conn_zone key zone=name:size;
Default: --
Context: http(定义在server以外)
2
3
4
模块:limit_conn
# zone名称 number限制的数量
Syntax: limit_conn zone number;
Default: --
Context: http,server,location
2
3
4
案例
limit_conn_zone $binanry_remote_addr zone=conn_zone:1m;
server {
location /{
limit_conn conn_zone 1;
}
}
2
3
4
5
6
表明以ip为key,来限制每个ip访问文件时候,最多只能有一个在线,否则其余的都要返回不可用
- 访问控制
基于IP的访问控制 -http_access_module
基于用户的信任登录 -http_auth_basic_module
模块:http_access_module
Syntax: allow address|all;
Default: --
Context: http,server,location,limit_except
Syntax: deny address|CIDR|all;
Default: --
Context: http,server,location,limit_except
2
3
4
5
6
7
8
server {
+ location ~ ^/admin.html{
+ deny 192.171.207.100;
+ allow all;
+ }
}
server {
+ location ~ ^/admin.html{
+ if ($http_x_forwarded_for !~* "^8\.8\.8\.8") {
+ return 403;
+ }
}
2
3
4
5
6
7
8
9
10
11
12
13
符号 | 含义 |
---|---|
= | 严格匹配。如果这个查询匹配,那么将停止搜索并立即处理此请求。 |
~ | 为区分大小写匹配(可用正则表达式) |
!~ | 为区分大小写不匹配 |
~* | 为不区分大小写匹配(可用正则表达式) |
!~* | 为不区分大小写不匹配 |
^~ | 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式。 |
模块:http_auth_basic_module
Syntax: auth_basic string|off;
Default: auth_basic off;
Context: http,server,location,limit_except
Syntax: auth_basic_user_file file;
Default: -;
Context: http,server,location,limit_except
2
3
4
5
6
7
htpasswd -c /etc/nginx/users.conf zhangsan
server {
+ auth_basic '请登录';
+ auth_basic_user_file /etc/nginx/users.conf;
2
3
# 静态资源Web服务
静态资源:一般客户端发送请求到web服务器,web服务器从内存在取到相应的文件,返回给客户端,客户端解析并渲染显示出来。
动态资源:一般客户端请求的动态资源,先将请求交于web容器,web容器连接数据库,数据库处理数据之后,将内容交给web服务器,web服务器返回给客户端解析渲染处理。
类型 | 种类 |
---|---|
浏览器渲染 | HTML、CSS、JS |
图片 | JPEG、GIF、PNG |
视频 | FLV、MPEG |
下载文件 | Word、Excel |
# CDN
CDN的全称是Content Delivery Network,即内容分发网络。
CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。
# 配置语法
sendfile不经过用户内核发送文件
类型 | 种类 |
---|---|
语法 | sendfile on / off |
默认 | sendfile off; |
上下文 | http,server,location,if in location |
tcp_nopush 在sendfile开启的情况下,提高网络包的传输效率
类型 | 种类 |
---|---|
语法 | tcp_nopush on / off |
默认 | tcp_nopush off; |
上下文 | http,server,location |
tcp_nodelay 在keepalive连接下,提高网络包的传输实时性
类型 | 种类 |
---|---|
语法 | tcp_nodelay on / off |
默认 | tcp_nodelay on; |
上下文 | http,server,location |
gzip 压缩文件可以节约带宽和提高网络传输效率
类型 | 种类 |
---|---|
语法 | gzip on / off |
默认 | gzip off; |
上下文 | http,server,location |
gzip_comp_level 压缩比率越高,文件被压缩的体积越小
类型 | 种类 |
---|---|
语法 | gzip_comp_level level |
默认 | gzip_comp_level 1; |
上下文 | http,server,location |
gzip_http_version 压缩HTTP版本
类型 | 种类 |
---|---|
语法 | gzip_http_version 1.0/1.1 |
默认 | gzip_http_version 1.1; |
上下文 | http,server,location |
http_gzip-static_module 先找磁盘上找同名的.gz这个文件是否存在,节约CPU的压缩时间和性能损耗
类型 | 种类 |
---|---|
语法 | gzip_static on/off |
默认 | gzip_static off; |
上下文 | http,server,location |
location ~ .*\.(jpg|png|gif)$ {
gzip off;# 关闭压缩
root /data/www/images;
}
location ~ .*\.(html|js|css)$ {
gzip on; # 启用压缩
gzip_min_length 1k; # 只压缩超过1K的文件
gzip_http_version 1.1; # 启用gzip压缩所需的HTTP最低版本
gzip_comp_level 9; # 压缩级别,压缩比率越高,文件被压缩的体积越小
gzip_types text/css application/javascript;# 进行压缩的文件类型
root /data/www/html;
}
location ~ ^/download {
gzip_static on; # 启用压缩
tcp_nopush on; # 不要着急发,攒一波再发
root /data/www; # 注意此处目录是`/data/www`而不是`/data/www/download`
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 浏览器缓存
校验本地缓存是否过期
类型 | 种类 |
---|---|
检验是否过期 | Expires、Cache-Control(max-age) |
Etag | Etag |
Last-Modified | Last-Modified |
expires
添加Cache-Control、Expires头
类型 | 种类 |
---|---|
语法 | expires time |
默认 | expires off; |
上下文 http,server,location
location ~ .*\.(jpg|png|gif)$ {
expires 24h;
}
2
3
# 跨域
类型 | 种类 |
---|---|
语法 | add_header name value |
默认 | add_header --; |
上下文 | http,server,location |
location ~ .*\.json$ {
add_header Access-Control-Allow-Origin http://localhost:3000;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
root /data/json;
}
2
3
4
5
let xhr = new XMLHttpRequest();
xhr.open('GET', 'http://47.104.184.134/users.json', true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status == 200) {
console.log(xhr.responseText);
}
}
xhr.send();
2
3
4
5
6
7
8
# 防盗链
防止网站资源被盗用、保证信息安全、防止流量过量、区别哪些请求是非正常的用户请求
使用http_refer
防盗链
类型 | 种类 |
---|---|
语法 | valid_referers none block server_names string... |
默认 | - |
上下文 | server,location |
location ~ .*\.(jpg|png|gif)$ {
expires 1h;
gzip off;
gzip_http_version 1.1;
gzip_comp_level 3;
gzip_types image/jpeg image/png image/gif;
# none没有refer blocked非正式HTTP请求 特定IP
+ valid_referers none blocked 47.104.184.134;
+ if ($invalid_referer) { # 验证通过为0,不通过为1
+ return 403;
+ }
root /data/images;
}
2
3
4
5
6
7
8
9
10
11
12
13
-e, --referer Referer URL (H)
curl -e "http://www.baidu.com" http://192.171.207.104/girl.jpg
curl -e "192.171.207.100" http://192.171.207.104/girl.jpg
2
3
# 代理服务
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端.
反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端.
配置
类型 | 种类 |
---|---|
语法 | proxy_pass URL |
默认 | - |
上下文 | server,location |
反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的作用:
(1)保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
(2)负载均衡,通过反向代理服务器来优化网站的负载
resolver 8.8.8.8;# 谷歌的域名解析地址
location ~ ^/api {
# $http_host 要访问的主机名 $request_uri请求路径
proxy_pass http://127.0.0.1:3000;
}
2
3
4
5
按Win+R
系统热键打开运行窗口,输入ipconfig /flushdns
命令后按回车,就可以清空电脑的DNS缓存
正向代理
正向代理类似一个跳板机,代理访问外部资源。
正向代理的用途:
(1)访问原来无法访问的资源,如google
(2) 可以做缓存,加速访问资源
(3)对客户端访问授权,上网进行认证
(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
location / {
proxy_pass http://$http_host$request_uri;
}
2
3
# 负载均衡
使用集群是网站解决高并发、海量数据问题的常用手段。
当一台服务器的处理能力、存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求。
这种情况下,更恰当的做法是增加一台服务器分担原有服务器的访问及存储压力。通过负载均衡调度服务器,将来自浏览器的访问请求分发到应用服务器集群中的任何一台服务器上,如果有更多的用户,就在集群中加入更多的应用服务器,使应用服务器的负载压力不再成为整个网站的瓶颈。
upstream
nginx把请求转发到后台的一组upstream服务池
Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用。
- 轮询(weight)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。默认当weight不指定时,各服务器weight相同,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream bakend {
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=2;
}
2
3
4
- ip_hash
类型 | 种类 |
---|---|
语法 | upstream name {} |
默认 | - |
上下文 | http |
upstream mamingjuan {
ip_hash;
server localhost:3000;
server localhost:4000;
server localhost:5000;
}
server {
location / {
proxy_pass http://mamingjuan;
}
}
2
3
4
5
6
7
8
9
10
11
12
后端服务器调试状态
状态 | 描述 |
---|---|
down | 不参与负载均衡 |
backup | 备份的服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后,服务暂停的时间 |
max_conns | 限制最大的接收的连接数 |
upstream mamingjuan {
server localhost:3000 down;
server localhost:4000 backup;
server localhost:5000 max_fails=1 fail_timeout=10s;
}
2
3
4
5
分配方式
类型 | 种类 |
---|---|
轮询(默认) | 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 |
weight(加权轮询) | 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 |
ip_hash | 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 |
url_hash(第三方) | 按访问的URL地址来分配 请求,每个URL都定向到同一个后端 服务器上(缓存) |
fair(第三方) | 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 |
least_conn | 最小连接数,哪个连接少就分给谁 |
自定义hash | hash自定义key |
upstream mamingjuan{
ip_hash;
server 127.0.0.1:3000;
}
upstream mamingjuan{
least_conn;
server 127.0.0.1:3000;
}
upstream mamingjuan{
url_hash;
server 127.0.0.1:3000;
}
upstream mamingjuan{
fair;
server 127.0.0.1:3000;
}
upstream mamingjuan{
hash $request_uri;
server 127.0.0.1:3000;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 缓存
http{
# 缓存路径 目录层级 缓存空间名称和大小 失效时间为7天 最大容量为10g
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache:100m inactive=60m max_size=10g;
}
2
3
4
- proxy_cache_path 缓存文件路径
- levels 设置缓存文件目录层次;levels=1:2 表示两级目录
- keys_zone 设置缓存名字和共享内存大小
- inactive 在指定时间内没人访问则被删除
- max_size 最大缓存空间,如果缓存空间满,默认覆盖掉缓存时间最长的资源。
if ($request_uri ~ ^/cache/(login|logout)) {
set $nocache 1;
}
location / {
proxy_pass http://mamingjuan;
}
location ~ ^/cache/ {
proxy_cache cache;
proxy_cache_valid 200 206 304 301 302 60m; # 对哪些状态码缓存,过期时间为60分钟
proxy_cache_key $uri; # 缓存的维度
proxy_no_cache $nocache;
proxy_set_header Host $host:$server_port; # 设置头
proxy_set_header X-Real-IP $remote_addr; # 设置头
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置头
proxy_pass http://127.0.0.1:6000;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
- proxy_cache tmp-test 使用名为tmp-test的对应缓存配置
- proxy_cache_valid 200 206 304 301 302 10d; 对httpcode为200…的缓存10天
- proxy_cache_key $uri 定义缓存唯一key,通过唯一key来进行hash存取
- proxy_set_header 自定义http header头,用于发送给后端真实服务器。
- proxy_pass 指代理后转发的路径,注意是否需要最后的/
# rewrite
可以实现url重写及重定向。用途包括URL页面跳转、兼容旧版本、SEO优化(伪静态)、维护(后台维护、流量转发)、安全(伪静态)
语法 rewrite regex replacement [flag]
默认 -
上下文 server,location,if
2
3
解释:
regex 正则表达式指的是要被改写的路径
replacement 目标要替换成哪个URL
flag 标识
实战
rewrite ^(.*)$ /www/reparing.html break;
正则表达式就不在细讲了与javascript正则内容差不多。
if($http_user_agent ~ MSIE){
rewrite ^(.*)$ /msie/$1 break;
}
2
3
pcretest
wget https://ftp.pcre.org/pub/pcre/pcre-8.13.tar.gz
tar -xzvf pcre-8.13.tar.gz
cd pcre-8.13
./configure --enable-utf8
make
make install
pcretest
2
3
4
5
6
7
flag
标志位是标识规则对应的类型
flag | 含义 |
---|---|
last | 先匹配自己的location,然后通过rewrite规则新建一个请求再次请求服务端 |
break | 先匹配自己的location,然后生命周期会在当前的location结束,不再进行后续的匹配 |
redirect | 返回302昨时重定向,以后还会请求这个服务器 |
permanent | 返回301永久重定向,以后会直接请求永久重定向后的域名 |
location ~ ^/break {
rewrite ^/break /test break;
proxy_pass http://127.0.0.1:3000;
}
location ~ ^/last {
rewrite ^/last /test last;
}
location /test {
default_type application/json;
return 200 '{"code":0,"msg":"success"}';
}
curl -vL http://192.168.20.150/redirect
location ~ ^/redirect {
rewrite ^/redirect http://www.baidu.com redirect;
rewrite ^/redirect http://www.baidu.com permanent;
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
rewrite优先级
- 先执行server中的rewrite指令
- 执行location匹配
- 再执行location中的rewrite
location中的优先级
- 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
- ^~类型表达式。一旦匹配成功,则不再查找其他匹配项。
- 正则表达式类型(~ ~*)的优先级次之。如果有多个location的正则能匹配的话,则使用正则表达式最长的那个。
- 常规字符串匹配类型按前缀匹配