Nginx学习笔记

---------nginx安装脚本(企业)----------

path=/opt/nginxinstall/1.16.0
yum -y install patch
yum -y install gcc-c++
tar -zxvf $path/nginx-1.16.0.tar.gz
tar -zxvf $path/pcre-8.42.tar.gz
tar -zxvf $path/zlib-1.2.11.tar.gz
tar -zxvf $path/openssl-1.0.2r.tar.gz
tar -zxvf $path/nginx_upstream_check_module-master.tar.gz
tar -zxvf $path/LuaJIT-2.0.4.tar.gz
tar -zxvf $path/nginx_devel_kit-master.tar.gz
tar -zxvf $path/lua-nginx-module-master.tar.gz
unzip luascript.zip

cd $path/nginx-1.16.0
pathc -p1 < cur_path/nginx_upstream_check_module-master/check_1.14.0+.patch

chown -R root:root /opt/nginxinstall

cd $path/LuaJIT-2.0.4 
make && make install

cd $path/nginx-1.16.0
./configure --prefix=/opt/nginx/1.16.0
--with-http_ssl_module       #启用nginx的模块名字,以下三个均是
--with-http_sub_module
--with-http_stub_status_module
--with-pcre=$path/pcre-8.42
--with-zlib=$path/zlib-1.2.11
--with-openssl=$path/openssl-1.0.2r       # with-软件名=安装路径
--with-ld-opt='-WI,rpath,/usr/local/lib'
--add-module=$path/ngx_devel_kit-master
--add-module=$path/lua_nginx-module-master
--add-module=$path/nginx_upstream_check_module-master
#编译阶段,./configure是进行编译,--prefix=(路径)将nginx统一安装在此目录下,后面的with表示开启或者加带相应的模块
make && make install
#进行安装

1、Nginx的基本概念

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务

2、反向代理

(1)正向代理

在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。正向代理:客户端 <一> 代理 一>服务端

(2)反向代理

反向代理,客户端对代理无感知,客户端不需要任何配置就可以访问,我们只需将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏得是真是服务器得IP地址。反向代理:客户端 一>代理 <一> 服务端

正向代理和反向代理

nginx配置截取文根 nginx 截取url_nginx配置截取文根

3、负载均衡
单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
4、动静分离
为了加快网站得解析速度,可以把动态网页和静态网页由不同得服务器来解析,加快解析速度,降低原来单个服务器的压力。
Nginx安装、命令和配置文件
1、在linux系统中安装nginx
方式一:源码编译安装,安装后在usr中多出来一个文件夹local/nginx,相关命令必须在sbin目录下执行才可以 nginx安装

https://blog.csdn.net/qq_37345604/article/details/90034424

方式二:

http://nginx.org/en/linux_packages.html#RHEL-CentOS

然后进入/etc/yum.repos.d下编写nginx.repo后直接使用yum -y install nginx安装
2、nginx常用命令

nginx -s reopen #重启Nginx
nginx -s reload #重新加载Nginx配置文件,然后以优雅的方式重启Nginx
nginx -s stop #强制停止Nginx服务
nginx -s quit #优雅地停止Nginx服务(即处理完所有请求后再停止服务)
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -?,-h #打开帮助信息
nginx -v #显示版本信息并退出
nginx -V #显示版本和配置选项信息,然后退出
nginx -t #检测配置文件是否有语法错误,然后退出
nginx -T #检测配置文件是否有语法错误,转储并退出
nginx -q #在检测配置文件期间屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)
nginx -g directives #设置配置文件外的全局指令
killall nginx #杀死所有nginx进程
nginx -v   #查看nginx的版本号

3、nginx配置文件配置文件讲解

https://www.cnblogs.com/badaoliumangqizhi/p/11768875.html

nginx配置实例1-反向代理
测试:
客户端—>nginx—>tomcat服务器,可以在nginx中的子配置文件(/etc/nginx/conf.d/default.conf)中修改ip地址,通过访问80端口就可以访问到tomcat。

Nginx配置实例-2-负载均衡
参考文件如下:

https://www.cnblogs.com/diantong/p/11208508.html

Nginx配置实例-3-动静分离

https://blog.csdn.net/qq_33189961/article/details/106951203?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~top_click~default-1-106951203.nonecase&utm_term=nginx%E5%8A%A8%E9%9D%99%E5%88%86%E7%A6%BB%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86

nginx配置高可用集群
参考文献如下:

https://www.cnblogs.com/kakatadage/p/9995578.html

nginx配置截取文根 nginx 截取url_html_02


Nginx配置文件详解

进入安装目录下可以看到conf:配置文件,html:网页文件,log:日志文件,sbin:二进制文件

