Nginx是什么,可以用来做什么?
Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外Nginx可以作为反向代理进行负载均衡的实现。
Nginx基础概念
connection
1、一个nginx进程锁允许的最大连接数的参数为worker_connections 默认为1024,这个参数可以根据服务器的性能和内存使用量来调整;
2、对于http请求本地资源来说,锁允许的最大并发数量为worker_process * worker_connections,总数保持在3w左右;
3、HTTP作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2 (客户端的链接和后端服务的链接);
request
nginx处理网络请求的生命周期:
1、ngx_http_request_t是对一个http请求的封装,用来保存解析请求与输出响应相关的数据;
2、从ngx_http_init_request开始,这个函数设置ngx_http_process_request_line来处理请求行,通过ngx_http_read_request_header来处理请求头;
3、以请求行中的host域来查找虚拟机;
4、解析到的数据会存储在ngx_http_request_t结构中;
5、nginx解析到两个回车换行符表示请求头结束,使用ngx_http_process_request来处理请求;
6、ngx_http_process_request设置处理函数为ngx_http_request_handler;
7、然后调用ngx_http_handler来真正地处理一个完整的HTTP请求。
keepalive
1、客户端的请求头中的connection为close,表示客户端请求关掉长连接;
2、如果为keep-alive,则客户端需要打开长连接;
3、如果客户端的请求中没有connection这个头,那么根据协议,如果是http1.0,则默认为close,如果是http1.1,则默认为keep-alive;
4、如果客户端请求中没有connection这个头,那么根据协议,如果是http1.0,则默认为close,如果是http1.1,则默认是keep-alive;
5、如果服务端最后决定长连接打开,则请求头中会包含connection:keep-alive,否则就是connection:close;
6、keep-alive的好处:客户端需要多次访问同一个server时,开启keep-alive可以大大减少time-wait的数量。
pipeline
1、pipeline流水线作业,是keepalive的一种升华;
2、与keepalive相同,也是基于TCP长连接;
3、利用一个连接进行多次请求;
4、与keepalive的区别:
1、keepalive:第二个请求必须要在第一个请求的向应完全接收后才能发起。
2、pipeline:nginx对pipeline中的请求的处理也不是并行的,依然是一个一个的处理,只是在处理第一个请求时,就可以发起第二个请求。
5、pipeline实现原理:nginx在读取数据时,会将数据放在一个buffer里面,在处理完前一个请求之后,如果buffer中还有请求,就认为是下一个处理的请求,然后处理它,如果没有,则设置为keepalive。
lingering_close
1、延迟关闭,当关闭nginx连接时,先关闭TCP的写,等待一段时间再关闭连接的读
2、保持更好的客户端兼容性,但是要消耗更多的资源。
Nginx配置文件祥解
基础配置解释
1 # 定义Nginx运行的用户和用户组,来指定Nginx Worker进程运行用户以及用户组,默认由nobody帐号运行
2 user nginx;
3
4 # nginx进程数,建议设置为CPU总核心数,可以使用lscpu查看cou数量
5 worker_processes 1;
6
7 # 全局错误日志定义类型,[ debug | info | notice | warn | error | crit ],其中debug输出日
志最为最详细,而crit输出日志最少
8 error_log logs/error.log;
9 error_log logs/error.log notice;
10 error_log logs/error.log info;
11
12 # 进程文件,用来指定进程id的存储文件位置
13 pid logs/nginx.pid;
14
15 # 一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值 ulimit -n)
与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致,可以使用u
limit -n ‘num’来设置其他值。最多65535
16 worker_rlimit_nofile 4864;
17
18 # 工作模式与连接数上限
19 events {
20 # 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是linux2.6以
上版本内核中的高性能I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
21 use epoll; # mac平台用kqueue,对于linux系统,epoll工作模型是首选
22
23 # worker_connections用于定义nginx每个进程的最大连接数,即接收前端的最大请求数,默认
是1024.最大客户端连接数由worker_processes和worker_connections决定,即
Max_clients=worker_ processes*worker_connections,在作为反向代理时,Max_clients变
为:Max_clients = worker_pro cesses*worker_connections/4。进程的最大连接数受Linux系统进
程的最大打开文件数限制,在执行操作系统命令"ulimit -n 65535"后worker_connections的设置才能生效
24 worker_connections 1024;
25 }
26
27 # 设定http服务器
28 http {
29 # 用来设定文件的mime类型,类型在配置文件目录下的mime.type文件定义,来告诉nginx来识别
文件类型。
30 include mime.types;
31
32 # 默认文件类型,默认为二进制流
33 default_type application/octet-stream;
34
35 #charset utf-8; # 默认编码
36
37
38 # 用于设置日志的格式,和记录哪些参数,这里设置为main,刚好用于access_log来记录这种类
型
39 #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
40 # '$status $body_bytes_sent "$http_referer" '
41 # '"$http_user_agent" "$http_x_forwarded_for"';
42
43 #access_log logs/access.log main;
44
45 sendfile on; # 开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输
出文件,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用可设置为off,以平衡磁
盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改称off。
46
47 #tcp_nopush on; # 防止网络阻塞
48 #tcp_nodelay on; # 防止网络阻塞
49
50 # 长连接超时时间,单位是秒
51 #keepalive_timeout 0;
52 keepalive_timeout 65;
53
54 # 开启gzip压缩输出
55 #gzip on;
其他配置解释
负载均衡配置
1、设定负载均衡服务器列表
35 upstream gd.com{
36 ip_hash;
37 server 172.25.66.2:80;
38 server 172.25.66.3:8080 down;
39 server 172.25.66.4:80 max_fails=3 fail_timeout=20s;
40 }
50 location / {
51 proxy_pass http://gd.com; # 调用负载均衡器gd.com
52 }
upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
在上面的设定中,通过upstream指令指定了一个负载均衡器的名称gd.com。这个名称可以任意指定,在后面需要的地方直接调用即可。
Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法。
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,
故障系统被自动剔除,使用户访问不受影响;
Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能
不均的情况下;
ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务
器,有效解决了动态网页存在的session共享问题;
fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进
行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身
是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;
url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提
高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安
装Nginx 的hash软件包。
在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:
down:表示当前的server暂时不参与负载均衡;
backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup
机器,因此这台机器的压力最轻;
max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块
定义的错误;
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使
用。
注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
测试:
虚拟主机配置
虚拟主机技术主要应用于HTTP(Hypertext Transfer Protocol,超文本传输协议)服务,将一台服务器的某项或者全部服务内容逻辑划分为多个服务单位,对外表现为多个服务器,从而充分利用服务器硬件资源。
1、编辑配置文件,生成虚拟主机
90 server {
91 listen 80;
92 server_name www.westos.org; # 设置域名为www.westos.org
93
94 location / {
95 root /www1; # 第一个虚拟主机的发布目录
96 index index.html index.htm;
97 }
98 }
99
100 server {
101 listen 80;
102 server_name www.linux.org; # 设置域名为www.linux.org
103
104 location / {
105 root /www2; # 第二个虚拟主机的发布目录
106 index index.html index.htm;
107 }
108 }
2、创建/www1与/www2目录,并在目录中编辑发布文件index.html
3、在真机中的/etc/hosts文件中做解析
172.25.66.1 www.westos.org www.linux.org 4、重启nginx
5、验证
使用https
1、编辑nginx配置文件
110 # HTTPS server
111 #
112 server {
113 listen 443 ssl;
114 server_name www.westos.org;
115
116 ssl_certificate cert.pem; # https要用到的锁和钥匙
117 ssl_certificate_key cert.key;
118
119 ssl_session_cache shared:SSL:1m;
120 ssl_session_timeout 5m;
121
122 ssl_ciphers HIGH:!aNULL:!MD5;
123 ssl_prefer_server_ciphers on;
124
125 location / {
126 root /www1;
127 index index.html index.htm;
128 }
129 }
2、重启nginx时会报错
报错原因是找不到认证文件,我们需要生成认证文件并将其放在nginx的配置目录下
3、生成认证文件
cd /etc/pki/tls/certs
make cert.pem
cp cert.pem /usr/local/nginx/conf/cert.pem
cp cert.pem /usr/local/nginx/conf/cert.key
4、重启nginx
5、测试,在浏览器中访问第一个虚拟主机的域名
重定向
1、将域名为westos.rg的请求重定向到www.westos.org
90 server {
91 listen 80;
92 server_name www.westos.org westos.org;
93 rewrite ^(.*)$ https://www.westos.org permanent;
94 # 将域名为westos.org与www.westos.org的请求重定向到https://www.westos.org
95 # permanent表示永久重定向
96
97 location / {
98 root /www1;
99 index index.html index.htm;
100 }
101 }
测试
2、将www.westos.org/bbs重定向到bbs.westos.org(将www.westos.org下的一个子目录定向到一个新的站点)
3、将www.westos.org/bbs/index.html重定向到https://bbs.westos.org/index.html
对客户端并发量、下载速度的限制
1、限制客户端请求的并发量为1
在nginx配置文件中的http服务器配置模块中编辑:
34 limit_conn_zone $binary_remote_addr zone=addr:10m; 限制带宽
42 server {
43 listen 80;
44 server_name localhost;
45
46 location /download {
47 limit_conn addr 1; # 限制客户端并发量为1
48 }
在/usr/local/nginx/html/下创建download目录
在物理机中使用ab工具进行压测,并发量设为1
在nginx服务器上查看访问日志,可以看到被访问10次全部成功
将并发量设置为10次再次进行压测
2、限制客户端下载速率
35 limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; #限制下载速率
43 server {
44 listen 80;
45 server_name localhost;
46
47 location /download {
48 limit_conn addr 1;
49 limit_rate 50k; # 限制下载速率为50k/s
50 limit_req zone=one burst=5;
我们在download目录中生成一个100M的文件,然后在物理机中去下载
可以看到,下载速率一直维持在50k/s左右。
访问控制
1、允许172.25.66.250主机访问,禁止其他主机访问
52 location /admin {
53 allow 172.25.66.250;
54 deny all;
55 }
创建admin目录
使用172.25.66.250主机访问该目录
使用172.25.66.2主机访问
访问被拒!
防盗链机制
**盗链:**此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
我们可以利用防盗链机制来禁止外部对本机内容进行盗链
1、我们开启另外一台部署有apache的主机来对nginx服务器进行盗链
首先在apache的主机中编辑apache默认发布文件,写入如下内容:
<html>
<body>
<img src="http://172.25.66.1/download/301764.jpg"> # 盗取172.25.66.1主机上的图片
</body>
</html>
使用这种方法可以得到172.25.66.1主机上的图片,从而达到没有付出而获得客户端流量的作用
现在我们到nginx服务器上添加防盗链机制
编辑nginx配置文件
56 location ~ .*\.(png|jpg|gif)$ {
57 valid_referers www.westos.org;
58 if ($invalid_referer) {
59 #return 403; # 禁止其访问
60 rewrite ^/(.*) http://bbs.westos.org/daolian.png; # 将盗链请求重定向,对其显示防盗链图片
61 }
62 }
将图片防止/www2目录下