Nginx学习笔记

时间:2019/11/4

Nginx简介

Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,
中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

国内有企业有哪些在使用nginx服务器:
国内使用Nginx的网站:新浪、网易、腾讯、CSDN、酷六、水木社区、豆瓣、六房间、小米等。

服务器
Web服务器专门处理HTTP请求,应用服务器通过各种协议来为客户端提供业务逻辑。以J2EE为例,Web服务器主要处理静态页面

部分web服务器作为Servlet容器,解释和执行servlet/JSP, 一般称之为轻量级应用服务器

而应用服务器主要运行业务逻辑,如EJB、 JNDI和JMX等J2EE API,还包含事物管理、数据库连接等功能。因此,在企业级应用中,应用服务器提供的功能比Web服务器强大得多。

Nginx优点
1.高并发连接:
官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。

2.内存消耗少:
在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。

3.配置文件非常简单:
风格跟程序一样通俗易懂。

4.成本低廉:
Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。

5.支持Rewrite重写规则:
能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。

6.内置的健康检查功能:
如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。

7.节省带宽:
支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。

8.稳定性高:
用于反向代理,宕机的概率微乎其微。

Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 。它支持内 核Poll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。 Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器。例如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。Nginx官方表示保持 10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说基本上是毫无用处的。就稳定性而言,nginx比lighttpd更胜一筹。 Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运 行数个月也不需要重新启动。你还能够在不间断服务的情况下,对软件版本进行进行升级。 Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁 盘I/O的阻塞延迟。 Nginx代码质量非常高,代码很规范,手法成熟, 模块扩展也很容易。 Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),accept-filter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性 能。

环境搭建
官网下载地址:http://nginx.org/en/download.html
最新版本:http://nginx.org/download/nginx-1.17.5.tar.gz
步骤:
解压:
/usr/local:你的解压路径
1.进行安装:tar -zxvf nginx-1.16.1.tar.gz
tar -zxvf nginx-1.16.1.tar.gz -C /usr/local

2.下载所需要的依赖库文件:
yum install pcre -y
yum install pcre-devel -y
yum install zlib -y
yum install zlib-devel -y

注意:如果出现这个错误:./configure: error: C compiler cc is not found
执行这个命令:(没出现错误也执行一下,稳)
yum -y install gcc gcc-c++ autoconf automake make

3.进行configure配置,查看是否报错:编译前配置
cd /usr/local/nginx-1.16.1
./configure --prefix=/usr/local/nginx

4.编译安装:make && make install
cd /usr/local/nginx-1.16.1
make && make install

5.在 /usr/local/nginx目录下,可以看到如下4个目录
conf配置文件,html网页文件,logs日志文件,sbin主要二进制程序

6.启动命令:/usr/local/nginx/sbin/nginx
关闭命令:/usr/local/nginx/sbin/nginx -s stop
重启命令:/usr/local/nginx/sbin/nginx -s reload

7.可以使用netstat -ano| grep 80 查看端口.
ps -ef | grep nginx

8.访问浏览器:http://192.168.122.133(你的IP 命令ip addr可获取)(看到欢迎页面说明没问题)
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld

核心功能

1.作为静态服务器,访问静态资源
案例:访问静态文件:demo1
demo1及之后的demo2下载链接:链接:https://pan.baidu.com/s/1gzRAVjPhtKEuV5WktEAEcw
提取码:14o3

1.将demo1放进某一目录下
Nginx学习笔记_第1张图片
2.进入Nginx安装目录的配置文件conf目录下
文本编辑器打开 nginx.conf配置文件,参考下图进行修改,编辑完后记得保存。

[root@bob demo1]# cd /usr/local/nginx/conf
[root@bob conf]# vi nginx.conf
#启动nginx
[root@bob conf]#/usr/local/nginx/sbin/nginx

Nginx学习笔记_第2张图片
下面配置可参考https://www.cnblogs.com/wuxianqiang/p/10705212.html
server {
listen 8080; //监听的端口号
server_name localhost; //用域名方式访问的地址
location / {
//项目路径 /usr/local/software/demo1
root /usr/local/software/demo1;
//项目默认访问首页 hello.html
index hello.html; }
}

server #虚拟主机:可以理解配置一个项目
listen #监听的端口
server_name #访问服务器域名 或者ip

location #匹配的路径