全局模块
work_processes 1   #工作的子进程,一般为CPU*核数
Event {
	#一般是配置nginx连接的特性
	#如一个work同时允许多少个连接
	work_connetctions 1024  #指的是一个子进程最大允许连接1024个连接
	#
}
http { #这是配置http服务器的主要段
	server { #这是虚拟主机端
		listen 80;   #端口
		server_name localhost    #域名
		
		location { #定位,把特殊的路径或文件再次定位,如image目录单独处理, 如php单独处理
			root  html   # 文件的路径,可以是相对路径(相对于nginx安装路径),也可以是绝对路径
			index  index.html   # html中的.html文件,默认取第一个
		}
   }
   include  /etc/nginx/conf.d/*.conf   #可以使用include指定server虚拟主机端的文件,分开写会显得不那么累赘
}

日志管理
每个server段中都会有类似信息
/var/log/nginx/access.log/ main
这个说明该服务server访问的日志文件就是/var/log/nginx/access.log

使用的格式就是main格式,已经定义好的,便于引用
上面的格式是main类型的格式,记录的是remore_addr到http_x-forwarded_for等选项
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
#185.142.236.43 - - [27/Sep/2020:10:42:31 +0800] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0" "-"
#可以进行对比,地址,本地时间,请求,状态码,发送的字节数,浏览器信息

nginx允许server针对不同的要求做日志格式,使用access_log可以定义日志的存放路径已经命名日志文件。
日志管理,可以进行切割。

location语法问题
作用:有定位的意思,在虚拟主机的配置中,是必不可少的部分,location可以把网站的不同部分,定位到不同的处理方式上

语法规则: location [=|~|~*|^~] /uri/ { … }
= 开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)不会被正则覆盖。           以xx开头
~ 开头表示区分大小写的正则匹配                                 以xx结尾
~* 开头表示不区分大小写的正则匹配                              以xx结尾
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。

精准匹配如何发挥作用?
首先看有没有精准匹配,如果有,停止匹配过程
location = patt {
	config A
}
如果$url == patt匹配成功,使用configA
精准匹配的优先级最高,首先匹配精准。
**/目录涉及内部再次转发,这个千万注意,即使匹配上。**
如果是精准匹配的话,在一开始匹配上具体页面,就回去root下的目录中查找具体页面,就是index后的第一个选择。

**实例:如在地址栏写上ip:port/www/test.html**
location /www/ {
            root   html;
            index  test.html index.html index.htm;
            #一般匹配到www后命中,由于www是目录,随后在html目录下寻找www/test.html后将结果返回,最后为/usr/local/nginx/html/www/test.html
            #如果书写的url路径无法跟已经书写的location匹配,nginx将默认全局搜索nginx中location路径
       }

**alias 用法**
location /www/ #location路径 {
            alias  html;
            index  test.html index.html index.htm;
#如在地址栏写上ip:port/www/test.html,使用alias的话,最后路径为/usr/local/nginx/html/test.html
#如在地址栏写上ip:port/www/data/test.html,使用alias的话,最后路径为/usr/local/nginx/html/data/test.html
root的处理结果是:root路径+location路径
alias的处理结果是:使用alias路径替换location路径

**location匹配过程分解**
1、未使用负载均衡情况
如:有/ 访问路径为http://ip:port/www/data/getinfo
location /www/ {
	proxy_pass 目标ip:port/;   #传递剩余path2到目标主机,即:/data/getinfo
}
无/ 访问路径为http://ip:port/www/data/getinfo
location /www/ {
	proxy_pass 目标ip:port;   #传递整个path到目标主机,即:www/data/getinfo
}
*****特别注意*****
无/ 访问路径为http://ip:port/www/data/getinfo
location /www/ {
	proxy_pass 目标ip:port/enjoy;   #如果是port后有目录,传递剩余path2到目标主机且enjoy与data相拼接成enjoydata,即:enjoydata/data/getinfo
}
总结:url以/结尾时,如http://192.168.2.10:80/static/,指的是一个目录,
nginx认为用户没有指定文件,若不是/结尾则相反,则认为是一个文件,
nginx尝试打开文件,此时index命令不起作用。

2、使用负载均衡情况
如果proxy_pass http://testserver/ceshi/;后有/的情况
http {
	 upstream testserver {
        server 172.27.187.24:80;
    }
}
server {
	 location /www/ {
            proxy_pass http://testserver/ceshi/;
            #当uri为:http://47.96.152.255:8000/www/data/时候,在location段进行匹配后,截去www/后,剩下的/data			     
            #将继续拼接到ceshi/后传给负载均衡器,最后负载均衡器拿到的就是172.27.187.24:80/ceshi/data;
        }
}
如果proxy_pass http://testserver;后无/的情况
http {
	 upstream testserver {
        server 172.27.187.24:80;
    }
}
server {
	 location /www/ {
            proxy_pass http://testserver;
            #当uri为:http://47.96.152.255:8000/www/data/node.html时候,在location段进行匹配后,将整个/www/data/node.html			     
            #传给负载均衡器,最后负载均衡器拿到的就是172.27.187.24:80/www/data/node.html	
        }
}
**总结:**:1、如果proxy_pass后跟的url在端口后无目录时候,有/的时候截去location匹配后的path2路径进行传递,无/则整个path进行传递。
			2、如果proxy_pass后跟的url在端口后有目录时候,都是截去截去location匹配后的path2路径进行传递,不同在于有/会将目录与path2开头字母分开,没有则会放在一起拼接。


**总结:location的命中过程**
1、先判断精准命中,如果命中,立即返回结果并结束解析过程
2、判断普通命中,如果有多个命中,记录下来‘最长’的命中结果(注意:记录但不结束,最长的为佳)
3、继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上而下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程
延伸分析:a:普通命中,顺序无所谓,是因为按命中的长短确定的,
         b:正则命中,顺序有所谓,因为是从前往后命中的。

**通俗理解**
url=域名+端口+path+param (https://ip:port/path/?param其中path分为path1+path2)
1、域名(ip)+端口------>定位虚拟机
2、path与location部分匹配
	path = 匹配path1+剩余path2
3、root:在目录里找path1路径和path2路径
	alias:在目录里找path2路径,若url以/结尾,认为是目录,执行index;否则认为path路径到达文件
4、proxy_pass=http://172.25.21.10:80/
ip:port/时,转发ip+端口+path2路径
ip:port时,转发ip+端口+path1+path2路径   ***这个很重要,细节,如上述

**实战演练-以实际产品nginx配置文件为例:**
总共分为nginx.conf、server_open.conf、open.conf、up_stream.conf、expires.conf五个文件为主
其中nginx.conf为主配置文件,其他的文件写在include中即可;
全局块
user  *****;    #用户
worker_processes   8   #等于服务器CPU数最佳
worker_cpu_affinity   00000001 00000010    #二进制数
error_log  ********    #配置文件地址
enents  {
	user epoll;
	workes_connections  65535;    #最大连接数
}
http {
	include  mime.types;    #格式。后续会用到
	include  data/rizhi.conf;   #日志格式文件
	include  data/server_open.conf;   #服务配置文件
	include  data/up_stream.conf   #服务负载均衡配置文件
	proxy_cache_path  opt/local/nginx   levels=1:2   max_size=10g   #相关缓存配置,可百度查阅
}
**data/server_open.conf配置文件**
server {
	listen 80;  #监听端口
	server_name  www.baidu.com   #服务域名
	#媒体端口可以写为  443  ssl;
	#ssl相关认证证书等;
	#location资源匹配
	include  data/location/open.conf
}
**/data/location/open.conf配置文件**
location  #(可以是正则,也可以一般,精准等) {
	gizp  on/off   #是否开启压缩
	proxy_pass  #负载均衡名字
}
**up_stream.conf  配置文件**
up_stream 负载均衡名字 {
	server url/域名 : #端口
	check  interval=3 rise=2 fail=2  #跟nginx_upstream_check_module-master相关,可百度检查
}

rewrite讲解
功能:Rewrite是Nginx服务器提供的一个重要的功能,它可以实现URL重定向功能。

**rewrite的使用**
语法:指令语法:rewrite regex replacement [flag]; regex是正则表达式  flag=[break/last/redirect/permanent]
rewrite是实现URL重定向的重要指令,  
regex:用来匹配URI的正则表达式;
replacement:匹配成功后用来替换URI中被截取内容的字符串,默认情况如果该字符串包含“http://”、"https://"开头,则不会继续向下对URI进行其他处理。直接返回重写的URI给客户端
flag:用来设置rewrite对URI的处理行为,包含如下数据:

**标记符号	说明**
last:终止在本location块中处理接收到的URI,并将此处重写的URI作为新的URI使用其他location进行处理,不会将重写的uri返回给客户端(只是终止当前location的处理)
break:将此处重写的URI作为一个新的URI在当前location中继续执行,如果是重定向是目录的话就要求在当前root下有此目录,并不会将新的URI转向其他location。
redirect:将重写后的URI返回个客户端,状态码是302,表明临时重定向,主要用在replacement字符串不以“http://”,“ https://”或“ $scheme” 开头;
permanent:会将新的uri在新的location中继续执行,并将重写的URI返回客户端,状态码为301,指明是永久重定向;
[参考]()

**具体过程:**
1、先将path进程正则匹配,如果无法匹配则结束
2、如果匹配命中,则path=replacement,其中path是除去域名匹配后的整个路径;
3、检查是内部重定向还是外部重定向,是否需要继续匹配location;