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 (客户端的链接和后端服务的链接);

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx 最大进程连接数设置过少

request

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_02


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         }

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx 最大进程连接数设置过少_03


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。

测试:

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_04

虚拟主机配置

虚拟主机技术主要应用于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、验证

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx 最大进程连接数设置过少_05

使用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     }

nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_06


2、重启nginx时会报错

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_07


报错原因是找不到认证文件,我们需要生成认证文件并将其放在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、测试,在浏览器中访问第一个虚拟主机的域名

www.westos.org

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx_08


nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_09

重定向

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     }

nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_10


测试

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_11


2、将www.westos.org/bbs重定向到bbs.westos.org(将www.westos.org下的一个子目录定向到一个新的站点)

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx_12


nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx 最大进程连接数设置过少_13


3、将www.westos.org/bbs/index.html重定向到https://bbs.westos.org/index.html

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_14


nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_15

对客户端并发量、下载速度的限制

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         }

nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_16


在/usr/local/nginx/html/下创建download目录

在物理机中使用ab工具进行压测,并发量设为1

nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_17


在nginx服务器上查看访问日志,可以看到被访问10次全部成功

nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_18


将并发量设置为10次再次进行压测

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx_19


nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx_20


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的文件,然后在物理机中去下载

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_21


nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_22


可以看到,下载速率一直维持在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主机访问该目录

nginx 最大进程连接数设置过少 nginx默认最大并发数_Nginx_23


使用172.25.66.2主机访问

nginx 最大进程连接数设置过少 nginx默认最大并发数_客户端_24


访问被拒!

防盗链机制

**盗链:**此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。

我们可以利用防盗链机制来禁止外部对本机内容进行盗链
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默认最大并发数_nginx_25


现在我们到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目录下

nginx 最大进程连接数设置过少 nginx默认最大并发数_nginx_26