nginx是一个高性能的http和反向代理服务器
占用内存少,并发能力很强,在网页服务器中表现好,专门为性能优化而开发,能支持50000个并发连接数
正向代理概念:如果把局域网外的internet想象成一个巨大的资源库,则局域网中的客户端要访问internet,则需要通过代理服务器来访问,这种代理服务就是正向代理
反向代理概念:客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。(而正向代理需要配置一个代理服务器)我们只需要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
在需求量特别大的时候,优化服务器已经满足不了需求了
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,吧原先请求集中到单个服务器上的情况改为把请求分发到多个服务器上,把负载分发到不同的服务器上,这就是所说的负载均衡。
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力
参考的安装教程:Linux安装nginx教程
gcc时linux下的编译器,可以先查看gcc的版本确定是否已安装
gcc -v
安装命令
yum -y install gcc
pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式
安装命令
yum install -y pcre pcre-devel
Zlib库提供了很多压缩和解压缩方式,nginx使用zlib对http包的内容进行gzip
安装命令
yum install -y zlib zlib-devel
openssl时web安全通信的基石,没有openssl,所有信息等于在裸奔
安装命令
yum install -y openssl openssl-devel
wget http://nginx.org/download/nginx-1.9.9.tar.gz
【tar命令学习地址:https://www.cnblogs.com/lizm166/p/7975744.html】
tar zxvf nginx-1.9.9.tar.gz -C /usr/local/java
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
cd /usr/local/nginx/conf
切换到/usr/local/nginx/sbin下面
执行启动命令
./nginx
ps -ef | grep nginx
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
前提:必须进入nginx的目录中(/usr/local/nginx/sbin)才能使用对应的命令
1-启动nginx
./nginx
2-关闭nginx
./nginx -s stop
3-重新加载nginx
./nginx -s reload
主要由三部分组成
1-第一部分:全局块
从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令
worker_processes 1;
这是nginx服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也就越多,但是会受到硬件、软件等设备的制约
2-第二部分:events块
events {
worker_connections 1024;
}
events块影响的主要是nginx服务器与用户的网络连接,上述例子就表示最大连接数为1024
这部分的配置对nginx的性能影响较大,在实际中应该两个配置
3-第三部分:http块
这里是nginx服务器配置中最频繁的部分,代理、缓存、和日志定义等绝大多数功能和第三方模块的配置都在这里。
准备工作:先装一个tomcat服务器,并且在防火墙中配置防疫访问的端口号
yum -y install java-1.8.0-openjdk.x86_64
java -version
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上传文件到服务器的学习地址:点这里
查看防火墙信息: firewall-cmd --list-all
添加端口号: sudo firewall-cmd --add-port=8080/tcp --permanent
重启防火墙: firewall-cmd --reload
再查看防火墙信息:firewall-cmd --list-all
地址:http://192.168.**.*:8080/
(改成自己虚拟机的ip地址)
在打开浏览器输入地址:www.123.com,会跳转到linux系统tomcat主页面中
Mac如何配置/etc里的host的学习地址:https://zhuanlan.zhihu.com/p/100372959
在linux系统中先安装一个tomcat,使用默认端口8080
到/usr/local/sbin目录下面去执行命令
./nginx -s reload
再访问www.123.com看看效果,原来访问80端口访问的应该是nginx的页面,但是现在显示的是8080端口的tomcat页面
当访问的ip+端口是配置中的192.168.19.2:80的时候,就会代理请求到配置里的8080端口
这也就实现了反向代理
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
第一步:准备两个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就是转发的意思,另外这里就要多学习配置的正则表达式了
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
搞定!!!
浏览器地址输入: http://192.168.19.2/edu/show.html ,负载均衡把请求平均分到8081和8082中去
原来两个服务器中的文件路径和内容都是不一样的,这样可以实现多个服务器的反向代理,使得访问同一个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
现在http范围里加上负载均衡的配置,myserver是自定义的名字,里面列出负载均衡的列表
http://192.168.19.2/edu/show.html
第一种
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
第二种
weight权重:权重默认为1,权重越高,被分配的客户端就越多
第三种
is_path:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
第四种
fair方式:按照后端服务器的响应时间来分配请求,响应时间短的优先分配
【3.4】动静分离
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
如果只有一个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
1-关闭所有防火墙
service firewalld status
service firewalld stop
2-查看虚拟ip的使用情况,确保虚拟ip已经挂载
ip addr show ens33
3-注释默认的vrrp_strict,然后重启
未解决,待定!!!
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作为方向代理服务器存在。