Nginx 概述

tanqi
9
2025-04-24

内容概览

1 Nginx简介

1.1           Nginx概述

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等

1.2           Nginx作为web服务器

Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perlphp等。但是不支持javaJava程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。

https://lnmp.org/nginx.html

https://nginx.org/

https://news.netcraft.com/archives/category/web-server-survey/

1.3 反向代理

Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。

正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理

反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址

²  正向代理中,proxyclient同属一个LAN,对client负责,对server透明;

²  反向代理中,proxyserver同属一个LAN,对server负责,对client透明。

²  实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理

1.4 负载均衡

客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。

  这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?

  我们首先想到的可能是升级服务器的配置,比如提高CPU执行频率加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效,硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?

上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

生活案例:

在地铁站、火车站、电影院、银行等。无论是买票,还是排队入场,这些场所一般都会设置多个服务点或者入口的。如果没有人引导的话,大多数情况下,最近的入口会挤满人。而哪些距离较远的服务点或者入口就宽松很多。可以配置引导员,让各个服务点、入口人数比较均匀。

1.5 动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。

一般网站初建时因为流量小、业务简单等原因,不进行动静分离,将两种数据放到一台服务器上提供服务。在一个网站中,静态资源(jscssimg)是比较占宽带资源的。当访问量大到一定程度之后,就可能出现带宽不足、甚至磁盘高 IO 等问题。此时就可以采用动静分离,将图片等静态资源同步到另一台 WEB 服务器。

很多网站中的静态资源一般都存放在第三方存储平台上,例如:七牛云、阿里云、腾讯云等。这些第三方存储平台内置CDN,进行内容分发,采用就近访问原则。

2 Nginx安装

2.1 下载http://nginx.org/

2.2 安装包

pcre-8.37.tar.gz

openssl-1.0.1t.tar.gz

zlib-1.2.8.tar.gz

nginx-1.20.1.tar.gz

2.3 在线安装

第一步,安装pcre

第一步 联网下载pcre

wget http://downloads.sourceforge.net/project/pcre/pcre/8.37/pcre-8.37.tar.gz

第二步 解压压缩文件

使用命令 tar -zxvf pcre-8.37.tar.gz

第三步 ./configure完成后,回到pcre目录下执行make,最后执行make install

第四步  pcre-config --version  检查版本

第二步,安装openssl 、zlib 、 gcc 依赖

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

第三步,安装nginx

使用命令解压

./configure

make && make install

进入目录 /usr/local/nginx/sbin   执行./nginx 启动服务

第四步,关闭防火墙,访问nginx

在windows系统中访问linux中nginx,默认不能访问的,因为防火墙问题

关闭防火墙-开放访问的端口号,80端口

查看开放的端口号

firewall-cmd --list-all

设置开放的服务或端口号

firewall-cmd --add-service=http --permanent

firewall-cmd --add-port=80/tcp --permanent

重启防火墙

firewall-cmd --reload

2.4 离线安装

第一步 安装pcre

解压缩pcre-xx.tar.gz

进入解压缩目录,执行./configure

注意:如果提示错误,需要提前安装gcc++

方法1:rpm安装

执行  cd  /run/media/root/CentOS 7 x86_64/Packages(已经从中拷贝出来了26个安装包,直接使用准备好的文件夹rpmgcc安装即可)

rpm -Uvh *.rpm --nodeps --force

方法2:yum 安装

yum install gcc-c++

检查安装后版本

gcc -v

g++ -v

./configure完成后,回到pcre目录下执行make,再执行make install

第二步 安装openssl

解压缩openssl-xx.tar.gz

进入解压缩目录,执行./config

make && make install

第三步 安装zlib

解压缩zlib-xx.tar.gz

进入解压缩目录,执行./configure

make && make install

第四步 安装nginx

解压缩nginx-xx.tar.gz

进入解压缩目录,执行./configure

make && make install

第五步 关闭防火墙,开放端口【参考2.3第四步】

3 Nginx常用的命令和配置文件

3.1 nginx常用的命令

1)启动命令:/usr/local/nginx/sbin目录下执行 ./nginx

2)关闭命令:/usr/local/nginx/sbin目录下执行 ./nginx  -s  stop

3)重新加载命令:/usr/local/nginx/sbin目录下执行 ./nginx  -s  reload

(4)查看版本:在/usr/local/nginx/sbin目录下执行 ./nginx  -v

(5)查看进程:ps -ef|grep nginx

3.2           nginx.conf 配置文件

nginx 安装目录(/usr/local/nginx/conf/nginx.conf,不是/opt/nginx-1.20.1/conf/nginx.conf)下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件 nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改

配置文件中有很多#, 开头的表示注释内容,我们去掉所有以 # 开头的段落,精简之后的内容如下:

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:

