Nginx介绍
Ngin(engine x)是一个高性能的HTPP和反向代理服务,也是一个IMAP/POP3/SMTP服务。
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx的网站有很多,比如京东、百度、淘宝、腾讯等。
Nginx的特点
高并发量:基于epoll/kqueue模型开发,支持高并发量,官方说其支持高达5w并发连接数的响应。
内存消耗少:善于处理静态文件,相较于其他web(如:apche),占用更少的内存及其资源。
简单稳定:配置简单(一个conf文件),运行简单(nginx命令),而且运行起来稳定。
模块化程度高:功能模块插件化设计,可以自由配置相应的功能。
支持Rwrite重写规则:能够根据域名、URL等请求关键点,实现定制化的高质量分发。
低成本:Nginx的负载均衡功能很强大而且免费开源,相较于几十万的硬件负载均衡器成本相当低。
支持多系统:Nginx代码完全用C语言从头协程,可以在各个系统上编译并使用。
动态处理能力差:Nginx善于处理静态文件,但是处理动态页面的能力相较于Apache之类的重量级web软件能力稍差。
rewrite弱:虽然nginx支持rewrite功能多,但是相较于Apache之类的重量级的web软件能力稍差。
Nginx配置
安装目录简介
路径 | 介绍 |
---|---|
/etc/nginx/ | root家目录 |
/etc/nginx/nginx.conf | Nginx 主配置文件Nginx 启动时会读取 nginx.conf文件 |
/var/log/nginx | 日志目录 |
/var/www/html | 默认网站目录 |
配置信息简介
指令 | 说明 |
---|---|
main | nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。 |
http | 与提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。 |
server | http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置。在提供mail服务的代理时,也可以建立若干server.每个server通过监听的地址来区分。 |
location | http服务中,某些特定的URL对应的一系列配置项。 |
实现email相关的SMTP/IMAP/POP3代理时,共享的一些配置项(因为可能实现多个代理,工作在多个监听地址上)。 |
例如:
user wangtt;
worker_processes 1 ; # 子进程 工作进程和cpu核数一致或者是它的倍数
error_log logs/error.log info;
events{
worker_connections 1024; # 连接数 并发量=进程数*连接数
}
http{
server{
listen 80; # 监听端口
server_name www.csdn.cn; # 域名
access_log logs/androidj.access.log main;
location / {
index index.html;
root /home/python/Desktop/WTT;
}
}
}
mail {
auth_http 127.0.0.1:80/auth.php;
pop3_capabilities "TOP" "USER";
imap_capabilities "IMAP4rev1" "UIDPLUS";
server {
listen 110;
protocol pop3;
proxy on;
}
server {
listen 25;
protocol smtp;
proxy on;
smtp_auth login plain;
xclient off;
}
}
全局配置段
主要是全局性的和服务级别的属性配置,常见的主要有以下几种设置
配置选项 | 说明 |
---|---|
user | 设置使用用户 |
worker_processed | 进行增大并发连接数的处理 跟cpu保持一致 八核设置八个 |
error_log | nginx的错误日志 |
pid | 服务启动时候的pid |
events | 定义事件相关的属性 |
-------------- worker_connections | 一个进程允许处理的最大连接数 |
--------------- user | 定义使用的内核模型 |
http配置段
配置选项 | 说明 |
---|---|
include mime.types | 文件扩展名与文件类型映射表 |
default_type application/octet-stream | 默认文件类型 |
sendfile on | 开启高效文件传输模型 |
autoindex on | 开启目录列表访问,合适下载服务器,默认关闭 |
tcp_onpush on | 防止网络阻塞 |
tcp_nodelay on | 防止网络阻塞 |
keepalive_timeout 120 | 长连接超时时间,单位是秒 |
gzip on | 开启gzip压缩输出 |
Server常见配置属性
server{
server_name www.m3guo.com;
listen 8080;
root /home/python/Desktop/wtt;
index index.html default.html;
}
server配置段最重要的属性是listen和server_name。都是用于匹配并处理请求的。
listen属性
作用:定义Server监听的ip和port,当ip/port匹配时候才进行下一步匹配
表现形式:
形式 | 描述 | 示例 | 完整示例 |
---|---|---|---|
IP:Port | 地址精确表示样式 | listen 10.10.10.10:99 | listen 10.10.10.10:99 |
IP | 自动监听IP:80地址 | listen 10.10.10.10 | listen 10.10.10.10:80 |
Port | 自动监听全地址:Port | listen 99或[::]:99 | listen 0.0.0.0:99 |
default_server | 自动使用默认的地址 | listen default_server | listen localhost:80 |
使用原则:
首先将所有样式补全成IP:Port,然后匹配,匹配Server多,那么接着使用Server_name匹配
server_name属性
作用:定义Server监听的域名,当域名匹配时候才进行下一步操作
表现形式:
格式 | 完整样式 | 前缀正则样式 | 后缀正则样式 | 禁止非法域名或IP |
---|---|---|---|---|
形式 | www.example.com | *.example.com | www.example.* | _ |
使用原则:
优先使用完整样式,然后使用前缀正则样式,最后使用后缀正则样式,如果正则样式相同的时候,匹配最长,否则就走非法规则。
非法域名/IP,表示请求到该主机上一个不存在的IP或者域名
root属性
作用:定义Server相应请求的html文件所在路径
表现形式:
root /var/www/html;
index属性
作用:定义响应请求后返回的文件名称或格式
表现形式:
index index.html index.htm index.nginx-debian.html;
实例–基于域名的虚拟主机
1.在/etc/nginx/sites-enabled
目录下创建server配置文件
server{
listen 8001; # 监听端口
server_name www.m3guo.com; # 匹配域名
root /var/www/wtt; # 根路径
index index.html; # 默认显示页面
}
2.修改 /etc/hosts/文件。
127.0.0.1 www.m3guo.com
3.检查nginx配置后重启服务
sudo nginx -t
sudo nginx -s -reload
4.测试:在浏览器输入:www.m3guo.com:8001。
location常见配置属性
location主要是根据Server匹配到的请求路径和关键字去响应和处理。
语法:
location optional_modifier location_match { ... }
其中:optional_modifier是匹配条件,location_match是匹配的样式,{}是要执行的操作。匹配条件主要有两种:正则/前缀字符。
匹配规则
普通匹配
类型 | 含义 | 匹配方式 | 优先级 | 样式 |
---|---|---|---|---|
=/路径 | 精确匹配 | 前缀 | 1 | location = /image {} |
^~ | 优先匹配 | 前缀 | 2 | location ^~ /page {} |
@ | 内部重定向 | 前缀 | location @name {} | |
空/ | 通用匹配 | 前缀 | 4 | location / {} |
使用原则:
前提:根据请求url,获取uri即除了域名/IP之外的部分,用于location匹配
-
如果有精确匹配,即=/路径,找到匹配项后,结束匹配。
location =路径{} 或者 location完整路径{}
-
如果有优先匹配,即^~,找到匹配项后,结束匹配。
location ^~路径
-
如果有正则匹配,即|!|*|!*,找到匹配项后,不会终止继续匹配,直到找到合适的
location ~\*正则字符{}
-
如果匹配到多个,则使用location_match最长的。
匹配示例
常见示例:
location = / { location ~ \.(gif|jpg|png|js|css)$ { location !~* \.xhtml$ {
#精确规则A #正则规则D #正则规则G
}
location = /login { location ~* \.png$ { location / {
#精确规则B #正则规则E #通用规则H
} }
location ^~ /static/ { location !~ \.xhtml$ {
#优先规则C #正则规则F
} }
访问效果如下:
- 访问根目录/, 比如a.com/ 将匹配规则A
- 访问 a.com/login 将匹配规则B
- 访问 a.com/static/a.html 将匹配规则C
- 访问 a.com/a.gif, a.com/b.png 规则D和E均适合,按顺序优先使用规则D,而 a.com/static/c.png 则优先匹配到规则C
- 访问 a.com/a.PNG 则匹配规则E,因为规则E不区分大小写。
- 访问 a.com/a.XHTML 使用规则F。
- 访问 a.com/category/id/1111 则最终匹配到规则H。
location常见动作
在location内部常用的功能属性非常多,常见的基本属性、临时跳转、访问控制、目录列表等。
-
基本属性
location / { root /home/python/Desktop/Wtt # 指定响应请求文件所在的路径 index index.html # 指定响应请求的默认文件名称 expires 8d # 指定响应请求的文件过期时间,多用于静态文件 try_files $uri $uri/ =404; # 如果root指定的路径下有查找文件,就返回,否则报错。 }
-
临时跳转
location = /test/{ return 302 http://www.m3guo.com/; # 访问旧的url时候,临时跳转到新url,两个url均不会失效。 }
-
目录列表
server{ listen 50001; server_name www.m3guo.com; location / { root /home/python/Desktop/WTT; index index.html; autoindex on; # 开启目录自动索引 autoindex_exact_size off; 显示文件确切大小(bytes),off表示显示文件的大概大小(kB/MB..) autoindex_localtime on;显示文件的时间为GMT时间,on 表示显示服务器的时间 } }
root 和 alias
root和alias所起的作用是一样的,都是指定响应请求所用文件的路径,只是他们有些许的区别。
root表示location匹配内容的相对路径
alias表示绝对路径,而且必须以"/"结尾,否则的话会找不到文件
例如:
在 /home/python/Desktop 创建root配置文件
server{
listen 50002;
server_name www.m3guo.com;
location /root/ {
root /home/python/Desktop/OK;
}
}
在 /home/python/Desktop 创建alias配置文件
server{
listen 50003;
server_name www.m3guo.com;
location /root/ {
root /home/python/Desktop/OK/;
}
}
此时www.m3guo.com:50002 访问的路径则是 /home/python/Desktop/OK/root/index.html
而www.m3guo.com:50003 访问的路径则是 /home/python/Desktop/OK/index.html
Nginx代理
代理就是指代理服务器(Proxy Server),是一种重要的服务器安全功能。其功能就是代理网络用户去获得网络信息。就是网络信息的一个中转站。
在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。
代理一般分为两种:正向代理、反向代理
正向代理
我们首先请求代理服务器,然后代理服务器帮我们去快速访问网站,对于这种代理方式,我们就称之为正向代理,我们被称为被代理者,也就是浏览器这个角色。正向代理的本质是我们去请求外部的资源,如果以生产者、消费者模式来区分,我们属于消费者。
总结:
1.正向代理,我们的角色是 被代理者
2.正向代理,我们不对外提供服务,反而是对外消费服务,属于消费者。
反向代理
公司拥有自己的IDC机房,机房通讯通常采用局域网交互及,Internet网用户请求是无法直接访问到局域网内的web服务的,这时候,需要一台反向代理服务器来接受Interner web请求,然后将请求分发到局域网中的不同主机上进行处理,处理完成后再做出响应。因此,反向代理中,我们的角色是局域网web服务。
总结:
1.反向代理,我们的角色是局域网web服务
2.反向代理,我们对外提供服务,属于服务提供者
正向代理和反向代理的区别
从用途上来讲:
正向代理-为局域网客户端向外访问Internet服务。可以使用缓冲特性减少网络使用率。
反向代理-为局域网服务器向外提供Internet服务。可以使用负载平衡提高客户访问量。还可以基于高级URL策略和管理技术对服务进行高质量管控。
从安全性来讲:
正向代理-必须采取安全措施确保内网客户端通过它访问外部网站。隐藏客户端的身份
反向代理-对外提供服务是透明的,客户端并不知道自己访问的是一个代理。隐藏服务端的身份
Nginx反向代理的配置
官方代码实例:
location / {
proxy_pass http://localhost:8000; 设定请求跳转后的地址,可以使用hostname或IP:Port形式
proxy_set_header X-Real-IP $remote_addr; 后端请求携带原始请求的真实IP地址
}
属性详解:
proxy_pass指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式
proxy_set_header 该指令允许重新定义和添加一些请求标题行,这些标题行将被传输到代理服务器
Nginx反向代理实践
首先需要准备一个简单的项目工程
django-admin startproject a1
修改工程中的settings.py文件的allowed_hosts
ALLOWED_HOSTS = ["*"]
执行命令运行工程
python manage.py runserver 192.168.119.128:8000
反向代理的配置
server{
listen 8002;
server_name 192.168.119.128;
location / {
proxy_pass http://192.168.119.128:8000/;
}
}
检查nginx配置后重启服务
sudo nginx -t
sudo nginx -s reload
查看效果
在浏览器输入192.168.119.128:8002的时候会跳转到192.168.119.128:8000这个反向代理服务上。
负载均衡
当一台服务器的性能达到极限的时候,我们可以使用服务器集群来提高网络的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配某一台后端服务器去处理。
那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能发挥到极致,从而保证服务器集群的整体性能最优,这就是负载均衡问题。
nginx upstream模块
官方实例代码:
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
属性详解:
upstream 主要是定义一个后端服务地址的集合列表,每个后端服务使用一个server命令表示
upstream {} 和 Server {} 两部分内容属于平级关系。
后端服务状态
在upstream模块中,可以使用server命令指定后端服务器的地址,同时还可以设置后端服务器在负载均衡调度中的状态,常用的状态有以下几种:
- down: 表示当前server主机暂时不参与负载均衡。
- backup:后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器。
- max_fails:允许请求的最大失败数,默认为1,配合fail_timeout一起使用
- fail_timeout:经历max_fails次失败后,暂停服务的时间,默认为10s。
负载均衡调度算法
Nginx提供的负载均衡策略有两种:
内置策略:nginx自带的算法
- 雨露均沾型:轮训、加权轮训、哈希
- 定向服务型:ip_hash、least_conn、cookie、route、lean、
- 商业类型:ntlm、least_time、queue、stick
扩展策略:各种结合业务场景自定义的算法或者第三方算法
- 自定义算法
- 第三方算法:fair、url_hash
常用算法简介:
- 轮询(默认):请求按顺序逐一分配到不同的后端服务器。
- weight:指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况。
- ip_hash:按访问IP的哈希结果分配请求,分配后访客访问固定后端服务器,有效的解决动态网页会话共享问题。
- fair:基于后端服务器的响应时间来分配请求,响应时间短的优先分配。
- url_hash:按访问URL的哈希结果分配请求,使同URL定向到同一台后端服务器,可提高后端缓存服务器的效率。
加权轮训实践
修改负载均衡配置文件
#负载均衡
upstream backends {
server 192.168.229.128:10086 backup; #后备主机,当所有非backup机器出现故障或者繁忙的时候,才会请求backup机器
server 192.168.229.128:10087 weight=1; #指定轮询权重,值越大,分配到的几率就越高,适用于后端服务器性能不均衡情况
server 192.168.229.128:10088 weight=2;
}
server {
#监听的端口号
listen 9001;
#服务器
server_name 192.168.229.128;
location / {
#指向代理
proxy_pass http://backends/;
}
}
ip_hash实践
修改负载均衡配置文件
#负载均衡
upstream backends {
ip_hash;
server 192.168.229.128:10086 ;
server 192.168.229.128:10087 ;
server 192.168.229.128:10088 ;
}
server {
#监听的端口号
listen 9001;
#服务器
server_name 192.168.229.128;
location / {
#指向代理
proxy_pass http://backends/;
}
}
日志功能
日志简介
Nginx默认提供了两个日志文件 access.log和error.log,通过access.log可以得到用户请求的相关信息;通过error.log可以获取某个web服务故障或其性能瓶颈等信息。
而且nginx的日志支持定制化格式,这样我们就可以根据实际的业务情况更好的高效工作。最常见的场景就是获取客户端的IP,记录用户访问量。
基本配置
查看 /etc/nginx/nginx.conf
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
日志样式
默认日志格式
log_format combined '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
效果
python@ubuntu:/etc/nginx$ tail /var/log/nginx/access.log
192.168.229.128 - - [06/Mar/2018:21:06:14 +0800] "GET / HTTP/1.1" 200 13 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
192.168.229.128 - - [06/Mar/2018:21:16:46 +0800] "GET / HTTP/1.1" 200 13 "-" "Mozilla/
nginx常用内置变量
nginx常用的内置变量主要是用来分析日志中的http记录的,我们可以根据内置的变量精确的获取相关的信息
默认变量
$remote_addr | 客户端的ip地址(代理服务器,显示代理服务ip) |
---|---|
$remote_user | 用于记录远程客户端的用户名称(一般为“-”) |
$time_local | 用于记录访问时间和时区 |
$request | 用于记录请求的url以及请求方法 |
$status | 响应状态码,例如:200成功、404页面找不到等。 |
$body_bytes_sent | 给客户端发送的文件主体内容字节数 |
$http_user_agent | 用户所使用的代理(一般为浏览器) |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_referer | 可以记录用户是从哪个链接访问过来的 |
其他常用变量
$request_uri | 包含请求参数的原始URI,不包含主机名 |
---|---|
$uri | 不带请求参数的当前URI,不包含主机名 |
$http_x_forwarded_for | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$http_x_real_ip | 可以记录客户端IP,通过代理服务器来记录客户端的ip地址 |
$args | 这个变量等于请求行中的参数,同$query_string |
$host | 请求主机头字段,否则为服务器名称。 |
$scheme | HTTP方法(如http,https) |
$document_uri | 与$uri相同 |
示例:
例:http://localhost:12580/index.html
$host localhost
$server_port 10086
$request_uri /index.html
$document_uri /index.html
$document_root /var/www/html
$request_filename /var/www/html/index.html