/ #映射路径
root #web根路径
index #默认的首页

访问http://你的ip:端口 ; 如: http://192.168.15.132:8080/看是否能访问成功。
访问结果

Nginx学习笔记_第3张图片

动静分离(动态资源和静态资源分离)

当静态资源被访问时,nginx能够处理,但当动态资源被访问时,nginx无法处理,解决方式是让nginx将动态资源请求转发到Tomcat处理。那么怎么实现呢,请看下面的栗子。

案例2:
将demo拖进linux路径
Nginx学习笔记_第4张图片
demo2中有一个静态资源static文件夹,一个后台项目的jar包,使用命令启动该项目
如图一:可以看到端口号是:8888;在浏览器中进行访问,结果如图二,这个访问是没有经过nginx直接访问的。Nginx学习笔记_第5张图片
图一
在这里插入图片描述
图二

进入到nginx配置文件目录下

[root@bob nginx]# cd conf

使用编辑器打开nginx.conf,进行如下配置
Nginx学习笔记_第6张图片
测试:现在通过访问8080端口,让我们的访问经过nginx,结果如下
在这里插入图片描述
显然也能访问到

通过访问8080端口,让我们的访问经过nginx,访问一下静态资源看看
Nginx学习笔记_第7张图片
Nginx学习笔记_第8张图片


正向代理
Nginx学习笔记_第9张图片
由于某种需要要去访问国外的某些网站,此时你会发现位于国外的某网站我们通过浏览器是没有办法访问的,这时可以找到一个可以访问国外网站的代理服务器,将请求发送给代理服务器,代理服务器去访问国外的网站,然后将访问到的数据传递给我们

上述这样的代理模式称为正向代理,

正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;

反向代理
Nginx学习笔记_第10张图片
图解大家就可以看清楚了,多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息!

负载均衡

#设定负载均衡的服务器列表
#upstream myproject {
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}

#webapp
upstream myapp {   
    server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;   
    server 192.168.122.134:8080 weight=1 max_fails=2 fail_timeout=30s;   
} 

http 这个模块下配置

upstream myapp {
server 127.0.0.1:8888 weight=1 max_fails=2 fail_timeout=30s;
server 127.0.0.1:9999 weight=1 max_fails=2 fail_timeout=30s;
}

server模块下配置
location / {
proxy_pass http://myapp;
proxy_set_header X-real-ip $remote_addr;
}

负载均衡实现手段
1)使用硬件负载均衡策略,如使用F5,Array等负载均衡器.
2)使用软件进行负载均衡
3)如使用阿里云服务器均衡SLB
4)使用我们今天所学习的Nginx+Keepalived
5)其他软件负载均衡如LVS(Linux Virtual Server),haproxy等技术

负载均衡策略
nginx 目前支持 4 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

2)、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

2)、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

3)、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

4)、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

案例:
依旧是使用demo2
在这里插入图片描述
改变端口号(之前端口是8888),再开启一个项目
打开配置文件进行配置(在修改配置文件前最好使用cp命令备份一份)

Nginx学习笔记_第11张图片
重启nginx在这里插入图片描述
Nginx学习笔记_第12张图片

虚拟主机配置
实现目标:原本是使用ip进行访问:http://192.168.15.132:8080/iptest
现在使用域名也能进行访问:http://www.huawuque.crm.com/iptest

nginx虚拟主机配置:
3种方式:

1>居于ip的虚拟主机(基本不用)
2>居于域名的虚拟主机
3>居于端口的虚拟主机

修改:真实开发中, 必须申请域名绑定ip
测试: 使用假域名, 虚拟域名:

1.linux:
#域名和ip绑定

vi  /etc/hosts

127.0.0.1 www.xiaoyuer.crm.com
127.0.0.1 www.huawuque.crm.com
在这里插入图片描述
2.修改完后重新启动
/etc/init.d/network restart(某些电脑使用这条命令会出问题,用下面这条解决)
reboot

3.windows 做修改
找到C:\Windows\System32\drivers\etc路径下的hosts文件(文件后缀先忽略不管)
window:
192.168.168.132 www.xiaoyuer.crm.com
192.168.168.132 www.huawuque.crm.com
Nginx学习笔记_第13张图片
粘贴进来 目的:使本地DNS能够解析这两个域名
在这里插入图片描述
4.nginx配置文件配置
编辑完后,记得保存退出。
Nginx学习笔记_第14张图片

