一、Nginx介绍
Nginx是一款轻量级的Web服务器、反向代理服务器,是由俄罗斯的程序设计师Igor Sysoev所开发,使用C语言开发,由于它的内存占用少,启动速度极快,具有高并发的能力,在互联网项目中被广泛地应用。
它的功能丰富,可作为HTTP服务器,静态资源服务器,也可作为反向代理服务器,邮件服务器等。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。Nginx在全球网站中的市场份额为33.5%,位居第二,仅次于Apache。
二、Nginx下载安装
这里不做详细描述,需要的参考文章:[惜缘梦博客]
三、Nginx核心功能
1、反向代理
1)什么是代理呢?
说到代理,首先我们要明确一个概念,所谓代理就是一个代表、一个渠道;此时就涉及到两个角色,一个是被代理角色,一个是目标角色,被代理角色通过这个代理访问目标角色完成一些任务的过程称为代理操作过程;如同生活中随处可见的中介,我们可以通过中介买到房子,中介就是代理,被代理的就是买房子的人,而我们就是目标角色。
2)正向代理
说到正向代理,应该很多人都接触过,也听过它的名字,那就是我们熟知的VPN:VPN通俗的讲就是一种中转服务,当我们电脑接入VPN 后,我们对外IP地址就会变成VPN服务器的公网IP,我们请求或接受任何数据都会通过这个VPN服务器后传入到我们本机,隐藏了本机的地址。那么这样做有什么好处呢?VPN利用低成本的公共网络作为企业骨干网,同时又克服了公共网络缺乏保密性的弱点,在VPN网络中,位于公共网络两端的网络在公共网络上传输信息时,其信息都是经过安全处理的,可以保证数据的完整性、真实性和私有性。
这里的 VPN 就是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。
3)反向代理
反向代理,对比正向代理来说其实就是反过来了,正向代理是隐藏用户的信息,而反向代理是隐藏真实的服务器信息。
反向代理和正向代理的区别就是:正向代理代理的是客户端,反向代理代理的是服务器。
2、负载均衡
利用反向代理可以作为内部负载均衡(load balance) 的手段.
举个例子来说, 比如我现在开发了一个 java web 的博客网站, 我把它直接部署它到 tomcat 服务器上, 让 tomcat 监听 80 端口, 直接对外服务. 一开始访问量也不大, 所以这样也是没有问题的,但是当用户增多,访问量上来的时候,一个tomcat进程处理不过来了,那现在怎么办呢?于是我想到了再起一个tomcat进程,但是这样又多了一个问题,我只有一个80端口,那么我只能起一个其他的端口,这样做的话显然是有问题的,用户在访问的时候不可能有的访问80端口,有的人在访问的时候用其他端口吧。
基于以上的问题,我们可以想到可以用Nginx的反向代理来实现两个tomcat进程的负载均衡,那么我们只需要代理两个tomcat进程,配置负载均衡策略,将入口交给Nginx来管理,那么用户在访问同一个地址的时候就可以将请求分发到不同的tomcat上以实现负载均衡。
一个简单的配置如下:
http {
upstream server1{
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
location / {
proxy_pass http://server1;
}
}
}
其中weight是权重,当机器的配置不一样的时候可以控制流向每个机器的流量占比。
3、限流
Nginx限流就是限制用户请求的速度,防止服务器过载的情况
限流一般有3种
正常限制访问频率(正常流量)
突发限制访问频率(突发流量)
限制并发连接数
Nginx的限流都是基于漏桶流算法,后面会说到
四、Nginx基础使用及配置文件介绍
1、Nginx基本命令
nginx -s stop :强制关闭Nginx,可能不保存相关信息,并迅速终止web服务。
pkill nginx :强制关闭nginx
nginx -s quit :平稳关闭Nginx,保存相关信息,有安排的结束web服务。
nginx -s reload :重新加载配置而不用重启服务。
nginx -s reopen :重新打开日志文件。
nginx -c filename :为 Nginx 指定一个配置文件,来代替缺省的。
nginx -t :不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
nginx -v:显示 nginx 的版本。
nginx -V:显示 nginx 的版本,编译器版本和配置参数。
2、Nginx配置文件结构
main # 全局配置
events { # nginx工作模式配置
}
http { # http设置
....
server { # 服务器主机配置
....
location { # 路由配置
....
}
location path {
....
}
location otherpath {
....
}
}
server {
....
location {
....
}
}
upstream name { # 负载均衡配置
....
}
}
如上述配置文件所示,主要由6个部分组成:
1、main:用于进行nginx全局信息的配置
2、events:用于nginx工作模式的配置
3、http:用于进行http协议信息的一些配置
4、server:用于进行服务器访问信息的配置
5、location:用于进行访问路由的配置
6、upstream:用于进行负载均衡的配置
main模块
# user nobody nobody;
worker_processes 2;
# error_log logs/error.log
# error_log logs/error.log notice
# error_log logs/error.log info
# pid logs/nginx.pid
ser用来指定nginx worker进程运行用户以及用户组,默认nobody账号运行
worker_processes指定nginx要开启的子进程数量,运行过程中监控每个进程消耗内存(一般几M~几十M不等)根据实际情况进行调整,通常数量是CPU内核数量的整数倍
error_log定义错误日志文件的位置及输出级别debug / info / notice / warn / error / crit
pid用来指定进程id的存储文件的位置
worker_rlimit_nofile用于指定一个进程可以打开最多文件数量的描述
event 模块
event {
worker_connections 1024;
multi_accept on;
use epoll;
}
worker_connections 指定最大可以同时接收的连接数量,这里一定要注意,最大连接数量是和worker processes共同决定的。
multi_accept 配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
use epoll 配置指定了线程轮询的方法,如果是linux2.6+,使用epoll,如果是BSD如Mac请使Kqueue
http模块
作为web服务器,http模块是nginx最核心的一个模块,配置项也是比较多的,项目中会设置到很多的实际业务场景,需要根据硬件信息进行适当的配置,常规情况下,使用默认配置即可!这里不做介绍。
server模块
server {
listen 80;
server_name localhost 192.168.1.100;
root /nginx/www;
index index.php index.html index.html;
charset utf-8;
access_log logs/access.log;
error_log logs/error.log;
......
}
location /:表示匹配访问根目录
root:用于指定访问根目录时,访问虚拟主机的web目录
index:在不指定访问具体资源时,默认展示的资源文件列表
反向代理配置方式
通过反向代理代理服务器访问模式,通过proxy_set配置让客户端访问透明化
http {
upstream server1{
server 127.0.0.1:8080 weight=3;
server 127.0.0.1:8081 weight=2;
}
server {
listen 80;
location / {
proxy_pass http://server1;
index index.php index.html index.htm;
}
}
}