一、Nginx、Apache、Tomcat、Jetty的区别
共同点:都是web服务器
不同点:1、tomcat和jetty是面向java语言的web服务器,其天生就是重量级服务器,其性能与Nginx没法比;2、Apache是公认的世界第一web服务器,但是由于其出生的太早,导致其设计的时候就是重量级服务器,当应对高并发的时候其消耗比较高,其是基于BIO的;3、Nginx是高性能的web服务器,其可应对高并发量,因为其设计的时候被设计成NIO的,利用NIO的机制来应对高并发。
二、Nginx相关使用以及命令
1、需要注意的问题
由于Nginx是基于NIO的,因此其所在的环境必须支持select/epoll多路复用器。我们一般都是在Linux环境下使用Nginx,极少在windows下使用,因此我们就考虑Linux下的情况。Linux环境下内核必须大于2.6才能用epoll,因此在Linux环境下使用uname -a查看内核的情况,大于2.6才行。
2、常用的命令
nginx的命令都是在其安装路径下的sbin目录下,其安装步骤这里就不一一说明了。
./sbin/nginx:启动nginx
./sbin/nginx -s stop:直接停止nginx,就是直接kill进程,不友好,正在进行的请求会被直接中断
./sbin/nginx -s quit:停止nginx,但是会把当期的请求处理完以后停止,不会接下一个请求
./sbin/nginx -s reload:不重启的情况下加载配置文件
./sbin/nginx -s reopen:将日志重新达到error.log上。nginx默认会将输出日志和错误日志写入你安装目录下logs下的access.log和error.log中,如果当你感觉输出日志有点大,新建一个access.log然后将原有的access.log改名为access.log.backup,那么输出日志还是会输出到access.log.backup中,不会到新建的access.log中,运行该命令即可解决。如果只是从access.log中复制一个文件重命名为access.log那么就不出现这个问题,日志还是会输出到access.log中。
./sbin/nginx -t:检查修改以后配置文件是否有问题
三、Nginx架构划分
1、Nginx本身是一个进程,但是其内部又分为两种进程,master进程和worker进程,这两个进程处理不同的情况,master进程不处理请求,其相当于项目经理,不干活只管理,其检测worker进程的健康情况、检测worker进程后的服务的健康情况、执行stop、quit、reload、reopen命令。
worker进程处理http请求,默认情况下一个worker进程下也只有一个线程,该线程能处理高并发是因为基于epoll的NIO。如果是apache服务器,则多少请求,多少worker进程,这是本质的区别。
四、Nginx配置文件详解
worker_processes:配置Nginx work进程数,默认是1,这个跟你环境的CPU核数有关,如果你的核数是2,你这里配置1000,那么就会浪费,导致不停的切换。
events{}:event事件配置块,在里面可以配置每个work进程的最大连接数
http{}:http事件配置块,能配置http请求的各种参数,例如请求以后对应的服务
include:引用其他文件,相当于把其他文件的内容直接拷贝过来
default_type:默认的文件类型
sendfile:是否能发送文件
keepalive_timeout:超时事件,默认单位为秒
server{}中listen是监听的端口,server_name访问的域名,location是对访问的路径进行转发,root代表根路径,如果root写在所有的server{}外,则代表所有的server共享这个路径,如果root写在location则代表是当前服务的根路径。
如果我访问www.test.com,则会找到这个服务的index,然后转发到/home/cesec/h5/index.html中,因为我这里没有买域名,因此只是本地修改了host。
如果是这样,则效果一样,如果用的是root,则其会把root后的地址跟locaiton后的地址拼起来, 如果不想用拼起来的,那么想直接使用root后的地址,那么可以用alias代替。
如果你用了root,然后访问www.test.com/test,那么nginx访问的地址就是 /home/cesec/h5/test/index.html,如果用了alias,那么nginx访问的地址就是/home/cesec/h5/index.html。
五、配置案例
1、动静分离,静态资源和动态资源分开
基于目录动静分离:
基于正则动静分离:
2、防盗链,通过特殊的访问路径才能访问图片,防止图片资源被盗,在location中加入
valid_referers none blocked www.test.com;
if ($invalid_referer) {
return 403;
}
3、下载限速和限流
限速:
限流(正常流量):
限流(爆发流量,超出正常流量外能处理多少流量):
限制并发连接数:
4、IP黑名单
一般设置黑名单都是用一个文件,然后在模块中引用该文件即可。在http模块、server模块、location模块都能引用,作用的范围不一样而已。
六、正向代理和反向代理
1、正向代理和反向代理的区别
正向代理:客户端通过代理服务器请求目标服务器,用户可感知是请求到代理服务器以后再到达的目标服务器,例如我们常用的VPN就是正向代理。
反向代理:客户端访问目标服务器,目标服务器内部提供代理服务器,通过代理服务器再到达响应的服务,用户感知不到,在用户看来就是直接请求了目标服务器,例如我们经常访问百度,其实百度用了反向代理,只不过我们感知不到。
2、如何配置
在location中配置即可
3、注意事项
如果proxy_pass后的地址最后不是以/结尾,则其访问地址会加上location后面的地址,例如上图的反向代理,访问的地址会代理到http://127.0.0.1:8080/proxy;
如果proxy_pass后的地址最后是以/结尾,那么就不会拼上location后的第一个/后的内容,而会拼上第一个/后的所有的地址,例如上图的正向代理,访问的地址会代理到http://www.baidu.com/。如果上图的正向代理location后配置的是/baidu/test.html,那么代理访问的地址是:http://www.baidu.com/test.html。
七、负载均衡
1、如何配置负载均衡
在http模块中配置一个upstream(负载均衡)模块,其中weight是权重,backup是后备方案,如果你的负载均衡机器都挂了的话请求会打到这两台后备机器上,如果那三台负载均衡机器只要有一台还在使用,那么就不会使用后备机器。
2、负载均衡算法(五种)
轮询+权重(默认算法)
ip hash:对ip进行hash计算,可以解决机器负载均衡以后session需要重新登录,session共享的问题;
url hash:对url进行hash计算,可以使资源均匀分布,例如图片资源均匀分布;
last_connection:最小连接数
least_time:最少响应时间
八、 Nginx缓存配置(利用Nginx做缓存)
1、如何配置Nginx缓存
参数这里都要具体的解释,我就不一一说明了,在这里就解释一下levels的意思,我们会通过proxy_cache_key来将制定的路径进行md5加密当做缓存的key,缓存在proxy_cache_path下,然后通过这个key找到对应的资源。例如我们的请求路径是:www.test.com/index.html,则MD5加密以后的key就是:e5adad8bc2fc7c37d834f5b10ad859e0,如果我们设置的levels是1:2,则nginx就会将这个key从末尾开始取0和e9,正好就是1个和2个,然后会在proxy_cache_path路径下有一个0文件夹,0下有一个e9文件夹,然后e9文件夹下就有一个名字为e5adad8bc2fc7c37d834f5b10ad859e0的缓存文件。
2、如何使Nginx缓存失效