nginx.md
简介
- Apache
Apache(Apache HTTP Server )是目前广泛流行的Web 服务器软件,具有开放源代码、跨平台、安全稳定等特点。Apache 是伴随五联网的兴起共同成长的,经过多年的技术沉淀和积累,已经非常成熟和稳定,具备了大量的功能模块和扩展。但由于Apache 在设计之初对性能和资源的消耗没有过多的关注,导致在应对高并发的业务场景时,被一些轻量级的高性能Web 服务器赶超。
- Tomcat
Tomcat(Apache Tomcat )主要用于Java Web 环境,是一个运行Serviet 和JSP 的容器
(即运行Java 语言的服务器端程序) 。Tomcat 和Apache 都是由Apache 软件基金会运作的开源项目, Tomcat 本身可作为一个单独的Web 服务器使用,主要用于处理动态请求, 但在静态资源和高并发方面的性能较弱,因此经常和Apache 等软件搭配,实现动静态请求分离。
- Nginx
Nginx (读作engine x )是一个轻量级开源Web 服务器软件,可以作为反向代理、负载均衡与缓存服务器使用。Nginx 和Lighttpd 都是为高并发网站的应用场景而设计的。随着技术发展和业务需要, Nginx 逐渐受到关注,在国内如百度、淘宝、腾讯、新浪、网易等网站都开始使用Nginx 来满足一些高并发访问的需求。
- Lighttpd
- Microsoft IIS
安装
系统环境:阿里云 ubuntu16
1、下载
下载地址
nginx_down
目前Nginx 发布了3 种类型的版本,分别为
Mainline version (开发版)
Stable version(稳定版)
Legacy versions (早期版本)
每种类型的版本中又提供了Linux 版本和Windows 版本
下载解压后,目录结构如下
- src 目录:存放Nginx 的源代码。
- man 目录:存放Nginx 的帮助文档。
- html 目录:存放默认网站文件。
- contrib 目录:存放其他机构或组织贡献的文档资料。
- conf 目录:存放Nginx 服务器的配置文件。
- auto 目录:存放大量的脚本文件,和configure 脚本程序相关。
- configure 文件: Nginx 自动安装脚本,用于检查环境,生成编译代码需要的makefile文件。
- CHANGES 、CHANGES.ru 、LICENSE 和README 都是Nginx 服务器的相关文档资料。
2、安装依赖
nginx编译安装依赖包
软件包 | 说明 |
---|---|
pcre-devel | 为Nginx 模块(如rewrite )提供正则表达式库 |
zlib-devel | 为Nginx 模块(如gzip ) 提供数据压缩用的共享库 |
openssl-dlevel | 为Nginx 模块(如ssD 提供密码~法、证书以及SSL 协议等功能 |
Linux 中的某些软件包具有devel 包和非devel 包两种形式,如zlib 和zlib-devel。非devel 包就是普通的软件包,而devel 包则一般会包括头文件、静态库甚至源码。若仅仅使用这些软件,则仅安装非devel 包即可,但若在开发时常妥用到这些软件包中的共享库,就需要安装devel 包。
3、编译安装
安装脚本
#!/bin/bash
apt update
# 安装依赖
# centos
# yum -y install pcre-devel openssl-devel
# ubuntu
apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev
#下载
wget http://nginx.org/download/nginx-1.14.2.tar.gz
#解压
tar -zxvf nginx-1.14.2.tar.gz
cd nginx-1.14.2
# 设置编译选项
./configure --prefix=/usr/local/nginx --with-http_ssl_module
#编译安装
make && make install
4、启动和停止
启动
cd /usr/local/nginx/sbin
./nginx
# 查看运行装态
ps aux | grep nginx
停止
# 快速关闭,不管有没有正在处理的请求
./nginx -s stop
# 优雅的关闭方式,Nginx在退出前完成已经接受的连接请求
./nginx -s quit
# 或者 杀进程
kill Nginx主进程PID(以root运行的进程) # 1
killall nginx # 2
命令 | 说明 |
---|---|
nginx -s reload | 在Nginx 已经启动的情况下重新加载配置文件(平滑重启) |
nginx -s reopen | 重新打开日志文件 |
nginx -c /特定目录/nginx.conf | 以特定目录下的配置文件启动Nginx |
nginx -t | 检测当前配置文件是否正确 |
nginx - t -c /特定日录/nginx.conf | 检测特定目录下的Nginx 配置文件是否正确 |
nginx - v | 显示版本信息 |
nginx -V | 显示版本信息和编译选项 |
Nginx 的进程设计思想
Nginx 由一个主进程和多个工作进程组成,主进程接收容户端请求,转交给工作进程处理,从而很好地利用多核心CPU 的计算能力。当管理员执行reload 命令重新加载配置时,主进程会等待工作进程完成工作后再结束工作进程,然后基于新的配直重新创建工作进程,避免了工作过程中被打断的情况。由于整个过程中主进程没有停止,因此也不会发生漏掉客户端请求的情况。
查看端口占用
# t 、l 、n 、p分别表示查看tcp协议、查看监昕服务、不解析名称以及显示进程名和PID
netstat -tlnp
防火墙开放80端口(不同系统可能不一样,此处centos,一个参考)
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# 查看端口状态
service iptables status
#保存,可以重启生效
service iptables save
# 重启
service iptables restart
参数 | 说明 |
---|---|
-I INPUT | 表示在INPUTC 外部访问规则)中插入一条规则 |
-p tcp | 指定数据包匹配的协议(tcp 、udp 、icmp 等),这里指定tcp 协议 |
–dport 80 | 用于指定数据包匹配的目标端口号,这里指定80 端口 |
-j ACCEPT | 指定对数据包的处理操作(ACCEPT、DROP、REJECt、REDIRECT等),这里指定ACCEPT 操作 |
5、其他操作
创建软链接
# 查看当前环境变量
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
# 其中
# /bin 和 /sbin 放置常用程序, sbin 表示需要管理员权限
# /usr/bin 和 /usr/sbin 放置一些工具软件的可执行程序
# /usr/local/bin 和/usr/local/sbin 放置用户自行安装的可执行程序
# 因此,推荐将Nginx 放入/usr/local/sbin目录中。
# 利用软链接将nginx 程序链接到/usr/local/sbin 目录中,从而创建nginx命令
ln -s /usr/local/nginx/sbin/nginx /usr/local//sbin/nginx
添加到系统服务
许多Linux 系统服务都可以通过service命令进行控制,service 命令实际上是调用了/etc/init.d 目录下的shell脚本
#例子
#直接执行脚本
/etc/init.d/network restart
#等价于 通过service 命令执行脚本
service network restart
接下来执行/etc/init.d/nginx 编写一个shell 脚本实现Nginx 服务管理,提供start 、stop 、quit、reload 、restart 5 个参数,具体代码如下。
参考: LSB、服务
#!/bin/bash
### BEGIN INIT INFO
# Provides: zhuzhenyuan.cn
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: nginix service
# Description: nginix service daemon
### END INIT INFO
# LSB tags规范,上面这段内容有,就可以支持 systemctl enable nginx.service,或者直接 apt-get remove insserv
DAEMON=/usr/local/nginx/sbin/nginx
case "$1" in
start)
echo "Starting nginx daemon..."
$DAEMON && echo "NGINX RUN SUCCESS"
;;
stop)
echo "Stopping nginx daemon..."
$DAEMON -s stop && echo "NGINX STOP SUCCESS"
;;
quit)
echo "Stopping nginx daemon..."
$DAEMON -s quit && echo "NGINX QUIT SUCCESS"
;;
reload)
echo "Reloading nginx daemon..."
$DAEMON -s reload && echo "NGINX RELOAD SUCCESS"
;;
restart)
echo "Restarting nginx daemon..."
$DAEMON -s quit
$DAEMON && echo "RESTARTING NGINX SUCCESS"
;;
*)
echo "Usage: dervice nginx{start|stop|quit|restart|reload}"
exit 2
;;
esac
[systemctl、service、chkconfig](https://blog.csdn.net/cds86333774/article/details/51165361
服务systemctl 系统和服务管理器 参考
# 添加权限
chmod u+x /etc/init.d/nginx
# unmask:取消对 unit 的注销。
systemctl unmask nginx.service
# 添加服务到跟随系统启动,
systemctl enable nginx.service
现在就可以使用 service的方式执行了
systemctl [command] [unit]
命令 | 说明 |
---|---|
start | 立刻启动后面接的 unit。 |
stop | 立刻关闭后面接的 unit。 |
restart | 立刻关闭后启动后面接的 unit,亦即执行 stop 再 start 的意思。 |
reload | 不关闭 unit 的情况下,重新载入配置文件,让设置生效。 |
enable | 设置下次开机时,后面接的 unit 会被启动。 |
disable | 设置下次开机时,后面接的 unit 不会被启动。 |
status | 目前后面接的这个 unit 的状态,会列出有没有正在执行、开机时是否启动等信息。 |
is-active | 目前有没有正在运行中。 |
is-enable | 开机时有没有默认要启用这个 unit。 |
kill | 不要被 kill 这个名字吓着了,它其实是向运行 unit 的进程发送信号。 |
show | 列出 unit 的配置。 |
mask | 注销 unit,注销后你就无法启动这个 unit 了。 |
unmask | 取消对 unit 的注销。 |
linux 运行级别
- 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
- 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
- 运行级别2:多用户状态(没有NFS)
- 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
- 运行级别4:系统未使用,保留
- 运行级别5:X11控制台,登陆后进入图形GUI模式
- 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动
运行级别的原理:
- 在目录/etc/init.d下有许多服务器脚本程序,一般称为服务(service)
- 在/etc下有7个名为rcN.d的目录,对应系统的7个运行级别, 存在rcS.d,为系统进入某个 runlevel 之前的 ) syetem init script
- rcN.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。
- 系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
- 对于以K开头的文件,系统将终止对应的服务
- 对于以S开头的文件,系统将启动对应的服务
- 查看运行级别用:runlevel
- 进入其它运行级别用:init N
- 另外init0为关机,init 6为重启系统
配置
打开conf下主配置文件查看
vim /usr/local/nginx/conf/nginx.conf
可看到主配置文件由5个块组成,如下
main
events{...}
http{
server{
location{...}
}
}
块 | 说明 |
---|---|
main | 主要控制Nginx 子进程所属的用户和用户组、派生子进程数、错误日志位置与级别、pid 位置、子进程优先级、进程对应CPU 、进程能够打开的文件描述符数目等 |
events | 控制Nginx 处理连接的方式 |
http | Nginx 处理http 请求的主要配置块,大多数配置都在这里面进行 |
server | Nginx 中主机的配置块,可用于配置多个虚拟主机 |
location | server 中对应目录级别的控制块,可以有多个 |
查看默认的nginx.conf文件,去掉注释后
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
默认配置指令
指令 | 说明 |
---|---|
worker_processes | 配置Nginx 的工作进程数, 一般设为CPU 总核数或者总核数的两倍 |
worker_connections | 配置Nginx 允许单个进程并发连接的最大请求数 |
include | 用于引人配置文件 |
default_type | 设置默认文件类型 |
sendfile | 默认值为on ,表示开启高效文件传输模式 |
keepalive_timeout | 设置长连接超时时间(单位:秒) |
listen | 监听端口,默认监听80 端口 |
server_name | 设置主机域名 |
root | 设置主机站点根目录地址 |
index | 指定默认索引文件 |
error_page | 自定义错误页面 |
虚拟主机配置
基于端口号配置虚拟主机
查看nginx.conf文件,如下
# another virtual host using mix of IP-, name-, and port-based configuration
# Nginx 中虚拟主机的配置可以基于IP地址、域名和端口号进行设置
#server {
# listen 8000; # 监昕端口,与下面一句二选一
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
例子
# 配置监听8001 端口号的虚拟主机
server{
listen 8001;
server_name localhost;
root html/html8001;
index index.html index.htm;
}
# 配置监听8002 端口号的虚拟主机
server{
listen 8002;
server_name localhost;
root html/html8002;
index index.html index.htm;
}
平滑重启生效
基于域名配置虚拟主机
域名可以采用改host的方式进行测试
server{
listen 80;
server_name www.test.com;
root htmlwwwtestcom;
index index.html index.htm;
}
server{
listen 80;
server_name test.com;
root htmltestcom;
index index.html index.htm;
}
server_name使用
# 以*通配符开始的字符串
server_name *.test.com;
# 以*通配符结束的字符串
server_name www.*;
# 匹配正则表达式
server_name ~^(?.+)\.domain\.com$;
# 优先级顺序依次为,精准匹自己〉以通配符开始的字符串〉〉正则表达式
反向代理、负载均衡配置
配置反向代理
#域名区分
server {
listen 80;
server_name www.test.com;
# 域名www.test.com的请求全部转发到Web服务器192.168.78.128
location / {
proxy_pass http://192.168.11.12;
}
}
server {
listen 80;
server_name test.com;
# 域名www.test.com的请求全部转发到Web服务器192.168.78.128
location / {
proxy_pass http://192.168.11.11:8007;
}
}
#端口区分
server {
listen 801;
server_name localhost;
# 本地端口801的请求全部转发到Web服务器192.168.78.128
location / {
proxy_pass http://192.168.11.12;
}
}
server {
listen 802;
server_name localhost;
# 本地端口802的请求全部转发到Web服务器192.168.78.128
location / {
proxy_pass http://192.168.11.11:8007;
}
}
其他常用指令
指令 | 说明 |
---|---|
proxy_set_header | 在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息 |
proxy_connect_timeout | 配置Nginx与后端代理服务器尝试建立连接的超时时间 |
proxy_read_timeout | 配置Nginx向后端服务器组发出read请求后,等待响应的超时时间 |
proxy_send_timeout | 配置Nginx向后端服务器组发出write请求后,等待响应的超时时间 |
proxy_redirect | 用于修改后端服务器返回的响应头中的Location和Refresh |
proxy_set_header指令使用
# 配置实现将客户端IP 传递给后端服务器。
location / {
proxy_pass http://192.168.78.200;
proxy_set_header Host $host; #第一个参数表示字段名称,第二个参数表示字段值
proxy_set_header X-Real-p $ remote_addr; #$remote_addr用于获取客户端真实的IP 地址
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # $proxy_add_x_forwarded_ for 用于在客户端请求头字段后添加客户端地址,使用逗号分隔,且当不存在客户端请求头字段时,该变量等同于变量$remote_addr 。
}
负载均衡配置
负载均衡( load balance)就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度,带给用户更好的体验。
通过使用upstream指令实现.
以下是4中典型的配置方式
配置方式 | 说明 |
---|---|
轮询方式 | 负载均衡默认设置方式,每个请求按照时间顺序逐一分配到不同的后端服务器进行处理,如果有服务器宕机,会自动剔除 |
权重方式 | 利用weight 指定轮询的权重比率,与访问率成正比,用于后端服务器性能不均的情况 |
ip_hash 方式 | 每个请求按访问IP 的hash 结果分配,这样可以使每个访客固定访问一个后端服务器,可以解决Session 共享的问题 |
第三方模块 | 第三方模块采用fair 时,按照每台服务器的响应时间来分配请求,响应时间短的优先分配;若第三方模块采用url_hash 时,按照访问url 的hash 值来分配请求 |
一般轮询负载均衡
例子
server {
listen 80;
server_name www.test.com;
location / {
proxy_pass http://web_server; #指定代理的URL
}
}
# 配置负载均衡服务器组
upstream web_server { # web_server表示代理的服务器主机名,用于proxy_pass 指令执行反向代理时使用
server 192.168.78.1;
server 192.168.78.2;
}
# Nginx 检测到后端某台服务器看机,则会在负载均衡时自动剔除该服务器
加权轮询负载均衡
upstream web_server { # web_server表示代理的服务器主机名,用于proxy_pass 指令执行反向代理时使用
server 192.168.78.1 weight=1;
server 192.168.78.2 weight=3;
}
# weigth 参数表示权值,权值越高则被分配到的概率越大
# Nginx 检测到后端某台服务器看机,则会在负载均衡时自动剔除该服务器
除了 weight外,常用状态参数如下
配置方式 | 说明 |
---|---|
max_fails | 允许请求失败的次数,默认为 1,当超过最大次数时,返回proxy_next_upstream指令定义的错误 |
fail_timeout | 在经历了max_fails次失败后,暂停服务的时间。且在实际应用中max_fails 一般与fail_timeout 一起使用 |
backup | 预留的备份机器 |
down | 表示当前的s e rv er 暂时不参与负载均衡 |
例子
upstream web_server { # web_server表示代理的服务器主机名,用于proxy_pass 指令执行反向代理时使用
server 192.168.78.1 weight=1 max_fails=2 fail_timeout=2;
server 192.168.78.2 weight=3 max_fails=2 fail_timeout=2;
server 193.168.78.3 backup; # 当另外的非backup故障或者忙绿时,才会请求backup服务器
}
ip_hash 负载均衡
将每个请求按照访问IP 的hash 结果分配,这样就可以便来自同一个IP 的客户端用户固定访问一台Web 服务器,有效地解决了动态网页存在的Session 共享问题。
例子
upstream web_server {
ip_hash; # 使用ip_hash 方式处理负载均衡时,Web服务器在负载均衡列表中的状态不能使用weight 和l backup 设置。
server 192.168.78.1;
server 192.168.78.2;
server 193.168.78.3 down; # down 参数标识,在负载均衡时,会忽略该服务器的分配。(服务器宕机时)
}
由于ip_hash 方式为每一个用户IP 绑定一个Web 服务器处理,将会导致某些Web 服务器接收的请求多,某些Web 服务器接到的请求少,无法保证Web 服务器的负载均衡。因此,建议只在必要的情况下使用这种方式
其他配置
设置用户和组
需要设置的用户和组已经创建
# 1 编译安装配置方式,在./configure编译安装Nginx时选项中,
# 添加如下,user用于指定用户名称,group 用于指定用户所在组的名称
--user=<user>
--group=<group>
# 2 修改配置文件方式
# 找到
# user nobody;
#修改为
user nuser ngroup;
# 重启服务
自定义错误页
# error_page 指令用于自定义错误页面, 500 、502 、503 和504 指的就是HTTP 错误代码, /50x . html 用于表示当发生上述指定的任意一个错误时,都使用网站根目录下的50x. html 文件处理
error_page 500 502 503 504 /50x.html;
# error_page 指令还可以指定单个错误的处理页面、利用在线资源处理指定的错误,更改网站响应的状态码
# 为每种类型的错误设置单独的处理方式
error_page 403 /40x.html;
error_page 404 /404.jpg;
# 利用在线资源进行处理错误
error_page 403 http://example.com/forbidden.html;
error_page 500 502 503 504 http://example.com/notfound.html;
# 更改晌应状态码
# 出现404的时候,浏览器响应信息中会得到自定义的码值200
error_page 404 =200 /40x.html;
# 另外,更改响应状态码时还可以不指定确切的码值,而是由重定向后实际处理的真实结果来决定
error_page 404 = /40x.html;
权限控制指令
allow # 用于设置允许访问的权限
deny # 用于设置禁止访问的权限
# 在使用时,权限指令后只需跟上允许或禁止的IP,IP 段或all 即可。其中, all 表示所有的
注意
- 单个IP 指定作用范围最小, all 指定作用范围最大。
- 同一块下,若同时存在多个权限指令( deny 、allow ) ,则先出现的访问权限设置生效,并且会对后出现的设置进行覆盖,未覆盖的范围依然生效,否则以先出现的设置为准。
- 当多个块(如http 、server 、location )中都出现了权限设置指令,则内层块中的权限级别要比外层块中设置的权限级别高。
例子
默认如下
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
}
禁止所有用户的访问
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
deny all;
}
只允许指定用户访问
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
allow 10.240.172.253;
deny all;
}
不同块间的权限指令优先级
http {
deny all; # 对所有的server生效
server {
listen 80;
server_name localhost;
root html;
index index.html index.htm;
allow all # 优先级更高
}
}
设置目录列表
在找不到index.html时的会显示文件列表
autoindex on;
# 在http 块中,表示用于对所有站点都有效; 在server 块中,表示对指定站点有效;在location块中,表示对某个目录起作用
# 设置显示文件的时间格式与大
autoindex_exact_size off; #设置精准显示文件大小还是大概显示文件大小,以kB/ MB/ GB 为单位显示
autoindex_localtime on; #令设置文件最后一次修改时间,示显示的时间为文件的服务器时间。
自配置文件的引入
include file | mask;
# file 用于指定包含的文件名称, mask用于指定某一路径下的文件,其路径可以是相对路径,也可以是绝对路径
例子
# 第1 种方式: 单个个文件引入
include vhost/test.conf;
# 第2 种方式:利用通配符
include vhost/*.conf;
访问控制典型应用
location 语法
location [= | ~ | ~* | ^~] URI {...}
location @name {...}
# 其中 =、~、~*、^~、@ 都是location用于实现访问控制的前缀,且在使用时只能选择一种,也可不设置前缀
# URI表示URL地址中从域名到参数之间的部分,{...}表示指令块,用于满足location匹配条件后需要执行的指令
前缀 | 说明 |
---|---|
= | 根据其后的指定模式进行精准匹配。例如,在访问时要与 /html/aaa/index. html 完全一致才会执行其后的指令块 |
~ | 使用正则表达式完成location 的匹配,区分大小写 |
~* | 使用正则表达式完成location 的匹配,不区分大小写 |
^~ | 不使用正则表达式,完成以指定模式开头的location 匹配,遵循最大前缀匹配规则 |
@ | 用于定义一个location 块,且该块不能被外部客户端所访问,只能被Ngin内部配置指令所访问 |
精准匹配
用户访问的URI与指定的URI完全一致的情况,才会执行其后的指令块
server {
listen 80;
server_name localhost;
location =/index {
root html;
index index.html index.htm;
allow 192.168.12.123 # 放通该ip
}
deny all; # 禁止所有ip访问
}
正则匹配
多个正则location之间按照正则location在配置文件中的书写顺序进行匹配,且只要匹配成功就不会继续匹配后面定义的正则location.
server {
listen 80;
server_name localhost;
location ~\.html$ { # 匹配网站根目录下以. html 结尾的文件
allow all;
}
location ~^/test/.*\.html$ { # 匹配网站根目录下test目录中以.html 结尾的文件
deny all;
}
}
最大前缀匹配
由于location可以同时定义多个,当一个配置文件中同时出现多个location 时,普通location 之间遵循“最大前缀匹配”原则。通俗地讲就是,匹配度最高的location 将会执行,示例如下
location /test {
allow all;
}
location /test/log {
deny all;
}
当最大前缀location与正则location同时存在时,如果正则location匹配成功,则不会执行最大前缀location
location / { # 匹配当前网站根目录下的所有文件
allow all;
}
location ~\.html$ { # 正则匹配所有以.html结尾的URI
deny all;
}
location / {} 与location =/{} 的区别
1. location / {} 遵守普通location 的最大前缀匹配,由于任何URI 都必然以 “/“ 根开头,所以对于一个URI,若配直文件中有更合适的匹配则会将其替代,否则返回location / {} 匹配到的结果,它相当于站点默认配直。
2. location =/{} 遵守的是精准匹配,也就是只能匹配改站点根目录,同时会禁止搜索正则location ,效率比location / {}要高,因此,芳在开发中能确定精准匹配的情况,可以采用 location =/{}的方式,提升匹配效率
禁用正则匹配
利用 = 精准匹配或 ^~ 非正则匹配可以在正则匹配之前优先匹配,从而禁止执行原有的正则匹配
location =/test/test.html { # 精准匹配网站根目录下的 /test/test.html
allow all;
}
location ^~/ { # 非正则匹配网站根目录下的文件
deny all;
}
location~\.html$ { #于正则匹配网站根目录下以.html 为结尾的文件
allow all;
}
当多种类型的location 匹配同时出现时,最终执行结果为“ = ”匹配优先于“ ^~ ”匹配,“ ^~ ”匹配优先于正则匹配,正则匹配优先于普通的最大前缀匹配。只要优先的location 匹配成功,就不会执行其他的location
location 中指定目录时 root 和 alias 区别
# 当收到"/img/itheima.png"请求时,将请求映射为“/var/www/image/itheima.png"
location /img/ {
alias /var/www/image/;
}
# 当收到"/img/itheima.png"请求时,将请求映射为“/var/www/image/img/itheima.png"
location /img/ {
root /var/www/image;
}
# alias 在映射路径时不会追加location 匹配到的部分,而root 追加了location 匹配到的部分
日志文件
访问日志
log_format 和 access_log. (nginx.conf中找)
# 注意
# Nginx 默认开启了访问日志的功能,且log_format 指令的配置仅可用在http块内,否则会出现警告信。
# log_format可以设置多个,access_log可以设置在server块中
# 设置访问日志的格式, main 表示访问日志格式名称
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 第1 个参数logs/access.log用于指定相对于Nginx 的安装目录/usr/local/nginx的日志文件存放路径,并包含日志文件名称
# 第2 个参数表示由log_format指令定义的日志格式名称。
access_log logs/access.log main;
# buffer 参数用于设置内存缓存区的大小,flush 参数用于设置内容保存在缓存区中的最大时间
# 注意:手动创建test目录,保证当前nginx进程的用户和组有对该目录的创建access.log的权限,否则无法创建
access_log logs/test/access.log main buffer=2k flush=5s; # 也可以这样配置
# 若在访问过程中需要记录子请求的日志记录,则可以将log_subrequest指令设置为on ,否则默认不记录。
log_subrequest on;
# 多次访问后,可在 /usr/local/nginx/logs/access.log 中查看日志
# 关闭访问日志
access_log off;
日志格式相关内置变量
内置变量 | 含义 |
---|---|
$remote_addr | 客户端的IP地址 |
$remote_user | 客户端用户名,用于记录浏览者进行身份验证时提供的名称,如果没有登录则为空 |
$time_local | 访问的时间与时区,如21/Sep/2016:12:21:25 +0800 ,时间信息最后的+0800 表示服务器所处时区位于UTC之后的8小时 |
$request | 请求的URI和HTTP协议,如GET /HTTP/l.1 |
$status | 记录请求返回的HTTP状态码,如200(成功) |
$body_bytes_sent | 发送给客户端的文件主体内容的大小,如899 |
$http_referer | 来路URL地址 |
$http_user_agent | 客户端浏览器信息 |
$http_x_forwarded_for | 客户端IP地址列表(包括中间经过的代理) |
错误日志
在nginx.conf中找到error_log指令,如下
# 第1个参数,用于存放错误日志的路径
# 第2个参数,用于指定错误记录详细程度的等级,默认值为error, 共有<debug、info、notice、warn、error、crit> 日志记录详细程度依次递减,debug最详细,crit最简洁
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
# 可通过访问不存在资源测试
# error_log 可以在main、http、server、location块中都可以进行设置,配置方式相同
# 关闭错误日志
error_log /dev/null;
日志文件切割
手动
手动备份文件后,使用 nginx -s reopen 重新生成日志文件即可
自动,定时执行脚本(供参考,根据实际需求)
# file_name: cut_log.sh
# path: /usr/local/nginx/logs/test/cut_log.sh
#!/bin/bash
#当前Nginx日志文件存放目录
logs_path="/usr/local/nginx/logs/test"
#备份日志文件
mv $logs_path/access.log $logs_path/ `date -d yesterday +"%Y%m%d"`.log
#重新打开Nginx日志
/usr/local/nginx/sbin/nginx -s reopen
# 添加权限
chmod +x cut_log.sh
#定时任务
crontab -e
#写入,每天0点备份
0 0 * * * /usr/local/nginx/logs/test/cut_log.sh > /dev/null 2>&1
# 每分钟执行一次
* * * * * /usr/local/nginx/logs/test/cut_log.sh > /dev/null 2>&1
# /dev/null 2>&1 指令用于屏蔽标准输出和标准出错的信息
缓存配置
临时缓存配置
添加如下内容
# 代理临时目录
proxy_temp_path /usr/local/nginx/proxy_temp_dir;
# web缓存目录和参数设置
proxy_cache_path /usr/local/nginx/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1m max_size=500m;
- /usr/local/nginx/proxy_cache_dir 参数:表示用户自定义的缓存文件保存目录
- levels 参数:表示缓存目录下的层级目录结构,它是根据哈希后的请求URL 地址创建的,目录名称从晗希后的字符串结尾处开始截取。
(假设哈希后的请求链接地址为af7098al5e430326l97ee015l6fdace0 ,则levels = 1: 2表示,第1 层子目录的名称是长度为1 的字符0 ,第2 层子目录的名称是长度为2 的字符ce,) - keys_zone 参数:指定缓存区名称及大小,例如, cache_one: 50 m 表示缓存区名称为cache_one ,在内存中的空间是50MB
- inactive 参数:表示主动清空在指定时间内未被访问的缓存。例如, lm 清空在1 分钟内未被访问过的缓存, lh 表示1 小时, ld 表示1 天等
- max_size 参数:表示指定磁盘空间大小。例如, 500m,10g
注意
Nginx 在进行缓存时,首先会被写人proxy_temp_path 指定的临时目录中,因此建议proxy_ cache_path 和proxy_temp_path 指令设置的目录应在同一个文件系统中,避免不同文件系统之间的磁盘I/ 0 消耗。
http {
# 代理临时目录,当上游服务器的响应过大不能存储到配置的缓冲区域时,Nginx存储临时文件硬盘路径。
proxy_temp_path proxy_temp_dir;
# web缓存目录和参数设置
proxy_cache_path proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1m max_size=500m;
server {
listen 80 ;
server_name www.test.com;
#增加两个响应头信息,用于获知访问的服务帮地址与缓存是有成功
add_header X-Via $server_addr; # 表示服务器地址
add_header X-Cache $upstream_cache_status; # 表示资源缓存状态
location / {
#设置缓存区域名称
proxy_cache cache_one ;
#以域名、URI、参数组合成Web 缓存的Key值, Nginx 根据Key 值哈希
proxy_cache_key $host$uri$is_args$args;
#对不同的HTTP 状态码设置不同的缓存时间
proxy_cache_valid 200 10m; #200缓存10分钟
proxy_cache_valid 304 1m; #304缓存1分钟
proxy_cache_valid 301 302 1h; #301 302缓存1小时
proxy_cache_valid any 1m; #其他未设置的状态码缓存1分钟
# 设置反向代理
proxy_pass http://10.240.171.42:8007;
}
}
}
proxy_cache_key 指令参数中使用的具体内置变量的说明如下。
- $host : 服务器的域名,如www.test.com。
- $uri :域名和参数之间的部分,如/index.html 。
- $is_args : 有URL 参数时,则值为?,否则为空字符串。
- $args : 保存URL 参数,如a=l&b=2 ,没有参数时为空字符串。
- 利用$is_args 和$args ,可以实现根据不同URL 参数缓存不同文件。
$upstream_cache_status的返回值如下
返回值 | 说明 |
---|---|
HIT | 缓存命中 |
MISS | 未命中,请求被传送到后端 |
EXPIRED | 缓存已经过期,请求被传送到后端 |
UPDATING | 正在更新缓存,将使用旧的应答 |
STALE | 无法从后端服务器更新缓存时,返回了旧的缓存内容(可通过proxy_cache_use_stale指令配置) |
BYPASS | 缓存被绕过了(可通过proxy_cache_bypass 指令配置) |
REV ALIDA TED | 启用proxy_cache_revalidate 指令后,当缓存内容过期时, Nginx 通过一次If-Modified-Since 的请求头去验证缓存内容是否过期,此时会返回该状态 |
指令 | 说明 |
---|---|
proxy_cache_bypass | 用于配置Nginx 向客户端发送响应数据时,不从缓存中获取的条件 |
proxy_cache_lock | 用于设置是否开启缓存的锁功能 |
proxy_cache_lock_timeout | 用于设置缓存的锁功能开启以后锁的超时时间 |
proxy_no_cache | 配置在什么情况下不使用缓存功能 |
proxy_cache_min_uses | 当同一个URL 被重复请求达到指定的次数后,才对该URL 进行缓存 |
proxy_cache_revalidate | 用于当缓存内容过期时, Nginx 通过一次If-Modified-Since 的请求头去验证缓存内容是否过期 |
proxy_cache_use_stale | 设置状态,用于内容源Web 服务器处于这些状态时, Nginx 向客户端响应历史缓存数据 |
安装脚本(阿里云ubuntu)
#!/bin/bash
apt update
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar -zxvf nginx-1.14.2.tar.gz
#安装nginx依赖包
# centos使用下面这句
# echo y | apt install pcre-devel zlib-devel openssl-dlevel
# ubuntu使用下面这句
echo y | apt install openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev
cd nginx-1.14.2/
./configure --prefix=/usr/local/nginx --with-http_ssl_module
make && make install
# 创建软链接
ln -s /usr/local/nginx/sbin/nginx /usr/local//sbin/nginx
# n写入ginx.service文件
echo '#!/bin/bash
### BEGIN INIT INFO
# Provides: zhuzhenyuan.cn
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: nginix service
# Description: nginix service daemon
### END INIT INFO
# LSB tags规范,上面这段内容有,就可以支持 systemctl enable nginx.service,或者直接 apt-get remove insserv
DAEMON=/usr/local/nginx/sbin/nginx
case "$1" in
start)
echo "Starting nginx daemon..."
$DAEMON && echo "NGINX RUN SUCCESS"
;;
stop)
echo "Stopping nginx daemon..."
$DAEMON -s stop && echo "NGINX STOP SUCCESS"
;;
quit)
echo "Stopping nginx daemon..."
$DAEMON -s quit && echo "NGINX QUIT SUCCESS"
;;
reload)
echo "Reloading nginx daemon..."
$DAEMON -s reload && echo "NGINX RELOAD SUCCESS"
;;
restart)
echo "Restarting nginx daemon..."
$DAEMON -s quit
$DAEMON && echo "RESTARTING NGINX SUCCESS"
;;
*)
echo "Usage: dervice nginx{start|stop|quit|restart|reload}"
exit 2
;;
esac' > /etc/init.d/nginx
# 添加权限
chmod u+x /etc/init.d/nginx
# unmask:取消对 unit 的注销。
systemctl unmask nginx.service
nginx
仅供参考