1. nginx的安装
2. nginx的特点
2.1 nginx正向代理与反向代理
正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚具体来自哪个客户端。正向代理模式屏蔽或隐藏了真实的客户端信息。
正向代理反向代理主要用于服务器集群分布式部署的情况,隐藏服务器的信息。nginx服务器收到请求后,按照一定的规则分发给后端的业务服务器进行处理。请求来源也就是客户端是明确的,但是请求具体由那台服务器处理是不明确的。
反向代理举例说明:面试官(服务器),HR小姐姐(代理服务器),领导(反向代理),应聘者(客户端)。
正向代理:我想来贵公司面试,只能给HR小姐姐发送简历。HR小姐姐就像一个正向代理。
反向代理:我过来面试后,HR小姐姐通知领导后,领导安排一个面试官。领导就像一个反向代理。
2.2 负载均衡
我们理解了代理服务器的概念,那么,nginx扮演了反向代理的角色,它是依靠什么样的规则进行请求分发呢?
负载均衡策略-
weight轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,nginx会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。 这种方式下,可以给不同的后端服务器设置一个权重值(weight
温特
),用于调整不同的服务器上请求的分配率;权重数据越大,被分配到请求的几率越大;该权重值,主要是针对实际工作环境中不同的后端服务器硬件配置进行调整的。 -
ip_hash:每个请求按照发起客户端的ip的hash结果进行匹配,这样的算法下一个固定ip地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下session共享的问题。
-
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是nginx默认不支持fair
烦儿
算法,如果要使用这种调度算法,请安装upstream_fair模块 -
url_hash:按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包
3. Nginx的配置
nginx的配置主要集中在nginx.conf这个配置文件中,并且所有的配置选项大概可以分为以下几个部分。
main # 全局配置
events { # nginx工作模式配置
}
http { # http设置
....
server { # 服务器主机配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
如上述配置文件,主要由6部分组成
- main:主要进行nginx全局信息的配置;
- events:用于nginx工作模式的配置;
- http:用于进行http协议的信息;
3.1 server:用于进行服务器访问信息的配置;
3.1.1 location:(定位)用于进行访问路由的配置;
3.2 upstream:(上游)用于进行负载均衡的配置;
3.1 main模块
# 定义Nginx运行的用户和用户组,默认nobody账号运行。
# user nobody nobody;
#nginx进程数,建议设置为等于CPU总核心数
worker_processes 2;
# 定义错误日志文件的位置及输出级别【debug / info / notice / warn / error / crit】
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
#用于指定进程id的存储文件的位置。
# pid logs/nginx.pid
#worker_rlimit_nofile: 用于指定一个进程可以打开最多文件数量的描述。
worker_rlimit_nofile 1024;
3.2 event模块
event {
#worker_connections是单个后台worker process进程的最大并发链接数,并发总数是 worker_processes 和 worker_connections 的乘积, 即 max_clients = worker_processes * worker_connections
worker_connections 1024;
#指定nginx在收到一个新连接通知后尽可能多的接受更多的连接。
multi_accept on;
#use epoll:配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使用Kqueue。
use epoll;
}
3.3 http模块
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的。常规请求下,使用默认配置即可。
http {
##
# 基础配置
##
# 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来 输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置 为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常 把这个改成off。
sendfile on;
#让nginx在一个数据包中发送所有的头文件,而不是一个一个单独发
tcp_nopush on;
# 让nginx不要缓存数据,而是一段一段发送,如果数据的传输有实时性的要求的话可以配置它,发送完一小段数据就立刻能得到返回值,但是不要滥用哦
tcp_nodelay on;
# 长连接超时时间,单位是秒
keepalive_timeout 65;
#混淆数据,影响三列冲突率,值越大消耗内存越多,散列key冲突率会降低,检索速度更快;值越小key,占用内存较少,冲突率越高,检索速度变慢
types_hash_max_size 2048;
#虽然不会让nginx执行速度更快,但是可以在错误页面关闭nginx版本提示,对于网站安全性的提升有好处哦
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
#指定在当前文件中包含另一个文件的指令
include /etc/nginx/mime.types;
#指定默认处理的文件类型可以是二进制
default_type application/octet-stream;
##
# SSL证书配置
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# 日志配置
##
#设置存储访问记录的日志
access_log /var/log/nginx/access.log;
#设置存储记录错误发生的日志
error_log /var/log/nginx/error.log;
##
# Gzip 压缩配置
##
#是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。
gzip on;
#为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript
text/xml application/xml application/xml+rss text/javascript;
##
# 虚拟主机配置
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
3.3.1 http模块下的server模块
虚拟主机的定义server模块配置是http模块的一个子模块,用来定义一个虚拟访问主机,也就是一个虚拟服务器的配置信息。
server {
#可匹配虚拟主机的ip+端口
listen 80;
#用于指定ip地址或域名,多个配置之间用空格分隔。
server_name localhost 192.168.1.100;
#表示整个server虚拟主机内的根目录,所有当前主机中web项目的根目录
root /nginx/www;
#用户访问web网站时的全局首页
index index.php index.html index.html;
#用于设置www/路径中配置的网页的默认编码格式
charset utf-8;
#用于指定该虚拟主机服务器中的访问记录日志存放路径
access_log logs/access.log;
# 用于指定该虚拟主机服务器中访问错误日志的存放路径
error_log logs/error.log;
......
}
Nginx在决定请求由哪个server块执行时,主要关注的是server块中的listener和server_name字段。
listener指令
listener字段定义server响应ip和端口如果没有明确配置listen字段,默认监听0.0.0.0:80(root)或者0.0.0.0:8080(非root)。
listener可以配置为:
-
一个ip和端口的组合
-
一个单独的ip,默认监听80端口
-
一个单独的端口,默认监听所有的ip接口
-
一个Unix socket路径
只要当listen指令无法找到最佳匹配时才会考虑评估server_name参数。即通过listen配置,找到多个server块。
多个listen匹配时,将使用server_name进行进一步的精确匹配server_name指令
如果根据listener指令无法得到最佳匹配,将开始解析server_name指令。nginx将会检查请求中的“Host”头,这个值包含了客户端试图请求的域名或者ip地址。nginx会根据这个值去匹配server_name指令。
3.3.1.1 server模块下的location模块
location模块是nginx配置出现最多的一个配置,主要用于配置路由访问信息。
基本配置
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ { //以xx开头
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { //以xx结尾
root /webroot/res/;
}
#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
location / {
proxy_pass http://backend; #反向代理地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
3.3.2 http模块下的upstream模块
upstream模块主要负责负载均衡的配置,通过默认的轮询调度方式来分发请求到后端服务器。
upstream backend{
#ip_hash:指定请求调度算法,默认是weight权重轮询调度,可以指定
ip_hash;
#server host:port:分发服务器的列表配置
server 192.168.1.100:8000;
# down 表示该主机暂停服务
server 192.168.1.100:8001 down;
# max_fails:表示失败最大次数,超过失败最大次数暂停服务
server 192.168.1.100:8002 max_fails=3;
# fail_timeout:表示如果请求受理失败,暂停指定的时间之后重新发起请求
server 192.168.1.100:8003 fail_timeout=20s;
server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
}
4. nginx整体流程
image.png- 用户请求到达nginx服务器后,根据serve的listen和server_name找到具体的虚拟访问主机。
- 根据url的不同,找到server模块中的location。
- 根据location模块中的proxy_pass(反向代理配置),找到具体的upstream。
- 根据upstream的负载策略,直接请求到相应的服务器地址。
5. 遇到的问题以及处理方案
Nginx报502错误,日志connect() failed (111: Connection refused) while connecting to upstream的最终完美有效解决方案
网友评论