一、感性认识
1、俄罗斯的工程师伊戈尔·西索夫(Igor Sysoev),开发的Nginx(官网有两种语言,英语和俄语)
2、使用C语言开发
3、轻量级高并发服务器,支持数以百万级别的TCP连接
4、无论更新配置还是升级Nginx,都可以做到安静转换(服务器不会有任何的丢连接、宕机、或服务中断等情况)
5、19年3月11日,F5 Networks以6.7亿美元的价格收购NGINX,该公司的创始人Igor Sysoev和Maxim Konovalov; Locoh-Donou表示,他们的团队将加入F5继续管理NGINX业务。
6、Nginx是第三大网络服务器软件,全球有超过4亿家用户,其中包括百度、京东、新浪、网易、腾讯、淘宝、星巴克和麦当劳Instagram,Netflix,Airbnb等中外知名网站
二、常用功能
1、Http代理
1.1 正向代理与反向代理
这个图,可以理解为,正向代理用户是知情的。而反向代理,用户是不知情的。
1.2 正向代理
某些科学上网工具扮演的就是典型的正向代理角色。例如,你想直接访问访问谷歌是不通的,于是你可以在国外搭建一台代理服务器(这台服务器,对你和真实想访问的服务器都是能联通的),让代理帮我去请求谷歌,代理把请求返回的相应结构再返回给我。这里的代理是不透明的,用户是清楚有这样一个代理存在的。
1.3 反向代理
10086的例子。大家只需要记得要找移动客服解决问题,就直接拨打10086。但是在电话拨通前,我们并不知道具体是哪个客服和我们沟通。那么这里的10086总机号码就是我们说的反向代理。这里的代理是透明的,用户是不知道的。
2、负载均衡
解决反向代理中,10086总机怎么将我的通话请求分配到具体的一个客服。常见策略如下。
2.1 RR(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2.2 权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
2.3 ip_hash
解决有状态的多个请求,被分到不同服务器的问题。当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
2.4 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
3、Http服务器
Nginx本身也是一个静态资源的服务器(处理动态请求是Nginx的鸡肋,可以考虑搭配其他服务器做动静分离)
三、配置文件
1、配置文件的结构
#全局块
#主要控制nginx子进程的所属用户/用户组、派生子进程数、错误日志位置/级别、pid位置、子进程优先级、进程对应cpu、进程能够打开的文件描述符数目等。
...
#events块
#控制nginx处理连接的方式
events {
...
}
#http块
#是nginx处理http请求的主要配置模块,大多数配置都在这里面进行。
http
{
#http全局块
...
#server块,可有多个(主机设置)
#是nginx中主机的配置块,可以配置多个虚拟主机
server
{
#server全局块
...
#location层,可有多个(URL匹配)
#是server中对应的目录级别的控制块,可以有多个。
location [PATTERN]
{
...
}
location [PATTERN]
{
...
}
#负载均衡(负载均衡服务器设置)
#是nginx做反向代理和负载均衡的配置块,可以有多个
upstream myproject {
.....
}
}
server
{
...
}
#http全局块
...
}
切记:每一个配置都用分号,结尾
2、常用配置
1、user(全局配置)
#用户启动权限,配置错误会有读取相关文件权限不够的情况
user appuser;
2、worker_processes(全局配置)
#默认为1,多开几个,可以减少机器io以及不同cpu切换上下文带来的影响。官方的建议是修改成CPU的内核数
worker_processes 1;
3、error_log地址(全局配置)
#错误日志存放地(日志文件 错误日志级别)
error_log /DATA/nginx/logs/error.log warn;
4、主进程pid号存放位置(全局配置)
#进程号存放地址
pid /var/run/nginx.pid;
5、worker_connections(events配置)
#单个线程最大连接数
worker_connections 1024;
6、include
#当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然后浏览器根据Content-Type的值处理文件。
include /etc/nginx/mime.types;
#主配置文件nginx.conf中指定包含其他扩展配置文件,从而简化nginx主配置文件,实现多个站点功能
include /etc/nginx/conf.d/*.conf;
7、log_format(http全局配置)
# 日志格式 $remote_addr #记录访问网站的客户端地址 $remote_user #远程客户端用户名
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
8、upstream(http配置)
官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
#负载使用权重策略,portal.upstream名字在location中使用
upstream portal.upstream {
server 0.0.0.0:7700 weight=10;
server 0.0.0.1:7700 weight=9;
}
#使用ip_hash,通过ip计算哈希值,保证同一个ip能访问固定的web
upstream portal.upstream {
server 0.0.0.0:7700 ;
server 0.0.0.1:7700 ;
ip_hash;
}
9、location(配置)
1、ocation 是在 server 块中配置。
2、可以根据不同的 URI 使用不同的配置(location 中配置),来处理不同的请求。
3、location 是有顺序的,会被第一个匹配的location 处理。
#语法
#=:精确匹配(必须全部相等)
#~:大小写敏感
#~*:忽略大小写
#^~:只需匹配uri部分
#@:内部服务跳转
location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
upstream static {
server 0.0.0.0:7700 ;
server 0.0.0.1:7700 ;
ip_hash;
}
server {
location ^~/dp/ {
#http://static/ 中的static与upstream 中的static一致
proxy_pass http://static/;
}
}
四、命令行参数和信号
1、命令行参数
F:\software\nginx-1.14.2>nginx.exe -h
nginx version: nginx/1.14.2
Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload 传递一个信号,stop快速关闭,quit从容关闭,reopen重新打开日志文件、用于切换日志文件,reload重载配置文件
-p prefix : set prefix path (default: NONE)设置默认路径
-c filename : set configuration file (default: conf/nginx.conf)设置配置文件
-g directives : set global directives out of configuration file
2、信号
可以使用信号系统来控制主进程。默认,nginx 将其主进程的 pid 写入到 /usr/local/nginx/nginx.pid 文件中。通过传递参数给 ./configure 或使用 pid 指令,来改变该文件的位置。
主进程可以处理以下的信号:
信号 | 作用 |
---|---|
TERM, INT | 快速关闭 |
QUIT | 从容关闭 |
HUP | 重载配置、用新的配置开始新的工作进程、从容关闭旧的工作进程 |
USR1 | 重新打开日志文件 |
USR2 | 平滑升级可执行程序。 |
WINCH | 从容关闭工作进程 |
尽管你不必自己操作工作进程,但是,它们也支持一些信号:
信号 | 作用 |
---|---|
TERM, INT | 快速关闭 |
QUIT | 从容关闭 |
USR1 | 重新打开日志文件 |
1、使用信号加载新的配置
kill -HUP pid
nginx -s reopen //两个相同效果
当 nginx 接收到 HUP 信号,它会尝试先解析配置文件(如果指定配置文件,就使用指定的,否则使用默认的),成功的话,就应用新的配置文件(例如:重新打开日志文件或监听的套接 字)。之后,nginx 运行新的工作进程并从容关闭旧的工作进程。通知工作进程关闭监听套接字但是继续为当前连接的客户提供服务。所有客户端的服务完成后,旧的工作进程被关闭。 如果新的配置文件应用失败,nginx 将继续使用旧的配置进行工作。
2、使用信号加载新的配置
1、发送 USR2 (kill -USR2 pid)信号给主进程
主进程将重命名它的 .pid 文件为 .oldbin (比如:/usr/local/nginx/logs/nginx.pid.oldbin)
2、执行新的可执行程序
3、在这时,两个 nginx 实例会同时运行,一起处理输入的请求。要逐步停止旧的实例,你必须发送 WINCH(kill -WINCH oldPid) 信号给旧的主进程,然后,它的工作进程就将开始从容关闭
4、如果尝试升级成功,而你也希望保留新的服务器时,发送 QUIT(kill -QUIT oldPid) 信号给旧的主进程使其退出而只留下新的服务器运行