nginx介绍
# nginx
Nginx是一款轻量级的Web服务器、反向代理服务器,由于它的内存占用少,启动快,高并发能力强,在互联网项目中广泛应用。
# 正向代理
我们经常使用得vpn就是正向代理。由于防火墙,我们不能直接访问外网,需要先配置代理服务器,把请求发送到代理服务器,代理服务器帮助我们把请求发送到对应得服务器,再把接受到得请求返回给客户端。正向代理代理的是客户端,客户端是知道目标服务器得,而目标服务器并不知道请求是通过代理后访问的。
# 反向代理
客户端不需要任何配置,只需要讲请求发送到反向代理服务器,反向代理服务器会根据请求选择目标服务器,获得数据后再返回客户端。反向代理,代理的是服务端,对于客户端来说,它只知道代理服务器地址,具体是哪个服务返回请求它不知道。
# nginx的工作原理
nginx有一个主进程(master)和几个工作进程(worker)。主进程的主要目的是读取和执行配置,以及维护工作进程。工作进程实际处理请求。nginx采用基于事件的模型和依赖于操作系统的机制来高效地在工作进程之间分发请求。工作进程的数量在配置文件中定义,对于给定的配置可以是固定的,也可以自动调整到可用CPU内核的数量。
nginx及其模块的工作方式在配置文件中进行配置确定。缺省情况下,配置文件名为nginx.conf,然后放在/usr/local/nginx/conf
、/etc/nginx
或/usr/local/nginx
.目录下。
# 安装nginx
本文采用docker来安装nginx,如果需要本地安装参考官方文档 (opens new window)
# 配置文件结构
Nginx由模块组成,这些模块由配置文件中指定的指令控制。指令分为简单指令和块指令。一个简单的指令由名称和参数组成,用空格隔开,以分号(;)结束。块指令与简单指令具有相同的结构,但它以一组由大括号({和})包围的额外指令组成。如果一个块指令可以在大括号内包含其他指令,则称为上下文。放在任何上下文之外的配置文件中的指令被认为是在主上下文中。
events
和http
指令在主上下文中,server
在http
中,location
在server
中。#
后面是注释。
下面是一个基本案例:
# 运行用户
user nginx;
# 启动进程数量,auto表示自动策略,一般设置为cpu核心的个数准没错
worker_processes auto;
# 全局错误日志
error_log /var/log/nginx/error.log notice;
# pid文件
pid /var/run/nginx.pid;
# 事件模块
# 配置工作模式,连接上限等
events {
#单个后台worker process进程的最大并发链接数
worker_connections 1024;
}
# http服务器配置
http {
#设定响应的mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
# 默认响应mime类型
default_type application/octet-stream;
# 设置日志格式
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 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
#对于普通应用,必须设为 on,
#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,
#以平衡磁盘与网络I/O处理速度,降低系统的uptime.
#tcp_nopush on;
# 连接超时时间
keepalive_timeout 65;
#gzip on;
# 序列主机配置
server {
# 监听 80端口
listen 80;
# 定义主机名称,与监听端口一起决定是否接受一个http请求
server_name localhost;
# 默认请求
location / {
# 默认请求网站的根目录位置
root /usr/share/nginx/html;
# 定义首页搜索文件的名称
index index.html index.htm;
}
# 定义错误提示页 表示500,502 503 504错误时显示对应的错误页
error_page 500 502 503 504 /50x.html;
# 定义错误页的路径
location = /50x.html {
root /usr/share/nginx/html;
}
}
}
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# 主模块
配置文件的最外层是配置主模块,这里控制的是Nginx的基本功能。
具体配置项见文档 (opens new window)
# 事件模块
nginx的工作进程是基于事件的,在配置文件的events
块中配置nginx工作进程的事件工作模式。
具体配置项见文档 (opens new window)
# http模块
http模块用来配置nginx如何处理http请求的。
具体配置项见文档 (opens new window)
# 常用配置指令详解
# listen
listen指令指定接受请求的地址和端口。
它可以是一个地址,一个端口或者服务器名。
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
2
3
4
5
IPv6地址(0.7.36)用方括号表示:
listen [::]:8000;
listen [fe80::1];
2
# server_name
这个指令的值会检测请求中的Host头,然后选择第一个匹配的虚拟主机。这就是虚拟服务器的定义方式。服务器名称的处理顺序如下:
- 完整的,静态的名字
- 名称开头带有通配符的名称- *.example.com
- 名称末尾带有通配符的名称- www.example.*
- 带有正则表达式的名称
如果没有server_name匹配,则按照下面的顺序选择虚拟主机
- listen匹配且标记了default的虚拟主机
- 第一个匹配listen的虚拟主机
例子:
server {
server_name example.com www.example.com;
}
2
3
第一个名称成为服务器的基本名称。可以使用“*”来替换名称的第一部分或最后一部分:
server {
server_name example.com *.example.com www.example.*;
}
2
3
也可以在服务器名称中使用正则表达式,在名称前面加上波浪号“~”,像这样:
server {
server_name www.example.com ~^www\d+\.example\.com$;
}
2
3
4
listen和server_name指令是虚拟主机必须的最小化配置,它们一起组合,告诉nginx到来的请求应该交给哪个虚拟服务器进行处理。
# location
这个指令允许根据URI进行不同的配置。它指定匹配的请求执行对应的动作。
可以使用字面值字符串和正则表达式来配置它。要使用正则表达式,必须使用a前缀:
~*
大小写不敏感~
大小写敏感
nginx首先检查精确匹配,然后常规字符串匹配,然后再按配置的正则表达式先后顺序匹配。
例如:
location = / {
# 仅匹配查询 /
[ configuration A ]
}
location / {
# 匹配任何查询,因为所有查询都以/开头, 但是正则表达式和任何更长的常规块将首先匹配
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以/images/开头的查询,并停止搜索,
# 因此正则表达式不会被检查。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以gif、jpg或jpeg结尾的任何请求。 然而,所有对/images/目录的请求都将由Configuration C处理。
[ configuration D ]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
所以下面的请求分别指向对应的配置:
/
-> configuration A/documents/document.html
- > configuration B/images/1.gif
-> configuration C/documents/1.jpg
-> configuration D
请注意,您可以以任何顺序定义这4个配置,结果将保持相同。虽然配置文件解析器允许嵌套位置,但不鼓励使用它们,可能会产生意想不到的结果。
# alias
这个指令指定一个用于指定位置的路径。注意,它可能看起来类似于root指令,但是文档根目录不会改变,仅用于请求的文件系统路径。
例如:
location /i/ {
alias /spool/w3/images/;
}
2
3
请求“/i/top.gif”将返回文件“/spool/w3/images/top.gif”。
# root
root指令设置请求的根目录,允许nginx将传入请求映射到文件系统。
例如:
location /i/ {
root /spool/w3;
}
2
3
请求"/i/top.gif"将返回文件"/spool/w3/i/top.gif"。注意:root指令仍然会将目录添加到请求中,所以请求"/i/top.gif"不会去里"/spool/w3/top.gif"查找。
# try_files
这个指令告诉Nginx测试每个文件是否存在,并使用第一个找到的文件作为URI。
例如:
location / {
try_files index.html index.htm @fallback;
}
location @fallback {
root /var/www/error;
index index.html;
}
2
3
4
5
6
7
8
9
请求/
会依次测试index.html,index.htm
是否存在,如果不存在则调用@fallback
。这里的fallback可以是任意名称,它可以是一个命名的location,也可以是任意确保的URI。
# 配置案例
docker run --name=mynginx -d --network=host -v /root/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v/root/nginx/html:/usr/share/nginx/html nginx:alpine
# 两个静态文件服务
http{
server {
listen 80;
server_name www.domain1.com;
location / {
index index.html;
root /var/www/domain1.com/htdocs;
}
}
server {
listen 80;
server_name www.domain2.com;
location / {
index index.html;
root /var/www/domain2.com/htdocs;
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
域名www.domain1.com的请求将会返回/var/www/domain1.com/htdocs
里的静态文件。
域名www.domain2.com的请求将会返回/var/www/domain2.com/htdocs
里的静态文件。
本文完,感谢你的耐心阅读,如有需要可加我微信,备注「博客」并说明原因,我们一起进步,下次见。
