之前都只会照着网上的nginx配置和代码什么的直接拿过来用,但是没系统学习过,所以来系统学习一下nginx内容。
建议服务器不要关闭防火墙,按需开启端口就好,然后云服务器也要设置SSH密钥,安全性高一些。
1、nginx基本概念
(1)nginx是什么,能做什么?
Nginx是什么?Nginx介绍及Nginx的优点 – LNMP一键安装包
Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。
(2)反向代理
先了解下正向代理:
正向代理:如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,.则需要通过代理服务器来访问,这种代理服务就称为正向代理(如下图所示)
反向代理:其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问(对比正向代理,浏览器需要配置代理服务器),
我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端(这是之后做反向代理配置的基本理论),
此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
(3)负载均衡
客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。
这种架构模式对于早期的系统相对单一,并发请求相对较少的情况下是比较适合的,成本也低。但是随着信息数量的不断增长,访问量和数据量的飞速增长,以及系统业务的复杂度增加,这种架构会造成服务器相应客户端的请求日益缓慢,并发量特别大的时候,还容易造成服务器直接崩溃。很明显这是由于服务器性能的瓶颈造成的问题,那么如何解决这种情况呢?
我们首先想到的可能是升级服务器的配置,比如提高CU执行频率,加大内存等提高机器的物理性能来解决此问题,但是我们知道摩尔定律的日益失效(经验之谈,其核心内容为:集成电路上可以容纳的晶体管数目在大约每经过18个月到24个月便会增加一倍。换言之,处理器的性能大约每两年翻一倍,同时价格下降为之前的一半。),硬件的性能提升已经不能满足日益提升的需求了。最明显的一个例子,天猫双十一当天,某个热销商品的瞬时访问量是极其庞大的,那么类似上面的系统架构,将机器都增加到现有的顶级物理配置,都是不能够满足需求的。那么怎么办呢?
上面的分析我们去掉了增加服务器物理配置来解决问题的办法,也就是说纵向解决问题的办法行不通了,那么横向增加服务器的数量呢?这时候集群的概念产生了。
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
(简单理解就是拉货的时候,是要多动用N辆普通的车还是选一辆更大更优秀的车,前者就是负载均衡,后者就是提高服务器配置。一般来说两个方法都用得上)
(4)动静分离
为了加快网站的解析速度,可以把动态资源(jsp、servlet等)和静态资源(html、css、js等)由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
2、nginx命令和配置
很早之前就安装了nginx的1.20.2版本,并且为了做项目照着网上做了一些配置。这里主要是学习一下命令和配置文件作用。
[root@VM-20-10-centos ~]# ps -ef | grep nginx root 8883 7879 0 18:30 pts/1 00:00:00 grep --color=auto nginx root 20453 1 0 2022 ? 00:00:00 nginx: master process ./sbin/nginx root 28862 20453 0 2022 ? 00:00:35 nginx: worker process
(1)nginx常用命令
命令都要在/usr/local/sbin内执行nginx文件才能用(如下所示)
# 查看版本 [root@VM-20-10-centos sbin]# ./nginx -V nginx version: nginx/1.20.2 built by gcc 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC) configure arguments:
# 关闭和启动nginx [root@VM-20-10-centos sbin]# ./nginx -s stop [root@VM-20-10-centos sbin]# ./nginx [root@VM-20-10-centos sbin]#
# 重启nginx [root@VM-20-10-centos nginx]# cd sbin/ [root@VM-20-10-centos sbin]# ./nginx -s reload [root@VM-20-10-centos sbin]#
主要就是上面这些命令,重要的还是在配置上。
(2)nginx配置文件
完整的路径是/usr/local/nginx/conf/nginx.conf
配置文件主要有三个部分,
第一部分:全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginⅸ服务器整体运行的配置指令,主要包括配置运行Nginx服务器的用户(组)、允许生成的worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的:
这是nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
第二部分:events块
events块涉及的指令主要影响Nginx服务器与用户的网络连接,
常用的设置包括:
1、是否开启对多work process下的网络连接进行序列化,
2、是否允许同时接收多个网络连接,
3、选取哪种事件驱动模型来处理连接请求,
4、每个work process可以同时支持的最大连接数等。
上述例子就表示每个work process支持的最大连接数为1024.
这部分的配置对nginx的性能影响较大,在实际中应该灵活配置。
第三部分:http块(主要动手地方)
这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http块也可以包括http全局块、server块。
1、http全局块配置的指令包括文件引入、MIME-TYPE定义、日志定义、连接超时时间、单链接请求数上限等。
http { include 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/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65;
2、server块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个http块可以包括多个server块,而每个server块就相当于一个虚拟主机。而每个server块也分为全局server块,以及可以同时包含多个locaton块。
① 全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
② location块,
一个server块可以配置多个location块。
这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
3、nginx配置实例1-反向代理
在此之前起码也要有个linux服务器(云服务器或者虚拟机都无所谓,主要是要有ip,要能访问)要去安装tomcat,这个也是在之前就安装好了。建议大伙安装都用默认目录。
如果是有服务器并且有项目的人可以不装tomcat,直接nginx做好server配置反向代理再启动就ok,下面有配置模板。这样客户端浏览器就可以访问到对应项目资源了。下面说的是没有项目的情况。
tomcat默认安装目录是/usr/local/tomcat,我之前弄成了/usr/tomcat。
[root@VM-20-10-centos ~]# cd /usr/tomcat/apache-tomcat-9.0.62/bin [root@VM-20-10-centos bin]# ./version.sh Using CATALINA_BASE: /usr/tomcat/apache-tomcat-9.0.62 Using CATALINA_HOME: /usr/tomcat/apache-tomcat-9.0.62 Using CATALINA_TMPDIR: /usr/tomcat/apache-tomcat-9.0.62/temp Using JRE_HOME: /usr/lib/jvm/jre-1.8.0-openjdk-1.8.0.312.b07-1.el7_9.x86_64 Using CLASSPATH: /usr/tomcat/apache-tomcat-9.0.62/bin/bootstrap.jar:/usr/tomcat/apache-tomcat-9.0.62/bin/tomcat-juli.jar Using CATALINA_OPTS: Server version: Apache Tomcat/9.0.62 Server built: Mar 31 2022 14:34:15 UTC Server number: 9.0.62.0 OS Name: Linux OS Version: 3.10.0-1160.31.1.el7.x86_64 Architecture: amd64 JVM Version: 1.8.0_312-b07 JVM Vendor: Red Hat, Inc. [root@VM-20-10-centos bin]#
默认端口号本来是8080,我在tomcat的配置文件server.xml里面调成了9090。建议这里先不改配置,用默认配置启动了tomcat就行。
<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
此外,做图片上传(或者更一般的文件上传)的时候要实现的映射关系,也是在tomcat的server.xml上配置的。
最终效果是:访问公网ip:9090/pictures/图片名,能拿到对应于服务器”/root/photo/图片名”的图片。只是用的话,每个名字对着配置看就好,更具体的参数建议去官网了解。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> <Context docBase="/root/photo" path="pictures" debug="0" reloadable="true" />
tomcat和nginx的作用关系如下:
在这里说一下:
windows浏览器访问一个地址的时候会先去看host的配置,如果没有的话才会去找DNS服务器。
所以这里要先配置好host文件中192.168.17.129 www.123.com (前面的ip要看自己云服务器或者虚拟机的ip是什么),做好域名重定向。
浏览器(客户端)访问nginx,nginx再去访问服务器中的tomcat资源,对外暴露的始终是nginx的地址。
配置如下:
最终效果是:客户端浏览器访问192.168.17.129:80时(要知道80端口号是用的http协议,还有443端口用的https协议,注意网址内容),服务器会请求本地8080端口的资源(在这里是tomcat服务器的资源,也就是tomcat启动成功后看到的首页页面)。
上面是用tomcat测试nginx,而nginx配置文件里一般的server配置模板如下:
# 直接在http块里面粘配置,location指代vue打包文件项目的位置(/root/front_end/pim-vue/dist),server_name一般设置内网ip或者本机IP,listen设置端口号
server {
listen 12345;
server_name localhost;
location / {
root /root/front_end/pim-vue/dist;
try_files $uri $uri/ /index.html;
}
}
[root@VM-20-10-centos conf]# vi nginx.conf
[root@VM-20-10-centos conf]# cd
[root@VM-20-10-centos ~]# cd front_end/
[root@VM-20-10-centos front_end]# cd pim-vue/
[root@VM-20-10-centos pim-vue]# ls
dist
[root@VM-20-10-centos pim-vue]#
实现效果:配置好之后重启nginx,浏览器通过“公网ip:12345”访问服务器,就可以访问到localhost的vue项目(位置是/root/front_end/pim-vue/dist)的资源了。
如果是要做到访问 ip:9001/edu/* 和 ip:9001/vod/* 时转发至不同端口号,可以用如下配置。
这里8001和8002分别是两个tomcat服务器的资源。做的时候注意改掉server.xml的配置(改法就跟上面我改成9090一样)。
location正则表达式的说明:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~ :用于表示uri包含正则表达式,并且区分大小写。(上面的测试用的是这个)
3、~* :用于表示uri包含正则表达式,并且不区分大小写.
4、^~:用于不含正则表达式的 uri 前,要求Nginx服务器找到标识 uri 和请求字符串匹配度最高的location后,立即使用此 location 处理请求,而不再使用location块中的正则uri和请求字符串做匹配。
注意:如果uri包含正则表达式,则必须要有~或者~*标识。
4、nginx配置实例2-负载均衡
事前准备:两个tomcat服务器,设置部署到不同的端口号,开启防火墙端口(如果是腾讯云的宝塔模板服务器的话,不要用39000-40000端口号,
另外,其它版本不知道,反正9.0.62版本的话,如果要部署两台tomcat,配置文件中的server.xml中两个端口号都要改掉)
================================================================================
这里面只有20000是要处理防火墙端口问题,8006不用。
见到页面就成功了。
在各自服务器webapp目录下建文件夹和文件(这里只展示其中一个配置):
<!-- a.html --> <h1>20001</h1>
nginx的配置(注意upstream是在http块内配置):
测试:
我在nginx配置文件中的修改仅限于上图展示的部分,location什么的都没动。这里就可以直接访问到tomcat服务器的webapp下edu文件夹下的a.html。
如果直接访问ip:20000则会访问到tomcat启动页面首页。
关键是下面这种效果,这种效果才说明已经做好了负载均衡。
实际做下来的话,简单的负载均衡就上面几行配置+项目部署就完事了。
Nginx提供了几种分配方式(策略):
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
weight代表权重,默认为1,权重越高被分配的客户端越多。(这东西在upstream内配置:server localhost:20000 weight=5; )
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
下面两种注意分号
3、ip_hash
每个请求按访问的ip的hash结果分配,这样每个访客固定访问一个后端服务器(这是说客户端第一次访问的是A端口,之后就一直访问A端口,除非客户端换个ip地址),可以解决session共享的问题。例如:
upstream myserver {
ip_hash
server localhost:20000;
server localhost:20001;
}
4、fair(第三方)
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
server localhost:20000;
server localhost:20001;
fair
}
5、nginx配置实例3-动静分离
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。
严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。
动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过Nginx来分开。
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
事前准备
tomcat已经准备好了,现在要准备静态资源。
[root@VM-20-10-centos tomcat_nginx_test]# ls apache-tomcat-9.0.62.tar.gz static tomcat_20000 tomcat_20001 [root@VM-20-10-centos tomcat_nginx_test]# tree -a static static ├── html │ └── a.html └── img └── 1.jpg 2 directories, 2 files
<!-- a.html --> <h1>static html</h1>
修改nginx.conf(注意location里面要一一对应)
测试效果:
这里只有开了autoindex on才会有这种效果。一定要是/img/ ,注意斜杠。
这里只是静态的情况,访问的都是图片、html文件。
而直接访问服务器ip,直接跳转到nginx首页,这个就是动态请求的情况。
(直接访问服务器ip默认是跟服务器80端口号建立http链接,自然是跳到nginx首页。而想要跳到tomcat首页,改改配置就好了。或者直接访问前面配置好的tomcat服务器端口号。)
6、nginx配置高可用集群
nginx宕机之后,请求没办法响应。所以搞两个以上的nginx。
7、nginx原理
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/199816.html