Nginx
Nginx常用功能
- Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。Nginx可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。并且Nginx对返回结果进行错误页跳转,异常判断等。如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
- 负载均衡
Nginx提供的负载均衡策略有2种:内置策略和扩展策略。内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。
Nginx配置文件结构
看一下nginx的默认配置
user www-data;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# 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 Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
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;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
嵌入其他配置文件
这个点是我一开始掉坑的地方,因为需求来了直接上手看的nginx,但是一直在默认配置中找不到已经上线的应用配置,最后才了解到include嵌入其他的配置文件了,最后根据嵌入文件的路径成功地找到了引入的配置文件,正是我想要的
Nginx worker进程运行的用户及用户组
默认 user nobody nobody;
user用于设置master进程启动之后,fork出的worker进程运行在哪个用户和用户组下
Nginx worker进程个数
在master/worker运行方式下指定worker进程的个数
worker进程的数量会直接影响性能,每个worker进程都是单线程的进程,它们会调用各模块以实现多种多样的功能,如果这些模块确定不会出现阻塞时的调用,那么有多少CPU内核就应该配置多少个进程;反之,如果可能存在多个可能阻塞的调用,则需要多为worker分配一些进程
- 例如磁盘IO一直是后端服务的一个瓶颈,如果分配的worker进程都是在执行阻塞式的IO服务,那么这个时候Nginx的效率可能会大大降低,这个时候就需要为Nginx多分配一点工作进程
- 多worker进程可以充分利用多核的系统架构,但若worker进程的数量多于CPU内核数的话,这样同样会增大进程之间来回切换造成的消耗(Linux是抢占式内核),一般情况下与内核相等的worker进程,就可以绑定到CPU内核上
虚拟主机与请求分发
由于IP地址数量有限,一次你经常存在多个诸暨域名对应同一个IP地址情况,这时在nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是个虚拟主机,他只处理与之相对应的主机域名请求
主机名称
server_name后可以跟多个主机名称,在开始处理一个HTTP请求时,Nginx会取出header中的Host,与每个server中的server_name进行匹配,决定到哪个server块来处理这个请求,匹配规则也是有优先级的①首先选择所有字符串都完全匹配的server_name②其次选择通配符在前的③选择通配符在后的④最后选择正则表达式匹配的
location
location会尝试根据用户请求中的URI来匹配/uri表达式,如果可以匹配,就会选择这个location块中的配置来处理用户请求
文件路径的定义
以root方式设置资源路径比如说一条HTPP请求是一条请求资源的请求,这个时候就可以使用server和location匹配到这一条资源请求,并且使用root指定这条资源请求的目录,实现资源访问,同样实现资源文件的访问还可以在location匹配到url请求之后使用alias,这两者间的配置有一些小的差别
一个用户如果通过一条HTTP请求需要访问到/user/local/nginx/conf/nginx.conf文件可使用如下两种配置
location /conf {
alias /usr/local/nginx/conf/;
}
location /conf {
root /usr/local/nginx/;
}
使用alias时,在URI向实际文件路径的映射过程中,已经把location后的部分字符串丢弃掉了,因此,/conf/nginx.conf请求将根据alias path映射为path/nginx.conf
root则不一样,他会根据完整的URI请求进行映射,因此/conf/nginx.conf将会被映射未root path/conf/nginx.conf,这也是为什么root可以放置到http、server、location中而alias只能存在于location中的原因
使用HTTP proxy module配置一个反向代理服务器
反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后根据请求转发给内网中的上游服务器,并将从上有服务器上得到的结果返回Internet上请求连接的客户端,此时代理服务器对外的表现就是一个web服务器,充当反向代理服务器也是nginx的通常用法
一般来说如果nginx作为反向代理服务器,接收到的请求若是针对静态文件,则直接通过nginx将请求映射到本地的静态资源上,如果需要动态的结果,即发出的是一条动态的请求,则需要继续反向代理到真正的web服务器
当客户端发来HTTP请求的时候,Nginx并不会立刻转发到上游服务器,而是先把用户的请求(包括HTTP包体)完整地接收到Nginx所在服务器的硬盘或者内存中,然后再向上游服务器发起连接,把缓存的客户端请求转发到上游服务器,而其余的一些反向代理服务器采用的策略是边接收客户端的请求,边进行转发到上游服务器
Nginx这中工作方式存在一个明显的缺点,很明显,这种缓存策略相当于是延长了一个HTTP请求的时间,并增加了用于缓存请求内容的内存和磁盘空间,而优点是降低了上游服务器的负担,将负担更多的放在了自己身上
但是Nginx的这个策略同时也大大提高了效率更降低了上游服务器的负担,比如一个场景是一个客户端想要上传1G的文件,这个时候如果是别的一些反向代理服务器,则在刚与客户端建立连接还没有开始接收包体的时候,就开始向上游服务器进行发起连接,因为客户端和反向代理服务器之间基本都是走外网,这个时间加上自身网络情况,上传1G大小的文件通常是一个很耗时的操作,这个时候,这些反向代理服务器就要一直保持着和客户端的关系,又要保持着和上游服务器的关系,这样一个上传文件操作就成了一个既耗时又耗资源的一个操作,而这个时候Nginx和客户端建立连接之后完整地接收包体之后,通过内网与上游服务器之间建立连接,这个速度和资源损耗就远远小于其余一些反向代理服务器了
在介绍nginx反向代理之前,搭了一个小型的tomcat集群,这样的话就可以通过nginx做反向代理服务器,并且使用负载均衡策略,向上游的两台服务器按照指定的权重策略进行分发请求
搭建Tomcat服务器集群
首先,熟悉基于J2EE规范以及使用Spring框架开发的开发者应该都接触过Tomcat这种并发量适中的小型web应用服务器,可是,如果有一天,你的项目访问量,甚至说并发量到达了一定的级别,你会如何处理这种情况,原始的架构只是单Tomcat服务器,但是这种结构肯定不足以支撑对整个后端服务的运营,这个时候怎么办,首先要想到的就是在有限的一台服务器上鼓捣一个Tomcat集群,让多台Tomcat同时工作,并且使用nginx作为反向代理服务器,配置负载均衡策略,这样去解决单台Tomcat负担过大访问量的单台服务器瓶颈
简易搭建Tomcat集群
-
首先需要确保自己的电脑或者服务器上有安装过后的两台Tomcat服务器
我为这两台服务器分别起名为main以及secoundary便于区分,并且修改了webapps中ROOT文件夹下的图标,这样的话一会儿在测试的环节上就能区分出nginx分发请求到了哪一台上游服务器
解压后的两台Tomcat服务器 -
修改/etc/profile
添加如下字段
/etc/profile -
修改secondary中/bin/catalina.sh文件,注意这里不要修改main中的catalina.sh
在OS结点下添加如下信息,使secondary开启的时候使用/ect/profile中配置的第二条配置启动
修改catalina.sh -
修改secondary中conf/server.xml
找到Server结点修改为,main中Server结点端口为8005
修改Server结点 -
修改Connector结点,并且为了防止乱码增加URIEncoding属性,main为8080默认端口
修改Connector结点
-
修改AJP端口
修改AJP端口AJP Connector
The AJP Connector element represents a Connector component that communicates with a web connector via the AJP protocol.
AJP连接器可以通过AJP协议和一个web容器进行交互当你想让Apache和Tomcat结合并且你想让Apache处理静态内容的时候用AJP,或者你想利用Apache的SSL处理能力时
特殊于HTTP Connector,AJP还可以与engine元素上的jvmRoute结合使用来实现负载均衡功能
配置nginx.conf
简单说一下这一段的配置
-
upstream结点
upstream结点用来配置上游服务器ip以及端口,用于nginx转发使用,在这里这个www.dzjissz.com域名是在本地hosts中配置指向127.0.0.1的域名,所以就相当于指向本地服务器ip
-
server结点中的server_name
简单地来说,location块需要结合server_name和location后的uri进行匹配,并且根据location块中的proxy_pass配置确定转发的upstream结点
这一段nginx的配置主要就是当用户通过www.dzjissz.com这个域名作为url访问服务的时候,nginx匹配到了这个请求,并且向上游两个开启的8080和9080的tomcat服务器进行转发,因为没有指定权重,所以两台服务器的权重weight默认都为1, 我们来看一下效果
可以看出当使用localhost访问服务的时候,相当于www.dzjissz.com作为url进行请求,可以看到nginx将请求转发到了两台开启在不同端口的tomcat服务器。
到这里简单的tomcat集群也就搭建完成了,修改完配置文件和环境变量文件记得使其生效,否则等于啥都没干