日志配置

日志文件
nginx访问日志放在log/host.access.log下,并且使用main格式(支持自定义格式)
对于main格式配置如下:

#日志文件输出格式这个位置相当于全局设置
 #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 #'$status $body_bytes_sent "$http_referer" '
 #'"$http_user_agent" "$http_x_forwarded_for"';

192.168.168.1 - - [03/Oct/2019:09:58:17 -0400] “GET /favicon.ico HTTP/1.1” 200 946 “http://www.dafei.crm.com/iptest” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36”

针对某个server的日志记录
#access_log logs/access.log main;
查看日志内容命令:tail -n 100 -f access.log

nginx日志保存位置: 可以使用cat命令打开access.log文件看一下
Nginx学习笔记_第15张图片

日志文件的切割
系统运行起来之后,我们需要对nginx日志的分析,得到响应耗时的url,请求时间,以及这段时间的请求量和并发量.通过分析找到优化系统的方案.所以需要运维人员对nginx的日志进行切割和分析处理.我们会通过定时器定时将日志按天/小时进行备份.

思路:假如每天的日志都保存为一份日志文件,首先需要创建一个文件夹保存这些日志文件。然后创建一个shell脚本,脚本执行代码就是在一天后将nginx默认保存日志的日志文件拷贝一份到我们创建日志保存文件夹中,然后清空该日志文件。然后设置每过一天执行这个脚本。

实现定时备份日志:<按下述步骤执行>
第一步:分析如何去实现日志切分,编写shell脚本.

创建一个目录保存日志文件

cd /usr/local/nginx
mkdir datalogs
cd /usr/local/nginx/sbin/
vi  logbak.sh

脚本文件模板

#!/bin/sh

BASE_DIR=/usr/local/nginx
BASE_FILE_NAME=access.log

CURRENT_PATH=$BASE_DIR/logs
BAK_PATH=$BASE_DIR/datalogs

CURRENT_FILE=$CURRENT_PATH/$BASE_FILE_NAME
BAK_TIME=`/bin/date -d yesterday +%Y%m%d%H%M`
BAK_FILE=$BAK_PATH/$BAK_TIME-$BASE_FILE_NAME

mv $CURRENT_FILE  $BAK_FILE
$BASE_DIR/sbin/nginx -s reopen

记得保存!!
Nginx学习笔记_第16张图片
记得授权!!!

chmod 755  logbak.sh 

注意:将脚本从window拷贝到linux,执行脚本的时候可能会出现$’\r’: command not found,需要转换一下格式:

yum install dos2unix -y
dos2unix 脚本文件

Nginx学习笔记_第17张图片
Nginx学习笔记_第18张图片第二步:定时任务对脚本进行调度
定时保存日志,比如一天的日志保存为一份日志文件。
定时执行脚本文件,实现日志的定期保存。
可参考https://blog.51cto.com/mrxiong2017/2084803

crontab -e
* */1 * * * sh  /usr/local/nginx/sbin/logbak.sh            小时
*/1  * * * * sh  /usr/local/nginx/sbin/logbak.sh            分钟

Nginx学习笔记_第19张图片
以上日志就配置好了,可以过一分钟看看datalogs目录下有没有新增的日志文件

所有配置 看看配置文件有什么东西

#user nobody;

#开启进程数 <=CPU数 worker_processes 1;

#错误日志保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#进程号保存文件
#pid logs/nginx.pid;

#每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024 events {
worker_connections 1024; }

