nginx简介
Nginx概述
Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 Nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 Nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx官网
官网地址:点击
Nginx用处
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 Java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达 50000 个并发连接数。
nginx功能
反向代理
- 正向代理:由客户端向代理指定它要访问哪个原始的服务器,然后又代理将请求转发给对应的服务器。
例子:国内用户使用vpn访问外网。
国内用户B无法直接访问外网内容,那就找一台可以访问外网的服务器A(像香港、澳门的服务器),向A发送请求,A收到请求后代替国内用户B向外国服务器C请求内容,A将C发来的内容转发给B。 - 反向代理:客户端指访问代理服务器,由代理服务器根据配置规则转发给相应的原始服务器。反向代理访问的实际是一个虚拟的ip,不是最终实际的ip地址。
- 反向代理和正向代理:正向代理,是代理客户端给服务器,服务器只知道有请求但不知道是谁发的。反向代理是代理服务器。客户端发送请求但是不知道是哪个服务器接收了发送的请求。
负载均衡
单个web应用服务器不能承受日益增长的并发请求量,因此我们需要不断的扩张web应用服务器来支持更高的并发请求量,于是,我们可以将应用部署到不同的服务器上面,由一个中介(Nginx)来统一接收用户请求,中介将请求转发给web应用服务器来处理,这里就涉及到一个问题:有3台服务器可以处理用户请求,究竟该给那台服务器处理用户请求? 答案就是负载均衡。
还是上面这张图,可以看到负载均衡的主要作用是通过负载均衡算法将请求分发到各个服务器上,以此确保单个服务器不用面对过多的用户请求,而且即使某个后台应用服务器挂了,其他应用服务器还可以正常接收请求,实现了高可用。
动静分离
动静分离指的是将动态请求和静态请求隔离开,然后分别路由到相应的后端服务器。通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求;还有一部分不需要后台程序处理,如请求 css、html、js、图片等静态资源,这类请求我们称之为静态请求。Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。
初试Nginx
Nginx基本使用
点击http://nginx.org/en/download.html后如下图:
下载后解压到没有中文的路径下,否则会报错。
解压后如下图:
在nginx的解压路径下打开cmd,输入start nginx.exe
在浏览器中访问:http://localhost/,显示结果如下图代表nginx运行成功。
关闭Nginx:在原来的cmd界面中输入:nginx -s quit 或者nginx -s stop
Nginx配置文件讲解
打开conf文件下的nginx.conf文件(可能打不开,用notepad++或者记事本打开试试?)
分析该文件内容可得其大致框架如下:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
- 全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
- events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模+ 型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
- http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
- server块:配置虚拟主机的相关参数,一个http中可以有多个server。
- location块:配置请求的路由,以及各种页面的处理情况。
反向代理
准备
- 一个可以在本地运行的web项目(打成jar包的格式):没有的话可以拉取我的项目在本地打成jar包,直接用IDEA打开再用maven的打包工具打成jar包,类似下图文件
- 在本地运行该项目,这里为了方便演示,我直接在本地启动了两个:localhost:8080、localhost:8081
启动后在浏览器访问:http://localhost:8080/administrators/categorys和http://localhost:8081/administrators/categorys,出现下图代表运行成功
- 准备做好后,我们通过访问代理服务器的地址localhost:80获取http://localhost:8080/administrators/categorys的内容来验证反向代理是否成功。
基本上手
- 修改配置文件(nginx.conf)
- 运行代理服务器
这里要重新加载配置文件:nginx -s reload
- 验证代理是否成功
出现下图就代表反向代理成功。
负载均衡
基本上手
nginx默认使用的是轮询策略,我们在轮询策略的基础上使用权重来调整轮询的几率。
- 修改配置文件,修改完配置文件后记得reload一下nginx
直接在服务器地址后添加weight参数,参数越大,处理的请求越多,我们这里设置的是1:1的几率,到访问的时候也大致是两个服务器轮流请求,你也可以修改其他权重,通过观察后台加载信息判断轮询几率是否符合设置。 - 观察项目加载信息
可以看到服务器的请求频率大致符合权重比值,这就代表基本的负载均衡配置成功。
其他策略
实际上还有很多策略来进行负载均衡,感兴趣的可以看看其他人的博客:
https://www.cnblogs.com/1214804270hacker/p/9325150.html
动静分离
修改配置文件
server {
listen 80;
server_name 192.168.206.128;
#charset koi8-r;
#access_log logs/host.access.log main;
location /www/ {
root /data/;
index index.html index.htm;
}
Nginx常见问题和解决方案
Nginx启动和关闭异常
报错如下:nginx: [error] CreateFile() “XXXXXXXX/logs/nginx.pid” failed
解决办法:在任务管理器中关闭nginx进程再打开,该错误就会消失。
原因:start nginx.exe的时候nginx会在logs下创建nginx.pid文件,关闭nginx时,nginx会根据nginx.pid文件来关闭自己,但是可能是我们在没有完全启动nginx时执行了其他命令导致nginx没有创建nginx.pid文件。
Nginx常用命令(Windows)
验证配置是否正确: nginx -t
查看Nginx的版本号:nginx -V
启动Nginx:start nginx
快速停止或关闭Nginx:nginx -s stop
正常停止或关闭Nginx:nginx -s quit
配置文件修改重装载命令:nginx -s reload