Nginx ABC

一、感性认识

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) 信号给旧的主进程使其退出而只留下新的服务器运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值