http { #文件扩展名与文件类型映射表
include mime.types; #默认文件类型
default_type application/octet-stream;

#日志文件输出格式 这个位置相于全局设置
log_format main '$remote_addr - r e m o t e u s e r [ remote_user [ remoteuser[time_local] “KaTeX parse error: Double superscript at position 34: … '̲status b o d y b y t e s s e n t " body_bytes_sent " bodybytessent"http_referer” ’
‘“ h t t p u s e r a g e n t " " http_user_agent" " httpuseragent""http_x_forwarded_for”’;

#请求日志保存位置
#access_log logs/access.log main; #打开发送文件
sendfile on;
#tcp_nopush on;

#keepalive_timeout  0; 	#连接超时时间
keepalive_timeout  65;

#打开gzip压缩
#gzip on; #设定请求缓冲 #client_header_buffer_size 1k; #large_client_header_buffers 4 4k; #设定负载均衡的服务器列表 #upstream
myproject { #weigth参数表示权值,权值越高被分配到的几率越大 #max_fails
当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查 #fail_timeout
在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 #}

#webapp
#upstream myapp {      	# server 192.168.122.133:8080 weight=1 max_fails=2 fail_timeout=30s;    	# server 192.168.122.134:8080

weight=1 max_fails=2 fail_timeout=30s;
#}

#配置虚拟主机,基于域名、ip和端口
server { #监听端口
listen 80; #监听域名
server_name localhost;

    #charset koi8-r;
   		#nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
    #access_log  logs/host.access.log  main;

  #返回的相应文件地址
    location / {
        #设置客户端真实ip地址
        #proxy_set_header X-real-ip $remote_addr;		 			#负载均衡反向代理 			#proxy_pass http://myapp;
  	 			#返回根路径地址(相对路径:相对于/usr/local/nginx/)
        root   html; 			#默认访问文件
        index  index.html index.htm;
    }

  #配置反向代理tomcat服务器:拦截.jsp结尾的请求转向到tomcat
    #location ~ \.jsp$ {
    #    proxy_pass http://192.168.122.133:8080;
    #}		
  
    #error_page  404              /404.html;
    # redirect server error pages to the static page /50x.html
    #
   		#错误页面及其返回地址
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
} 	 	#虚拟主机配置: 	server { 		listen 1234; 		server_name wolfcode.cn; 		location / { 		#正则表达式匹配uri方式:在/usr/local/nginx/wolfcode.cn下

建立一个test123.html 然后使用正则匹配 #location ~ test { ## 重写语法:if return
(条件 = ~ ~) #if (KaTeX parse error: Expected '}', got '#' at position 35: …68.122.1) { #̲ return 4…http_user_agent ~ firefox) { # rewrite ^.*$ /firefox.html; # break; #}
root wolfcode.cn; index index.html; }
#location /goods { # rewrite “goods-(\d{1,5}).html” /goods-ctrl.html; # root wolfcode.cn; # index index.html; #}
#配置访问日志 access_log logs/wolfcode.cn.access.log main; }

# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;
#    listen       somename:8080;
#    server_name  somename  alias  another.alias;

#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}


# HTTPS server
#
#server {
#    listen       443 ssl;
#    server_name  localhost;

#    ssl_certificate      cert.pem;
#    ssl_certificate_key  cert.key;

#    ssl_session_cache    shared:SSL:1m;
#    ssl_session_timeout  5m;

#    ssl_ciphers  HIGH:!aNULL:!MD5;
#    ssl_prefer_server_ciphers  on;

#    location / {
#        root   html;
#        index  index.html index.htm;
#    }
#}

}



location配置

语法规则: location [=||*|^~] /uri/ { … }

= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。 ^~/static/
~ 开头表示区分大小写的正则匹配

~ * 开头表示不区分大小写的正则匹配
** !~和 !~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

$ 表示以什么什么结尾

可参考 https://www.jianshu.com/p/403bab8fc34d

匹配规则

location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ .(gif|jpg|png|js|css)$ {
#规则D
}
location ~* .png$ {
#规则E
}
location !~ .xhtml$ {
#规则F
}
location !~* .xhtml$ {
#规则G
}
location / {
#规则H
}

那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而 http://localhost/static/c.png 则优先匹配到 规则C
访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写。
访问 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作为方向代理服务器存在。

实际应用配置
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页

第一个必选规则

location = / {
proxy_pass http://tomcat:8080/index
}

#第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
#有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* .(gif|jpg|jpeg|png|css|js|ico|html)$ {
root /webroot/res/;
}

#第三个规则就是通用规则,用来转发动态请求到后端应用服务器
#非静态文件请求就默认是动态请求,自己根据实际把握
#毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}

全局变量 看看有哪些全局变量

