Nginx

Nginx内部进程模型:

在这里插入图片描述
1.在nginx启动后,会有一个master进程和多个worker进程,
master进程主要用来管理worker进程,包括:接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程。
基本的网络事件会交给worker进程处理。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的 。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。
worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,这里面的原因与nginx的进程模型以及事件处理模型是分不开的 。
2.当master接收到重新加载的信号会怎么处理(./nginx -s reload)?
master会重新加载配置文件,然后启动新的进程,使用的新的worker进程来接受请求,并告诉老的worker进程他们可以退休了,老的worker进程将不会接受新的,老的worker进程处理完手中正在处理的请求就会退出。
3.worker进程是如何处理用户的请求呢?
首先master会根据配置文件生成一个监听相应端口的socket,然后再faster出多个worker进程,这样每个worker就可以接受从socket过来的消息(其实这个时候应该是每一个worker都有一个socket,只是这些socket监听的地址是一样的)。
当一个连接过来的时候,每一个worker都能接收到通知,但是只有一个worker能和这个连接建立关系,其他的worker都会连接失败
为了解决这个问题,nginx提供一个共享锁accept_mutex,有了这个共享锁后,就会只有一个worker去接收这个连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。
在这里插入图片描述
master-workers的机制的好处
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个worker

Nginx 同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。
所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。

#设置worker数量
worker_processes 4
#work绑定cpu(4 work绑定4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
#work绑定cpu (4 work绑定8cpu中的4) 。
worker_cpu_affinity 00000001 00000010 00000100 00001000  00010000  00100000 01000000  10000000
#连接数
worker_connections 1024

这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。
当然,这里说的是最大连接数,对于HTTP请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes,
如果是支持http1.1的浏览器每次访问要占两个连接,
所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是HTTP作为反向代理来说,
最大并发数量应该是worker_connections * worker_processes/4。

Nginx作用以及常见配置

反向代理:

nginx.conf配置文件中加入

    server {
        listen       80;
        server_name  localhost;//第一步localhost换成主机ip地址

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            proxy_pass http://127.0.0.1:8080; //第二步加上这段代码 
            index  index.html index.htm;
        }

当然你也可以这样配置

# 第二种:
server {
		listen 82;
		server_name localhost;
		location / {
			proxy_pass http://localhost:8222; 	# 反向代理配置,将请求转发到指定服务[网关服务]Ip地址
		}
	}	
# 第三种:
server {
		listen       83;
		server_name  localhost;
		location / {
			proxy_pass http://targetserver;# 反向代理配置,将请求转发到指定服务[网关服务]域名
		}
	}

负载均衡:

权重:weight代表权,重默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:

upstream server_pool{   
server 192.168.5.21 weight=1;    
server 192.168.5.22 weight=2; 
server 192.168.5.23 weight=3;   
}

ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:

 upstream server_pool{    
 ip_hash;     
 server 192.168.5.21:80;    
 server 192.168.5.22:80;     
 }

fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream server_pool{   
server 192.168.5.21:80;    
server 192.168.5.22:80;    
fair;    
}

轮询(默认)

upstream myserver{
	server 127.0.0.1:8080;
	server 127.0.0.1:8081;
	}
server {
        listen       80;
        server_name  localhost;//第一步localhost换成主机ip地址

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            //proxy_pass http://127.0.0.1:8080;  
            proxy_pass http:myserver; //代理指向轮询的地址
            index  index.html index.htm;
        }

静态资源(动静分离):

server {
        listen       80;
        server_name  localhost;//第一步localhost换成主机ip地址

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location /image/ {
            root /data/;
            autoindex on;
        }
        location /www/ {
        	root /data/;
        	autoindex om;
        	index index.html index.tml;
        }

nignx启动脚本

@echo off
cd /d D:\java\nginx-1.24.0
start cmd /k nginx.exe

在这里插入图片描述
放到桌面就行,运行就能用
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值