用Nginx搭建一个静态的web资源服务器/动静分离
简单使用
1、可以在安装的nginx目录新建自己的目录zy(和conf在一个目录下,也就是和html目录在一个目录下,注意如果使用/zy,那么zy目录需要创建在linux根目录),里面放入我们的一些图片、静态资源等
2、配置nginx的安装目录的/conf/nginx.conf
示例
server { listen 80; #监听端口 server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { #所有的请求 #root html; #root有一些问题就是会将url一些路径带到文件目录中来,所以我们用alias alias zy/ #alias和root功能差不多 index index.html index.htm; #默认访问localhost-->localhost:80/index.html }}
3、启动nginx
./sbin/nginx -s reload
高级功能
1、可以配置文件压缩,将文件压缩后,发送给浏览器 /conf/nginx.conf
gzip on; #打开gzip压缩gzip_min_length 1; #小于1字节的文件不压缩了,不需要在浪费cpu资源来压缩文件gzip_comp_level 2; #压缩级别为2gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;#只有这些文件才被压缩
2、如果项目中有一个目录,需要将他以列表的形式展示出来
配置
location / { alias html/; autoindex on; #开启功能 }
效果
如果没有配置autoindex on;访问下面路径就会出现403不允许访问目录
3、将某些数据的请求限制速度
使用很少的带宽,缓慢的处理这些比较大的数据,目的可以有更多的带宽处理其他的请求响应,对于大并发来说非常有用。
比如一个请求过来了,服务器会给他响应许多的文件下载到客户端的浏览器上,此时我们将一些不是必须展示的大文件限制带宽,给用户访问一些必要的css,js等小文件。
配置:一个100k的图片,需要发送100秒,才能发送完
这样配置了,直接访问/dd.png,就访问不了(没有探索原理)
location / { alias html/; }location /html/dd.png { alias html/dd.png; #限制这张图片的传输带宽 set $limit_rate 1k; #每秒传输这么1k字节}
4、记录access.log 日志
默认的日志格式
main:给日志设置一个名字
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"';
可以给不同的server日志存储在不同的log中(默认每一个服务的日志存储在access.log)
server { listen 8080; server_name localhost; charset utf-8; access_log logs/host.access.log main; #main就是配置的main}
log_format中的内容可以包扩:+第三方模块的额外变量都可以存放到日志中
动静分离
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。通过1ocation 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
用Nginx搭建一个具有缓存功能的反向代理服务(负载均衡)
我们的上游服务器(比如tomcat)是对公网不提供访问,只有Nginx对公网提供访问
我们测试直接使用nginx当做上游服务器
在上游服务器中配置(我们使用nginx充当tomcat,django等):监听的端口加上127.0.0.1,这样这个服务器就不会暴露在外网中,启动服务。
server { listen 127.0.0.1:8080;}
配置反向代理服务器
1、正向代理
反向代理
正向代理和反向代理的区别(参考:)
-
- 位置不同 正向代理,架设在客户机和目标主机之间; 反向代理,架设在服务器端;
- 代理对象不同 正向代理,代理客户端,服务端不知道实际发起请求的客户端; 反向代理,代理服务端,客户端不知道实际提供服务的服务端;
-
- 用途不同 正向代理,为在防火墙内的局域网客户端提供访问Internet的途径; 反向代理,将防火墙后面的服务器提供给Internet访问;
- 安全性不同 正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务; 反向代理都对外都是透明的,访问者并不知道自己访问的是哪一个代理。
测试的时候需要在自己的主机hosts文件添加域名映射,server_name的用处:参考:,,简单就是请求的网址的域名
location配置:目的是,如果没有这些配置,上游服务器如果需要获取客户端连接的一些信息,比如远程地址,host等就会出错,它获取的是反向代理服务的地址。(客户端和反向代理服务器有一个tcp连接,反向代理服务器和上游服务器有一个tcp连接),所以我们可以通过反向代理服务器将客户端的信息通过tcp发送给上游服务器。
location中的其他配置:参考官方文档:
#local是自己的命名的名字(任意),下面proxy_pass需要使用这个名字upstream local { #一定要;结尾,可以配置多个需要代理的服务(负载均衡) server 127.0.0.1:8080;} server { listen 9000; server_name zy.com; location / { #将自己的请求反向代理到 http://local; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://local; }}
负载均衡算法
1、默认采用轮询算法
2、权重(weight,默认为1,分配越高,分配的客户端越多)使用:server 192.168.17.129:8080 weight=5;
3、ip_hash (每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题):使用:
upstream local { ip_hash; server 127.0.0.1:8080 weigth=1;}
4、fair(第三方,按后端服务器的响应时间来分配请求,响应时间短的优先分配。),使用:
upstream local { fair; server 127.0.0.1:8080 weigth=1;}
配置缓存服务器
参考:
如果某一些数据可以允许不需要强一致性,我们可以将这些数据缓存到nginx服务器中,比如缓存1天,此时即使上游服务器对这个请求的响应已经发送更改,我们也不管。
这个做法可以大大提高性能。
配置(删除了其他的配置)
http { proxy_cache_path D://nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;#定义缓存配置 server { listen 9000; server_name zy.com; location / { #使用缓存 proxy_cache my_cache; #缓存大小 proxy_cache_key $host$uri$is_args$args; #同一个url访问nginx,对不同的用户需要返回的缓存不同(所以用户的变量就需要放到缓存的key中) proxy_cache_valid 200 304 302 1d; #对于这些状态进行缓存 #将自己的请求反向代理到 http://local; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://local; }}
GoAccess实现可视化并实时监控access日志
官网:
1、下载:
$ wget https://tar.goaccess.io/goaccess-1.3.tar.gz$ tar -xzvf goaccess-1.3.tar.gz$ cd goaccess-1.3/$ ./configure --enable-utf8 --enable-geoip=legacy$ make# make install
使用(我们使用Real-Time HTML Output来监控)
linux输入命令
注意:You should place your report.html output file under your Web Server document root.
goaccess access.log -o ../html/report.html --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y' --log-format=COMBINED
可以使用绝对定位report.html
添加location
location /report.html { alias /usr/local/nginx/html/report.html; }
访问效果图
配置Nginx集群
1、需求:需要多台nginx服务器
2、解决:在每一台服务器都需要安装nginx和keepalived(可以使用wget下载/或者yum install keepalived -y,安装之后,在etc里面生成目录keepalived,有文件keepalived.conf)
配置主nginx服务器
(对配置文件进行修改:vim /etc/keepalived/keepalived.conf)
! Configuration File for keepalivedglobal_defs {router_id bhz005 ##通过它可以访问到nginx主机,通常为hostname(vim /etc/hosts 里面是127.0.0.1 bhz005,可以任意配置hostname)}## keepalived会定时执行脚本并且对脚本的执行结果进行分析,动态调整vrrp_instance的优先级。这里的权重weight 是与下面的优先级priority有关,如果执行了一次检查脚本成功,则权重会-20,也就是由100 - 20 变成了80,Master 的优先级为80 就低于了Backup的优先级90,那么会进行自动的主备切换。如果脚本执行结果为0并且weight配置的值大于0,则优先级会相应增加。如果脚本执行结果不为0 并且weight配置的值小于0,则优先级会相应减少。vrrp_scriptchk_nginx { script "/etc/keepalived/nginx_check.sh" ##执行脚本位置 interval 2 ##检测时间间隔 weight -20 ## 如果条件成立则权重减20(-20),权重降低退出主服务器master}## 定义虚拟路由 VI_1为自定义标识。vrrp_instance VI_1 {state MASTER ## 主节点为MASTER,备份节点为BACKUP## 绑定虚拟IP的网络接口(网卡),与本机IP地址所在的网络接口相同(我这里是eth6)interface eth6 virtual_router_id 111 ## 虚拟路由ID号,主机和备机需要一样mcast_src_ip 192.168.1.172 ## 本机ip地址priority 100 ##优先级配置(0-254的值)Nopreempt ## advert_int 1 ## 组播信息发送间隔,俩个节点必须配置一致,默认1sauthentication { auth_type PASS auth_pass bhz ## 真实生产环境下对密码进行匹配}track_script {chk_nginx }virtual_ipaddress { 192.168.17.50 ## 虚拟ip(vip),可以指定多个 }}
配置Backup NGINX
! Configuration File for keepalivedglobal_defs {router_id bhz006}vrrp_scriptchk_nginx {script "/etc/keepalived/nginx_check.sh"interval 2weight -20}vrrp_instance VI_1 {state BACKUPinterface eth7virtual_router_id 111mcast_src_ip 192.168.1.173priority 90 ##优先级配置advert_int 1authentication { auth_type PASS auth_pass bhz}track_script { chk_nginx}virtual_ipaddress { 192.168.17.50 }}
脚本
nginx_check.sh脚本把nginx_check.sh脚本分别copy到两台机器的 /etc/keepalived/文件夹下
nginx_check.sh脚本授权。赋予可执行权限:chmod +x /etc/keepalived/nginx_check.sh
#!/bin/bashA=`ps -C nginx–no-header |wc -l`if [ $A -eq 0 ];then /usr/local/nginx/sbin/nginxsleep 2if [ `ps -C nginx --no-header |wc -l` -eq 0 ];thenkillallkeepalivedfifi
启动2台机器的nginx之后。我们启动两台机器的keepalived
/usr/local/nginx/sbin/nginxservicekeepalived startps -ef | grep nginxps -ef | grep keepalived
测试虚拟ip的绑定,浏览器可以通过虚拟ip访问