官方配置:http://nginx.org/en/docs
$args #请求中的参数值
$query_string #同 $args
$arg_NAME #GET请求中NAME的值
$is_args #如果请求中有参数,值为"?",否则为空字符串
KaTeX parse error: Expected 'EOF', got '#' at position 11: uri #̲请求中的当前URI(不带请求参…args),可以不同于浏览器传递的 r e q u e s t u r i 的 值 , 它 可 以 通 过 内 部 重 定 向 , 或 者 使 用 i n d e x 指 令 进 行 修 改 , request_uri的值,它可以通过内部重定向,或者使用index指令进行修改, requesturi使indexuri不包含主机名,如"/foo/bar.html"。
$document_uri #同 $uri
$document_root #当前请求的文档根目录或别名
$host #优先级:HTTP请求行的主机名>“HOST"请求头字段>符合请求的服务器名
$hostname #主机名
$https #如果开启了SSL安全模式,值为"on”,否则为空字符串。
$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #“Content-Length” 请求头字段
$content_type #“Content-Type” 请求头字段
$cookie_name #cookie名称
$limit_rate #用于设置响应的速度限制
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr#获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method #HTTP请求方法,通常为"GET"或"POST"
$request_time #处理客户端请求使用的时间; 从读取客户端的第一个字节开始计时
KaTeX parse error: Expected 'EOF', got '#' at position 24: …uri #̲这个变量等于包含一些客户端请求…uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme #请求使用的Web协议,“http” 或 “https”
$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本,通常为 “HTTP/1.0” 或 “HTTP/1.1”
$status #HTTP响应代码
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
KaTeX parse error: Expected 'EOF', got '#' at position 19: …kie_NAME #̲客户端请求Header头中的c…cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
KaTeX parse error: Expected 'EOF', got '#' at position 20: …_NAME #̲匹配任意请求头字段;变量名中的…http_accept_language即可
$http_cookie #cookie 信息
$http_post
$http_referer #引用地址
$http_user_agent #客户端代理信息
$http_x_forwarded_for#相当于网络访问路径。http://www.cnblogs.com/craig/archive/2008/11/18/1335809.html
KaTeX parse error: Expected 'EOF', got '#' at position 21: …http_NAME #̲可以设置任意http响应头字段…sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding

rewrite语法
作用:
1:url访问跳转, 支持开发设置
1>页面跳转 2>兼容性支持 3>展示效果等

2>SEO优化

3>维护
后台维护, 流量转发等
eg: rewrite ^(.*)$ /维护页面.html

4>安全
url 隐藏

格式:rewrite regex replaceent [flag]

regex 匹配的正则表达式,将伪装的静态url转化为动态的url,然后通过proxy_pass跳转到真实路径访问

repaceent:用于真实url拼接

nginx的rewrite规则参考:
为区分大小写匹配
~* 为不区分大小写匹配
! 和!*分别为区分大小写不匹配及不区分大小写不匹

flag
last 相当于Apache里的[L]标记,表示完成rewrite,这应该是最常用的

break 终止匹配, 不再匹配后面的规则

redirect 返回302临时重定向 地址栏会显示跳转后的地址

permanent 返回301永久重定向 地址栏会显示跳转后的地址

Nginx的伪静态化

为什么需要伪静态化百度一下

目的:
原本使用
http://ip:8888/employee/page?pageSize=3¤tPage=1
进行访问

转换成:

http://ip:8888/employee-page-3-1.html

这样别人就不能轻易看出get请求带的参数名了

实现;这里还是用的的demo2

打开 nginx配置文件,进行如下配置

 server {
  listen 80;
  server_name localhost;

  location ^~ /employee {
    rewrite  ^/employee-(.*)-(\d*)-(\d*).html$   /employee/$1?pageSize=$2¤tPage=$3 break;
    proxy_set_header X-real-ip $remote_addr;
    proxy_pass http://192.168.15.132:8888;
  }

}
如图:
Nginx学习笔记_第20张图片
因为设置端口为80,所以直接使用http://192.168.15.132/employee-page-3-1.html访问即可;结果如下:
在这里插入图片描述
搭建高可用环境
我们是通过Nginx进行反向代理,如果Nginx关了的话就没有其他服务支撑.
所以我们需要来实现Nginx的高可用,高可用就是我们一台机器挂了可以切换到另外一台机器.
我们使用Nginx+keepalived搭建高可用环境

高可用双机热备(主从模式/双主模式)

http://www.uml.org.cn/zjjs/201808214.asp

你可能感兴趣的:(负载均衡)