第一部分:全局块

  从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

  比如上面第一行配置的:

  这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

第二部分:events

 比如上面的配置:

  events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。

  上述例子就表示每个 work process 支持的最大连接数为 1024.

  这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

第三部分:http

  这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

  需要注意的是:http 块也可以包括 http全局块server 块

①、http 全局块

  http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

②、server

  这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

  每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。

  而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

  1、全局 server 块

  最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。

  2、location 块

  一个 server 块可以配置多个 location 块。

这块的主要作用是基于 Nginx  服务器接收到的请求字符串

(例如 server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

4 Nginx配置实例-反向代理

4.1 反向代理案例一

实现效果:使用nginx反向代理,访问 www.123.com 直接跳转到127.0.0.1:8080

4.1.1 准备工作

1)     启动一个 tomcat

linux系统安装tomcat;将tomcat安装文件放到linux系统/opt中,解压;进入tomcatbin目录中,./startup.sh启动tomcat服务器 ,使用默认端口8080

2)     linux本机访问:localhost:8080

3)     在windows系统中通过浏览器访问tomcat服务器,注意防火墙或开放端口

4)     映射域名,通过修改本地 C:/Windows/System32/drivers/etc/hosts 文件,将 www.123.com 映射到 192.168.137.129

5)    配置完成之后,访问www.123.com:8080 

4.1.2 案例一

那么,如何只需要输入 www.123.com 便可以跳转到 Tomcat初始界面呢?便用到 nginx的反向代理。

Ø  在 nginx.conf 配置文件中增加如下配置

4.2 反向代理案例二

实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口服务

nginx监听端口为9000,

访问 http://127.0.0.1:9000/edu/ 直接跳转到127.0.0.1:8080

访问 http://127.0.0.1:9000/vod/ 直接跳转到127.0.0.1:8081

4.2.1 准备工作

第一步,准备两个tomcat,一个8080端口,一个8081端口,并准备好测试的页面

webapps/edu/index.html

webapps/vod/index.html 

由于一个ip服务器上启动两个tomcat,端口不能相同。所以,需要修改端口:228005->9005;698080->8081;

第二步,修改nginx的配置文件,http块中添加server{}

4.2.2 案例二

4.3 location指令说明

该指令用于匹配 URL。

语法如下:

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

3、~:用于表示 uri 包含正则表达式,并且区分大小写。

4、~*:用于表示 uri 包含正则表达式,并且不区分大小写。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

5 Nginx配置实例-负载均衡

5.1 实现效果

浏览器地址栏输入地址 http://192.168.137.129/edu/a.html,负载均衡效果,将请求平均分配到8080和8081两台服务器上。

5.2 准备工作

1)准备两台tomcat服务器,一台8080,一台8081

2)在两台tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html(a.html内容不一样,查看效果),用于测试

5.3 负载均衡配置 

upstream称为上游服务器,即真实处理请求的业务服务器。

5.4 nginx分配服务器策略

随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx就是其中的一个,在linux下有NginxLVSHaproxy等等服务可以提供负载均衡服务,而且Nginx提供了几种分配方式(策略)

