目录
一、为什么要学Nginx?
1、项目应用刚上线的时候,用户访问量是比较少的,并发量也比较小,所以将应用打成war包部署在一个tomcat上就够了,tomcat回应用户的请求响应内容给用户。 (并发量:就是服务器同时收到的请求request数量)
2、但是随着用户量的增多,并发量也会逐渐增大,这时一台tomcat服务器就处理不太过来了。
3、我们就可以将应用部署在多个服务器上,用多个服务器一起干活。 但是如果有多个服务器了,用户发送请求,到底要将请求发给哪个服务器呢?这时就需要增加一个代理服务器了,通过代理服务器来帮我们合理的转发和处理请求到干活的服务器上。
我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望可以按照服务器的性能提供不同的权重选择。保证最佳体验!所以我们使用了Nginx。
二、什么是Nginx?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。
Nginx的主要功能有负载均衡、反向代理以及动静分离。
其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。
三、怎么用Nginx?
1、Nginx的反向代理
先说什么是正向代理?正向代理就是有一台服务器来代理我们客户的主机来发送请求。
比如我们客户端A在家想要直接访问外国服务器B上的资源,是不能直接访问的,但是举个例子,比如香港的一台服务器C可以直接访问外国服务器B,这时候我们可以连接上这个香港的服务器C,把我们想要访问的地址告诉服务器C,这时服务器C就帮我们去访问服务器B,将收到的响应内容再响应给我们客户端A。这台服务C就是代理服务器,整个过程就是正向代理。典型的例子就是VPN。
什么是反向代理?和正向代理相反,正向代理是代理我们客户端的,反向代理则是代理服务器端的。代理服务器代理服务器接收用户的请求,然后再将请求以一种合理的规则转发给内部的服务器。
就像我们访问百度,都是这个请求地址:www.baidu.com ,让我们感觉百度就好像只有一台服务器,但是这不可能,百度肯定有多个服务器,这个www.baidu.com就是它的代理服务器。
而Nginx就有反向代理的功能,因此可以再服务器上安装Nginx让他充当反向代理服务器。
2、Nginx的负载均衡
什么是负载均衡?就是我们将应用部署再多台服务器上,但是这多态服务器肯定有好有坏,比如某台服务器的内存比较大,于是通过反向代理,我们希望Nginx反向代理服务器能够将请求更多的打给这台内存比较大的服务器上。使各台服务器的负载更加均衡。
而我们Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
内置策略为轮询,加权轮询,Ip hash。扩展策略,就天马行空,只有你想不到的没有他做不到的。
轮询:每台服务器的权重都一样,那请求就会依次发送给他们。
加权轮询:哪台服务器比较牛,就把它的权重设置的高一点,这样更多的请求就可以送到这台权重高的服务器上了。
iphash:对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。性能没有提升,不推荐,可以用redis做session共享。
补充:session共享是说,用户在服务器A上进行第一次登录后,下次请求可能由负载均衡策略转发给了服务器B,那么这个登录成功的session肯定需要所有服务器共享,不共享的话,请求一到别的服务器上就需要重新登录,不合适。
3、Nginx的动静分离
nginx 的动静分离,指的是由 nginx 将客户端请求进行分类转发,静态资源请求(如html、css、图片等)由静态资源服务器处理,动态资源请求(如 jsp页面、servlet程序等)由 tomcat 服务器处理,tomcat 本身是用来处理动态资源的,同时 tomcat 也能处理静态资源,但是 tomcat 本身处理静态资源的效率并不高,而且还会带来额外的资源开销。利用 nginx 实现动静分离的架构,能够让 tomcat 专注于处理动态资源,静态资源统一由静态资源服务器处理,从而提升整个服务系统的性能 。
4、Nginx的安装
Nginx可以安装在Linux和Windows上,但是为了学习的方便,我先安装在Windows上面。
1)下载安装Nginx
nginx: download 下载稳定版本。
下载后解压即可使用,和tomcat一样,解压后如下:
2)启动Nginx
有很多种方法启动nginx
(1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过
(2)打开cmd命令窗口,切换到nginx解压目录下,输入命令 nginx.exe
,回车即可
如果出现以下错误,说明80端口被占用了,那就执行第4)步。
3)检查是否启动成功
直接在浏览器地址栏输入网址 http://localhost:80 回车,出现以下页面说明启动成功!
4)配置Nginx的端口号
nginx的配置文件是conf目录下的nginx.conf,默认配置的nginx监听的端口为80,如果80端口被占用可以修改为未被占用的端口即可。
当我们修改了nginx的配置文件nginx.conf 时,不需要关闭nginx后重新启动nginx,只需要执行命令 nginx -s reload
即可让改动生效。但是假如你Nginx服务还没启动,就启动就可以生效。
5)关闭Nginx服务
如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能结束nginx进程的,可使用两种方法关闭nginx
(1)cmd切换到nginx安装目录下,输入nginx命令
nginx -s stop
(快速停止nginx) 或nginx -s quit
(完整有序的停止nginx)
(2)使用taskkill
taskkill /f /t /im nginx.exe,这个命令应该在哪个目录都可以执行,没实践过。
taskkill是用来终止进程的,
/f是强制终止 .
/t终止指定的进程和任何由此启动的子进程。
/im示指定的进程名称 .
5、Nginx配置文件
###### 全局块 #####
#这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越
#多,但是会受到硬件、软件等设备的制约。
worker_processes 1;
###### events块 #####
events {
#表示每个 work process 支持的最大连接数为 1024.
worker_connections 1024;
}
##### http块 #####
http {
include mime.types;
default_type application/octet-stream;
#这里配置负载均衡
upstream myserver{
server 192.168.167.102:8088 weitht=1;
server 192.168.167.103:8080 weitht=2;
}
server {
#访问nginx的配置,访问:http://localhost:801即可访问到nginx服务器。
listen 801;
server_name localhost;
#location该指令用于匹配 URL,反向代理的配置。
#只要访问到http://localhost:801/,就会跑到这里处理,
location / {
root html;
index index.html index.htm;
#会将请求转发给myserver里面设置的服务器
proxy_pass http://myserver;
}
l
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
#可以有多个server
server{
...
}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
四、Nginx优化
昨天面试了一家企业,受一位大佬指点,学技术,除了要学好基础外,还要做各种假设,直到出了问题,然后解决它,这样才能更理解这个技术,还要学深,这样出了问题,才知道如何解决。
那位大佬说,如果nginx并发量很大如何解决?我想应该是说nginx就算很强,并发量一大,也会有性能瓶颈,那么就需要对nginx进行优化了。
1、文件句柄
linux/Unix上,一切皆文件,每一次用户发起请求就会生成一个文件句柄,文件句柄可以理解为就是一个索引,所以文件句柄就会随着请求量的增多,而进程调用的频率增加,文件句柄的产生就越多,系统对文件句柄默认的限制是1024个,对Nginx来说非常小了,需要改大一点。
每个进程的最大文件打开数,所以最好与ulimit -n的值保持一致。
worker_rlimit_nofile 35535; #进程限制
2、合理设置nginx的进程数
nginx通过工作进程处理具体的请求,设置几个工作进程就代表允许几个并发。最优的设置是worker进程数量要与服务器的CPU的核数相等,Linux中我们可以用lscpu命令来找出CPU的核数。
worker_processes cpu核数;
当然还有很多其他的方式可以优化,要在具体的场景中应用到再研究记录。