Nginx----进阶

用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一些路径带到文件目录中来,所以我们用aliasalias   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; #压缩级别为2
gzip_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中的内容可以包扩:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables+第三方模块的额外变量都可以存放到日志中

 

动静分离

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、正向代理

 

 反向代理

正向代理和反向代理的区别(参考:https://blog.csdn.net/wuliuwei1234/article/details/80803069)

    • 位置不同 
      正向代理,架设在客户机和目标主机之间; 
      反向代理,架设在服务器端;
    • 代理对象不同 
      正向代理,代理客户端,服务端不知道实际发起请求的客户端; 
      反向代理,代理服务端,客户端不知道实际提供服务的服务端; 
    • 用途不同 
      正向代理,为在防火墙内的局域网客户端提供访问Internet的途径; 
      反向代理,将防火墙后面的服务器提供给Internet访问;
    • 安全性不同 
      正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此必须采取安全措施以确保仅为授权的客户端提供服务; 
      反向代理都对外都是透明的,访问者并不知道自己访问的是哪一个代理。

 

测试的时候需要在自己的主机hosts文件添加域名映射,server_name的用处:参考:https://blog.csdn.net/cheng_kohui/article/details/82930464,https://blog.csdn.net/qq_40737025/article/details/85053164,简单就是请求的网址的域名

location配置:目的是,如果没有这些配置,上游服务器如果需要获取客户端连接的一些信息,比如远程地址,host等就会出错,它获取的是反向代理服务的地址。(客户端和反向代理服务器有一个tcp连接,反向代理服务器和上游服务器有一个tcp连接),所以我们可以通过反向代理服务器将客户端的信息通过tcp发送给上游服务器。

location中的其他配置:参考官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html

#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;
}

  

配置缓存服务器

参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache

如果某一些数据可以允许不需要强一致性,我们可以将这些数据缓存到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日志

官网:https://goaccess.io

1、下载:https://goaccess.io/download

