简介
百度百科:Nginx是一款轻量级、高性能的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。
常见应用场景
- 反向代理
- 负载均衡
- 动静分离
- 缓存服务
常用命令
【操作nginx命令需要进入nginx安装目录的sbin下】:
*** sbin下有nginx文件,由于要操作该文件,.代表当前目录,./代表当前目录下的文件,因此就是 ./nginx
查看nginx版本号: ./nginx -v
启动nginx: ./nginx
关闭nginx: ./nginx -s stop
重新加载nginx: ./nginx -s reload
nginx配置文件介绍
位置:nginx安装目录的conf文件夹下,nginx.conf
... // 全局块
events { // events块
...
}
http { // http块
... // http全局块
server { // server块
... // server全局块
location [Pattern] { // location块
...
}
location [Pattern] {
...
}
}
server {
...
location [Pattern] {
...
}
location [Pattern] {
...
}
}
...
}
全局块
主要包括配置运行Nginx服务器的用户、允许生成的worker process数、日志存放路径、配置文件引入等;worker process值越大,支持的并发量越高。
events块
设置每个work process最大连接数等,该部分主要影响Nginx性能。
http块
- http全局块:包含日志定义、超时时间等
- server块:每个server块相当于一个虚拟主机
- server全局块:配置本虚拟机监听配置
- location块:基于Nginx接收到的请求,对其进行匹配处理、地址定向、数据缓存等
反向代理举例
1、客户端访问nginx服务器http:80端口,转发至nginx所在服务器的8080端口,假设nginx所在服务器IP为1.1.1.1
server{
listen 80;
server_name 1.1.1.1(或域名);
location / {
proxy_pass http://127.0.0.1:8080;
}
}
2、 根据客户端访问的不同路径跳转到不同服务端口
- 访问http://1.1.1.1:6666/test1/ 转发至8081端口
- 访问http://1.1.1.1:6666/test2/ 转发至8082端口
server{
listen 6666;
server_name 1.1.1.1(或域名);
location /test1 {
proxy_pass http://127.0.0.1:8081;
}
location /test2 {
proxy_pass http://127.0.0.1:8082;
}
}
负载均衡举例
根据客户端访问nginx服务器http:80端口,平均转发至nginx所在服务器的8080、8081、8082端口,实现负载均衡效果。假设nginx所在服务器IP为1.1.1.1
upstream代表负载均衡服务器列表
http{
upstream servertest{
server 1.1.1.1:8080 weight=2;
server 1.1.1.1:8081;
server 1.1.1.1:8002;
}
server{
listen 80;
server_name 1.1.1.1(或域名);
location / {
proxy_pass http://servertest;
}
}
}
分配策略:
- 轮询(默认)
- weight(权重):默认为1,权重越高分配的客户端越多,例如upstream中 server 1.1.1.1:8080 weight=2;
- ip_hash:每个客户端请求按照访问的ip哈希值分配,这样只要IP不变,每个客户端固定访问一个后端服务器,可以解决session的问题
upstream{
ip_hash;
server xxxx;
server xxxx;
}
日志
Nginx在安装之后会默认开始日志,分为error_log(错误日志)、 access_log(访问日志),默认日志路径为~nginx/logs。在全局块、http块、server块、location块都可以配置日志,作用域不同。
error_log
记录http请求错误以及nginx本身的运行错误
不能设置日志打印格式,但可设置打印级别,低--->高:info、notice、warn、error、crit、alert、emert等,设置某一级别会打印>=该级别日志。
默认配置:error_log logs/error.log error; 会打印error及以上
支持的作用域:全局、http、server、location
access_log
可以通过log_format设置日志打印格式
默认配置:access_log logs/access.log main;
其中main是log_format的一个格式名称。 假设你可以把main改成temp,那么相应的就要有一个log_format temp 'xxx'来定义格式
支持的作用域:http、server、location
log_format
默认格式:log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
支持的作用域:http
如果没有对应的数据则默认使用-代替
---------------------------部分Nginx内置变量-------------------------
$remote_addr:客户端的IP地址
$remote_user:客户端用户名
$time_local:当前日志条目的时间
$request:HTTP请求的方法、URL和HTTP协议版本
$status:HTTP请求状态 code
$body_bytes_sent:nginx响应客户端请求时,发送到客户端的字节数,不包含响应头的大小
$http_referer:引用地址
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:网络访问路径
将log_format格式修改成如下格式,然后重启nginx才可生效。对比效果如下图。
log_format main 'SURPRISE ~~~ | $time_local | $remote_addr | $http_host | $status | $request_time | $http_host | $request | $http_referer';