5.4.1 轮询(默认

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

5.4.2 weight

weight代表权,重默认为1,权重越高被分配的客户端越多

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream server_pool{  

server 192.168.10.1 weight=1;   

server 192.168.10.2 weight=2;

server 192.168.10.3 weight=3;  

}

5.4.3 ip_hash

每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:

upstream server_pool{  

ip_hash;   

server 192.168.10.1:80;  

server 192.168.10.2:80; 

server 192.168.10.3:80; 

}

5.4.4 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream server_pool{  

server 192.168.10.1:80;   

server 192.168.10.2:80;

server 192.168.10.3:80;

fair;   

}

5.4.5 其他参数

6 Nginx配置实例-动静分离

Nginx 动静分离简单来说就是把动态请求静态请求分开,Nginx 处理静态请求,Tomcat处理动态请求。

动静分离从目前实现角度来讲大致分为两种:

l  一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

l  另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发

第7章 Nginx原理与优化参数配置

7.1 Nginx原理

l  master-workers的机制的好处

首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。

其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。

当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

l  需要设置多少个worker

Nginx redis类似都采用了IO多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

l  #设置worker数量

worker_processes 4

#work绑定cpu (8 work绑定8cpu)

worker_cpu_affinity 00000001 00000010 00000100 00001000  00010000  00100000 01000000  10000000

l  #连接数

worker_connections 1024

这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes

当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量worker_connections * worker_processes

7.2 Nginx.conf配置详解

#安全问题,建议用nobody,不要用root.

#user  nobody;

 

#worker数和服务器的cpu数相等是最为适宜

worker_processes  2;

 

#work绑定cpu(4 work绑定4cpu)

worker_cpu_affinity 0001 0010 0100 1000

  

#error_log path(存放路径) level(日志等级) path表示日志路径,level表示日志等级,

#具体如下:[ debug | info | notice | warn | error | crit |alert | emerg]

#从左至右,日志详细程度逐级递减,即debug最详细。。

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#error_log /dev/null;  关闭日志

#pid        logs/nginx.pid;

 

events {

    worker_connections  1024; 

 

    #这个值是表示nginx要支持哪种多路io复用

    #一般的Linux选择epoll, 如果是(*BSD)系列的Linux使用kquene。

    #windows版本的nginx不支持多路IO复用,这个值不用配。

    use epoll;

 

    # 当一个worker抢占到一个链接时,是否尽可能的让其获得更多的连接,默认是off 。

    multi_accept on; //并发量大时缓解客户端等待时间。

    # 默认是on ,开启nginx的串行指派机制如果为off,开启抢占模式。

    accept_mutex  on;

}

http {

    #当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。

    include       mime.types;  #/usr/local/nginx/conf/mime.types

 

    #如果 不能从mime.types找到映射的话,用以下作为默认值-二进制

    default_type  application/octet-stream;

 

     #日志位置和格式

   log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                       '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

      access_log  logs/host.access.log  main;

 

     #一条典型的accesslog:

     #101.226.166.254 - - [21/Oct/2013:20:34:28 +0800] "GET /movie_cat.php?year=2013 HTTP/1.1" 200 5209 "http://www.baidu.com" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider"

     #1)101.226.166.254:(用户IP)

     #2)[21/Oct/2013:20:34:28 +0800]:(访问时间)

     #3)GET:http请求方式,有GET和POST两种

     #4)/movie_cat.php?year=2013:当前访问的网页是动态网页,movie_cat.php即请求的后台接口,year=2013为具体接口的参数

     #5)200:服务状态,200表示正常,常见的还有,301永久重定向、4XX表示请求出错、5XX服务器内部错误

     #6)5209:传送字节数为5209,单位为byte

     #7)"http://www.baidu.com":refer:即当前页面的上一个网页

     #8)"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; #.NET CLR 3.0.30729; Media Center PC 6.0; MDDR; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322; Tablet PC 2.0); 360Spider": agent字段:通常用来记录操作系统、浏览器版本、浏览器内核等信息

 

 

    #开启从磁盘直接到网络的文件传输,适用于有大文件上传下载的情况,提高IO效率。

    sendfile        on; //大文件传递优化,提高效率

  

    #一个请求完成之后还要保持连接多久,0表示完成请求后直接关闭连接。默认:75s

    keepalive_timeout  60s;

 

    #开启或者关闭gzip模块, 文件压缩,再传输,提高效率

    #gzip  on ;

 

    #设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。

    #gzip_min_lenth 1k;

 

    # gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但处理最慢(传输快但比较消耗cpu)

    #gzip_comp_level 4;

 

    #匹配MIME类型进行压缩,(无论是否指定)"text/html"类型总是会被压缩的。

    #gzip_types types text/plain text/css application/json  application/x-javascript text/xml  

 

    #动静分离

    #服务器端静态资源缓存,最大缓存到内存中的文件,不活跃期限

    open_file_cache max=655350 inactive=20s;  

  

    #活跃期限内最少使用的次数,否则视为不活跃。

    open_file_cache_min_uses 2;

 

    #验证缓存是否活跃的时间间隔

    open_file_cache_valid 30s;

   

    upstream  myserver{

        # ip_hash;

        server 192.168.161.132:8080 weight=1;

        server 192.168.161.132:8081 weight=1 backup;

        #hash $request_uri

        #hash_method crc32

    }

 

    server {

        #监听端口号

        listen       80;

        #服务名

        server_name  192.168.137.129;

        #字符集

        #charset utf-8;

        location / {   #匹配任何查询。

            root   html;#资源查找位置。         /user/local/nginx/html

            #默认访问首页索引文件的名称

            index  index.html index.htm;

            #反向代理路径

            proxy_pass http://myserver;

            #反向代理的超时时间

            proxy_connect_timeout 10;

            proxy_redirect default;

         }

          #普通匹配

        location  /images/ {   

                    root images ;

        }

         #反正则匹配

         location ^~ /images/jpg/ {  # 匹配任何以 /images/jpg/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。

                      root images/jpg/ ;

         }

         #正则匹配

         location ~*.(gif|jpg|jpeg)$ {      

                      #所有静态文件直接读取硬盘

                      root pic ;

                      #expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力

                      expires 3d;

         }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

    }

}

动物装饰