因为要做服务器的一些代理转发等,学习一下Nginx.由于Nginx涉及指令比较多,这里写常用的.
Nginx 是一款高性能的 HTTP 和反向代理服务器软件.
Nginx 由内核和一系列模块组成:内核提供 web 服务的基本功能,如启用网络协议、创建运行环境、接收和分配客户端请求、处理模块之间的交互。模块实现 Nginx 的各种功能和操作,Nginx 的模块从结构上分为核心模块、基础模块和第三方模块。
- 核心模块: HTTP 模块、EVENT 模块和 MAIL 模块
- 基础模块: HTTP Access 模块、HTTP FastCGI 模块、HTTP Proxy 模块和 HTTP Rewrite 模块
- 第三方模块: HTTP Upstream Request Hash 模块、Notice 模块和 HTTP Access Key 模块及用户自己开发的模块
当 web 应用发展到一定程度时,单台服务器不足以支撑业务的正常运行,为增大吞吐量往往会使用多台服务器一起提供服务,如何充分利用多台服务器的资源,就需要一个‘调度员’,这个调度员要求能高效的接收并分发请求,知道后端的服务器健康状态,要能方便的扩展和移除,这就是 Nginx 又一常见应用架构,此架构充分利用了 Nginx 的反向代理和负载均衡的优势,Nginx 本身不提供 web 服务,而是在前端接受 Web 请求并分发到后端服务器处理,后端服务器可以是 Apache、Tomcat、IIS 等
简单来说,常用于负载均衡和反向代理,当然基本的静态资源处理转发这些也都有.
Nginx组成
- Nginx 二进制可执行文件
nginx
:由各模块源码编译出的一个文件 nginx.conf
配置文件:控制 Nginx 的行为access.log
访问日志:记录每一条 http 请求信息error.log
错误日志:定位问题
开源免费的 Nginx 与商业版 Nginx Plus
下面介绍在Linux平台下的安装和基本使用.
安装
在Linux平台下,直接使用与操作系统相关的安装命令即可,比如这里使用yum1
sudo yum install nginx
当然也可以使用二进制安装方式,这里不做过多介绍.安装后1
nginx -v
查看版本信息
安装后的目录
Nginx 模块分类
- 核心模块:nginx 最基本最核心的服务,如进程管理、权限控制、日志记录;
- 标准 HTTP 模块:Nginx 服务器的标准 HTTP 功能;
- 可选 HTTP 模块:处理特殊的 HTTP 请求;
- 邮件服务模块:邮件服务;
- 第三方模块:作为扩展,完成特殊功能
主要修改的配置文件
命令1
nginx -t
测试配置文件语法同时可以看运行的是哪个配置文件.
1
2
3
4
5
6nginx -s stop #快速关闭
nginx -s quit #平稳关闭
nginx -s reload #重新加载
nginx -c filename 为Nginx指定配置文件.
nginx -t #测试配置文件
nginx -v #查看版本信息
查看conf配置文件1
2
3
4
5user www www;
worker_processes auto;
error_log /www/wwwlogs/nginx_error.log crit;
pid /www/server/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
因为Nginx设计到端口开放,这里写一些关于防火墙设置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#可以先查看防火墙的开启状态,如果显示 running 则是正在运行
systemctl status firewalld
#关闭防火墙,不用配置端口,但是不安全
systemctl stop firewalld
#开启防火墙
systemctl start firewalld
#添加开启端口,--permanent表示永久打开,不加是临时打开重启之后失效
firewall-cmd --permanent --zone=public --add-port=8080/tcp
#重启防火墙,永久打开端口需要reload一下
firewall-cmd --reload
#查看防火墙,添加的端口也可以看到
firewall-cmd --list-all
模块配置
全局配置参数一般用user,work_processes,error_log,pid.1
2
3
4
5
6events
{
use epoll;
worker_connections 51200;
multi_accept on;
}
而events用于设置工作模式,针对每个进程.
重要的全局变量
HTTP 相关的变量 | |
---|---|
$host | 请求行中的 Host,如果有 Host 请求头,则用其值替换掉请求行中的主机名,如果请求中没有 Host 行和 Host 请求头,则等于请求匹配的 server 名称(处理请求 server 的 server_name 指令的值),值为小写,不包含端口 |
$uri | 请求中的当前 URI(不同于 URL ,不包括 ? 后面的请求参数,参数位于 $args ),不同于浏览器传递 $request_uri 的值,它可以通过内部重定向,或者使用 index 指令进行修改,不包括协议和主机名,例如 /abc/ef.html |
$document_uri | 当前请求在 root 指令中指定的值,与 $uri 完全相同,历史问题存在 |
$request_uri | 完整的原始请求 URL(包括 URI 和完整的参数),它无法修改,请查看 $uri 更改或重写 URL |
在配置文件中,没有放在任何上下文中的指令都处在主上下文中。events
和 http
的指令是放在主上下文中,server
放在 http
中,location
放在 server
中。
location匹配
location 指令用于仅匹配 uri,忽略参数,可以使用合法的字符串或者正则表达式
语法:1
2
3location [ = | ~ | ~* | ^~ | 空] uri {
……
}
指令后面:
=
:精确匹配,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找^~
:前缀匹配,用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配。采用该规则,不再进行后续的正则查找。跟=
的区别是,不需要 uri 一模一样,只需要开头和 uri 匹配即可。~
:正则匹配,表示用该符号后面的正则 uri 去匹配路径,区分大小写~*
:正则匹配,表示用该符号后面的正则 uri 去匹配路径,不区分大小写。空
:普通匹配(最长字符匹配),匹配以 uri 开头的字符串,只能是普通字符串。例如,location /
是通用匹配,任何请求都会匹配到。另外普通匹配与 location 顺序无关,是按照匹配的长短来确定匹配结果。
1 | location =` > `location 完整路径`(还会去匹配正则) > `location ^~ 路径` > `location ~,~* 正则顺序` > `location 部分起始路径` > `location / |
即:精确匹配 > 最长字符串匹配,完全匹配(还会去匹配正则) > 前缀匹配 > 正则匹配 > 普通匹配(最长字符串匹配,部分匹配) > 通用匹配
@
开头的是用于内部跳转的命名 location。
常用配置
设置日志
日志很重要,便于debug
使用log_format设置
log一般有access_log和error_log,error_log后面直接添加错误等级,而access_log后可以设置输出格式.1
2
3
4
5
6
7
8
9log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /www/wwwlogs/www.proanimer.com.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"';
#log_format配置在http中
access_log /www/wwwlogs/www.proanimer.com.log main; #在对应的server中
remote_addr:对应客户端的地址
remote_user:是请求客户端请求认证的用户名,如果没有开启认证模块的话是值为空。
time_local:表示nginx服务器时间
request:表示request请求头的行
status:表示response的返回状态
body_bytes_sent:表示从服务端返回给客户端的body数据大小
http_referer:表示请求的上一级页面
http_user_agent:表示agent信息
http_x_forwarded_for:会记录每一级请求中信息
反向代理
1 | location ^~ /files/ |
静态网站
1 | location ^~ /navigator |
此外Nginx还有很多东西,后面会继续更新.