Nginx的学习和搭建
【一】nginx基本概念
【1】nginx是什么?
nginx是一个高性能的http和反向代理服务器
占用内存少,并发能力很强,在网页服务器中表现好,专门为性能优化而开发,能支持50000个并发连接数
【2】nginx能实现哪些功能?
nginx具有丰富的配置功能,以满足不同的需求。以下是一些常见的配置功能:
(1)虚拟主机:nginx可以配置多个虚拟主机,使得一个服务器可以托管多个网站或应用程序。
(2)反向代理:可以将客户端请求转发到后端服务器,实现负载均衡和高可用性。
(3)缓存:支持HTTP缓存,可以缓存静态文件,减轻后端服务器的负载,提高访问速度。
(4)SSL/TLS支持:可以配置HTTPS协议,保证数据传输的安全性。
(5)URL重写:可以通过配置重写规则,实现URL的重定向和转发。
(6)Gzip压缩:支持对响应内容进行压缩,减小传输数据的大小,提高加载速度。
(7)访问限制:可以配置IP白名单、黑名单或使用HTTP Basic Authentication对访问进行限制。
(8)日志记录:支持将请求和错误信息记录到日志文件中,方便排查问题和进行统计分析。
(9)缓存控制:可以配置缓存策略,设置缓存时间、缓存大小等参数。
(10)动态模块支持:nginx可以通过动态模块进行功能扩展,例如Lua脚本、HTTP/2支持等。
这些只是nginx配置功能的一部分,还有很多其他的配置选项可以根据具体需求进行配置。
【3】反向代理
正向代理概念:如果把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过代理服务器来访问,这种代理服务就是正向代理
反向代理概念:客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。(而正向代理需要配置一个代理服务器)我们只需要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
正向时把代理设在用户那,反向代理时把代理设在服务器那
【4】负载均衡
在需求量特别大的时候,优化服务器已经满足不了需求了
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,吧原先请求集中到单个服务器上的情况改为把请求分发到多个服务器上,把负载分发到不同的服务器上,这就是所说的负载均衡。
【5】动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
【二】nginx安装、常用命令和配置文件
【1】在linux系统中安装nginx
参考的安装教程:Linux安装nginx教程
(1)安装gcc
gcc时linux下的编译器,可以先查看gcc的版本确定是否已安装
gcc -v
安装命令
yum -y install gcc
(2)安装pcre、pcre-devel
pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式
安装命令
yum install -y pcre pcre-devel
(3)安装zlib
Zlib库提供了很多压缩和解压缩方式,nginx使用zlib对http包的内容进行gzip
安装命令
yum install -y zlib zlib-devel
(4)安装openssl
openssl时web安全通信的基石,没有openssl,所有信息等于在裸奔
安装命令
yum install -y openssl openssl-devel
(5)下载nginx安装包
wget http://nginx.org/download/nginx-1.9.9.tar.gz
(6)把压缩包解压到usr/local/java文件夹下
【tar命令学习地址:https://www.cnblogs.com/lizm166/p/7975744.html】
tar zxvf nginx-1.9.9.tar.gz -C /usr/local/java
(7)切换到nginx的下载文件夹下面,并且执行三个命令
cd /usr/local/java/nginx-1.9.9/
./configure
//configure命令的学习地址:https://www.jb51.net/LINUXjishu/363271.html
make
make install
./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
make 是用来编译的,它从Makefile中读取指令,然后编译。
make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
参考学习地址:https://cloud.tencent.com/developer/article/1144493
(8)回到nginx安装目录,并且开始编辑配置文件nginx.conf,可以修改端口号
cd /usr/local/nginx/conf
(9)启动nginx服务
切换到/usr/local/nginx/sbin下面
执行启动命令
./nginx
(10)查看nginx服务是否启动成功
ps -ef | grep nginx
(11)访问一下自己的服务器ip
https://192.168.19.2:80/
如果访问不通的话可能就是防火墙的问题
方案一:直接关闭防火墙
service firewalld status
service firewalld stop
方案二:配置防火墙使80端口可以访问
查看防火墙信息: firewall-cmd --list-all
添加端口号: sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙: firewall-cmd --reload
再查看防火墙信息:firewall-cmd --list-all
【2】nginx常用命令
前提:必须进入nginx的目录中(/usr/local/nginx/sbin)才能使用对应的命令
1-启动nginx
./nginx
2-关闭nginx
./nginx -s stop
3-重新加载nginx
./nginx -s reload
【3】nginx配置文件
主要由三部分组成
(1)第一部分:全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
worker_processes 1;
这是nginx服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也就越多,但是会受到硬件、软件等设备的制约
(2)第二部分:events块
events {
worker_connections 1024;
}
events块影响的主要是nginx服务器与用户的网络连接,上述例子就表示最大连接数为1024
这部分的配置对nginx的性能影响较大,在实际中应该两个配置
(3)第三部分:http块
这里是nginx服务器配置中最频繁的部分,代理、缓存、和日志定义等绝大多数功能和第三方模块的配置都在这里。
【4】nginx配置实例
准备工作:先装一个tomcat服务器,并且在防火墙中配置防疫访问的端口号
(1)先装JDK
yum -y install java-1.8.0-openjdk.x86_64
java -version
(2)安装tomcat
1-检查linux是否已经安装tomcat
rpm -qa|grep tomcat
2-下载tomcat压缩包,然后从mac传到服务器
scp -r /Users/sunzhi/Downloads/apache-tomcat-8.5.23.tar.gz root@192.168.**.*:/tmp/
3-进入tmp文件下开始解压,放置
tar xzf apache-tomcat-8.5.23.tar.gz
mv apache-tomcat-8.5.23 /usr/local/tomcat8
4-启动一下tomcat
/usr/local/tomcat8/bin/startup.sh
5-查看启动日志
tail -300f /usr/local/tomcat8/logs/catalina.out
6-看一下端口开通情况
netstat -anp|grep 8080
Mac上传文件到服务器的学习地址:点这里
(3)给防火墙加个8080允许访问
查看防火墙信息: firewall-cmd --list-all
添加端口号: sudo firewall-cmd --add-port=8080/tcp --permanent
重启防火墙: firewall-cmd --reload
再查看防火墙信息:firewall-cmd --list-all
(4)在本地查看一下通过端口能不能访问到
地址:http://192.168.**.*:8080/
(改成自己虚拟机的ip地址)
【三】配置实例
【1】反向代理【实例一】
(1)实现效果
在打开浏览器输入地址:www.123.com,会跳转到linux系统tomcat主页面中
Mac如何配置/etc里的host的学习地址:https://zhuanlan.zhihu.com/p/100372959
(2)准备工作
在linux系统中先安装一个tomcat,使用默认端口8080
(3)图示
(4)修改配置文件/usr/local/conf/nginx.config
(5)重启一下nginx,然后再看效果
到/usr/local/sbin目录下面去执行命令
./nginx -s reload
再访问www.123.com看看效果,原来访问80端口访问的应该是nginx的页面,但是现在显示的是8080端口的tomcat页面
(6)简单整理一下逻辑
当访问的ip+端口是配置中的192.168.19.2:80的时候,就会代理请求到配置里的8080端口
这也就实现了反向代理
【2】反向代理【实例二】
(1)实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
nginx监听端口为9001
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082
(2)实验代码
第一步:准备两个tomcat,一个8001端口,一个8002端口(修改文件 /tomcat8_8002/conf/server.xml 把端口号port改成8002),并且准备好测试的页面8002.html
除了8080改成8082,其他的端口号也改一下,确保两个tomcat的端口号都不一样就行:
然后把原来tomcat启动的服务器关掉,再把两个tomcat的服务器都重新启动一下
ps -ef | grep tomcat
kill -9 5536
kill -9 96782
/usr/local/tomcat8/bin/startup.sh
/usr/local/tomcat8_8002/bin/startup.sh
然后就是给防火墙添加两个端口号,访问下面两个链接进行测试
http://192.168.19.2:8081/
http://192.168.19.2:8082/
第二步:给两个tomcat里面分别加上一个显示的html页面
目录就是 /tomcat8/webapps/,分别新建两个文件夹 /edu 和 /vod
新建一个html文件并且写一点内容
touch show.html
http://192.168.19.2:8081/edu/show.html
http://192.168.19.2:8082/vod/showvod.html
现在两个服务器的路径都可以单独访问成功了,接下来就是用nginx来代理这两台服务器了
第三步:修改nginx的配置文件
在http块中添加server,location就是转发的意思,另外这里就要多学习配置的正则表达式了
配置完成后重启一下nginx服务器
sbin目录下:./nginx -s reload
然后给9001端口加个防火墙通道
然后就可以开始访问代理的路径了
把刚才两个分别端口访问的路径改成统一nginx的端口9001
http://192.168.19.2:8081/edu/show.html
http://192.168.19.2:8082/vod/showvod.html
http://192.168.19.2:9001/edu/show.html
http://192.168.19.2:9001/vod/showvod.html
搞定!!!
【3】负载均衡
(1)实现效果
浏览器地址输入: http://192.168.19.2/edu/show.html ,负载均衡把请求平均分到8081和8082中去
(2)使两个服务器中都有 /edu/show.html 这个文件
原来两个服务器中的文件路径和内容都是不一样的,这样可以实现多个服务器的反向代理,使得访问同一个nginx的端口号,却可以根据2个不同的请求内容区分访问2个不同的服务器。但是现在在两个服务器中都创建同样的文件,这样可以实现的是1个请求到nginx服务器后,平均分到2个服务器上去访问相同的内容。
在端口为8002的tomcat里也加上一个 /edu/show.htm 的文件
http://192.168.19.2:8081/edu/show.html
http://192.168.19.2:8082/edu/show.html
(3)修改nginx.conf的配置
现在http范围里加上负载均衡的配置,myserver是自定义的名字,里面列出负载均衡的列表
然后再加一个server
(4)重启nginx服务器,然后访问地址,不停的刷新,就会发现每次显示的内容都不一样,会轮流访问到8081和8082两个tomcat上去
http://192.168.19.2/edu/show.html
(5)负载均衡的分配服务器策略
第一种
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
第二种
weight权重:权重默认为1,权重越高,被分配的客户端就越多
第三种
is_path:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
第四种
fair方式:按照后端服务器的响应时间来分配请求,响应时间短的优先分配
(6)动静分离
nginx动静分离简单来说就是把动态跟静态请求分来,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用nginx处理静态页面,tomcat处理动态页面。
动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。(如果是分来放在独立的服务器上就是多服务器的反向代理,如果是混合放在一起就是nginx来负载均衡)
通过location指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。这种方法非常适合不经常变动的资源(如果是经常更新的文件,不建议使用expires来缓存),设置3d,表示在这3天之内访问这个url,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200
(1)准备工作
在linux中准备好访问的静态资源
(2)nginx配置
可以看到,在lcoation中进行了代理,如果链接中有www或者image等关键字的时候,nginx会自动定位到/data/文件夹下面,如果没有配置的话,就不会自动定位了
(3)查看效果
浏览器地址:http://192.168.19.2/image/IMG_4751.JPG
因为配置文件里写了 autoindex on ,表示列出文件的内部,也就是说如果只输入 http://192.168.19.2/image/ 的话,可以看到文件夹的内部结构的
浏览器地址:http://192.168.19.2/www/show.html
【4】Nginx的其他常用配置
【5】配置高可用集群(未完待续)
如果只有一个nginx服务器,这个服务器宕机后,所有的请求也就无法到达tomcat了。要想实现高可用,可以用多个nginx服务器组成一个集群,主从结构,如果主服务器挂掉了,就会切换到备份的服务器,从而保证系统不会因为nginx服务器宕机而挂掉
对外暴露的虚拟ip是17.50,但是主从nginx服务器的ip分别不同,暴露的ip主要是和主服务器绑定在一起的,每个nginx服务器都有一个keeplived,相当于一个路由,会通过脚本判断当前的nginx服务器是否还活着,如果当前的服务器挂掉了,keeplived就会把暴露的ip和备用的服务器ip绑定在一起。
此时需要两个虚拟机的服务器,在两个服务器都安装nginx,并且在两个服务器上都安装keepalived
yum install -y keepalived
修改/etc/keepalived/keepalive.conf配置文件,keeplived的配置如下
还要写一个检测服务器是否还活着的脚本,放在上图中提到的 /usr/local/src/nginx_check.sh 路径下面
#!/bin/bash
A='ps -C nginx -no-header |wc -1'
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ 'ps -C nginx --no-header |wc -1' -eq 0 ] then
killall keepalived
fi
fi
备份服务器的配置文件如下,对应的脚本内容也是一样的
在sbin目录下先启动nginx服务器,然后启动keepalived
systemctl start keepalived.service
systemctl reload keepalived.service
查看一下启动的端口号
ps -ef | grep keepalived
浏览器输入地址
查看虚拟ip的使用情况,确保虚拟ip已经挂载
ip addr show ens33
虚拟ip一直ping不通的问题解决
1-关闭所有防火墙
service firewalld status
service firewalld stop
2-查看虚拟ip的使用情况,确保虚拟ip已经挂载
ip addr show ens33
3-注释默认的vrrp_strict,然后重启
未解决,待定!!!
【6】Nginx开启压缩配置
Nginx可以通过压缩来减小传输的数据量,提高网站的性能。压缩可以减少网络传输的时间和带宽消耗,并且可以加快页面加载速度。在Nginx中,可以通过以下配置来启用压缩:
打开Nginx的配置文件(一般是nginx.conf)。
在http块中添加以下配置:
http {
gzip on;
gzip_types text/plain text/css application/javascript application/xml;
gzip_min_length 1000;
gzip_comp_level 6;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
gzip_proxied any;
...
server {
listen 80;
server_name localhost;
...
location / {
# 将压缩后的数据发送给客户端
gzip_static on;
# 转发请求给后端服务器
proxy_pass http://backend;
}
}
...
}
这些配置的含义如下:
(1)gzip on;:启用gzip压缩。
(2)gzip_types:指定需要压缩的文件类型。
(3)gzip_min_length:指定压缩文件的最小长度,小于该值的文件不会被压缩。
(4)gzip_comp_level:指定压缩级别,范围是1到9,数字越大压缩比越高,但同时也消耗更多的CPU资源。
(5)gzip_vary:在响应头中添加Vary: Accept-Encoding,以便告诉缓存服务器根据不同的Accept-Encoding来缓存不同版本的内容。
(6)gzip_disable:指定一些浏览器(如旧版的IE)不使用gzip压缩。
(7)gzip_proxied:指定在代理服务器上启用gzip压缩。
保存配置文件并重新启动Nginx服务。
通过以上配置,Nginx会在发送响应时对指定的文件类型进行压缩,并在响应头中添加Content-Encoding: gzip,告知客户端使用gzip解压缩响应内容。这样就实现了Nginx的压缩功能。
需要注意的是,在使用 gzip 压缩时,需要确保客户端浏览器支持 gzip 压缩,否则可能会导致无法正常访问网站或者访问速度变慢。
【四】nginx原理
【6】学习地址整理
1-配置的总结文章
https://blog.csdn.net/wangbin_0729/article/details/82109693
2-正则表达式文章
https://blog.csdn.net/qq_33862644/article/details/79337348
#访问根目录/, 比如http://localhost/ 将匹配规则A
location = / {
#规则A
}
#访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
location = /login {
#规则B
}
#访问 http://localhost/static/a.html 将匹配规则C
location ^~ /static/ {
#规则C
}
#访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C
location ~ \.(gif|jpg|png|js|css)$ {
#规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
}
#访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,
http://localhost/a.XHTML不会匹配规则G,(因为!)。规则F,规则G属于排除法,符合匹配规则也不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。