$ 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 ## 组播信息发送间隔,俩个节点必须配置一致,默认1s
authentication {  auth_type PASSauth_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 2
weight -20
}vrrp_instance VI_1 {
state BACKUP
interface eth7
virtual_router_id 111
mcast_src_ip 192.168.1.173
priority 90 ##优先级配置
advert_int 1
authentication {auth_type PASSauth_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/bash
A=`ps -C nginx–no-header |wc -l`
if [ $A -eq 0 ];then/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killallkeepalived
fi
fi

启动2台机器的nginx之后。我们启动两台机器的keepalived

/usr/local/nginx/sbin/nginx
servicekeepalived start
ps -ef | grep nginx
ps -ef | grep keepalived

测试虚拟ip的绑定,浏览器可以通过虚拟ip访问

 

转载于:https://www.cnblogs.com/yanxiaoge/p/11546073.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET页面生命周期描述

ASP.NET页面生命周期描述2008-09-12 09:25在以前写个一篇关于ASP.NET页面生命周期的草稿,最近又看了看ASP.NET,做个补充,看看页面初始过程到底是怎么样的 下面是ASP.NET页面初始的过程: 1. Page_Init(); 2. Load ViewState; 3. Load Postback data; 4. Page_Load();…

小程序·云开发的HTTP API调用丨实战

小程序云开发之httpApi调用。 小程序云开发之httpApi调用(返回“47001处理”) 技术栈 采用 nodejs express 搭建web服务器,采用 axios 请求第三方 httpApi nodejsexpressaxios 项目结构 通过应用生成器工具 express-generator 可以快速创建一…

Java hashCode() 和 equals()使用的场景

第3部分 hashCode() 的作用 hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。 hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCo…

坚守基本的职业信仰

深陷公司的政治斗争会让任何当事人都疲于奔命,尤其是当这种斗争的双方都是您的上级。除非您一开始就能够知道最终的斗争结果,否则任何具有倾向性的言行都会给自己带来难堪。 深陷入别人的职业斗争是一个职业经理人职业生涯最大的不幸,除非…

Zookeeper----基本原理

Zookeeper作用是什么? 协调分布式系统中的多个服务器,使得系统可以正常工作。 Zookeeper提供了什么? 实际上他只提供了三个东西,一个是文件系统,一个是通知机制,还有一个是集群管理机制 Zookeeper可以做什么…

Java 中 Comparable 和 Comparator 比较

Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通…

spgridview的过滤功能回调时发生错误~

代码中启用了过滤功能, 但当点击过滤的列时发生错误: error: spgridview_filtercallbackerrorhandler() was called - result 回调时发生错误... 详细见: HTML代码: AllowFiltering"True"FilterDataFields",Name,,…

web---SSL/TSL

对称加密 加密算法秘钥(双方持有相同的秘钥),A使用加密算法秘钥加密文件,B使用加密算法秘钥解密文件; 演示一个对称加密RC4算法 注意:RC4加密是有漏洞的 明文和秘钥进行异或得到密文,密文和秘钥…

讨论了好久的问题,IE、Firefox下CSS图片垂直居中的问题

通过百度和谷歌找了好久都没找着一个合适的方法。以下是自己找出的一种方法,自认为还可以,而且,也方便简单。IE:当容器为div,或者tr,只要把容器的Css属性line-height设置成容器的高度就行了.当容器为a,且容器的css属性display为inline-block或…

Nginx----实现https站点

1、首先给域名设置证书,可以去阿里云购买 1、下载自动化脚本 目的:帮我们自动在nginx配置中添加证书 yum install python2-certbot-nginx2、输入命令 certbot --nginx --nginx-server-root/usr/local/openresty/nginx/conf/ -d zy.com 选择我们的url请求…

TCP/IP四层模型和OSI七层模型的概念

TCP/IP四层模型 TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。TCP/IP协议簇分为四层,IP位于协议簇的第二层(对应OSI的第三层),TCP位于协议簇的第三层(对应OSI的第四层)。 TCP/IP通讯协议采用了4层的层级结构&…

setsockopt()用法(转载)

1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用 closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddrTRUE; setsockopt(s,SOL_SOCKET ,…

Nginx----OpenResty

概要 OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。OpenRestye通过汇聚各种设计精良的Nginx模块(主要由O…

《深入浅出Google Android》即将隆重上市!

《深入浅出 Google Android 》 作者在线答疑活动开始啦 :http://www.hiapk.com/bbs/forum-41-1.html 随着越来越多的手机 厂商和移动运营商加入了开放手机联盟, Android 平台 越来越受到广大开发 者的关注和推崇。 本书是是国内最早的 And…

MySQL两种引擎

Innodb引擎概述 Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Inno…

公钥基础设施PKI体系介绍

PKI(Pubic Key Infrastructure)是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。用户可利用PKI平台提供的服务进行安全通信。 使用基于公钥技术系统的用户建立安全通信信任机制的基础是:网上进行的任何需要安全服务的通信都是建…

Flag counter被博客园禁了的解决方法

突然发现Flag counter展示不出来 一开始还以为是网速的问题,后来搜了搜才知道博客园把Flag counter禁了....之前的访问量全没了5555(虽然也没多少) 只好换一个记录访问量的好了:https://clustrmaps.com/ 进去之后创建账户 把网址贴…

ORM是什么?如何理解ORM

一、ORM简介 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对…

oracle调整Lock_sga参数而不使用虚拟内存

由于几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也不能避免操作系统将SGA换到虚拟内存(SWAP)。所以我们可以尝试使得SGA锁定在物理内存中不被换到虚拟内存中,这样减少页面的换入和换出&…

Nginx----高级

Nginx请求流程 Nginx进程结构 Nginx有两种进程结构,一种是单进程(可以用于测试),一种是多进程(用于生产,默认) Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(work…