web服务器-Nginx

web服务器-Nginx

Nginx简介

同步与异步:

(web服务器在处理用户请求时的一种处理方式)
同步与异步的重点在消息通知的方式上,也就是调用结果的通知方式不同。
#同步:
	当一个同步调用发出去后,调用者要一直等待调用的结果通知后,才能进行后续的执行。
Apache:会将同一个页面上的所有资源都查询到并汇总在一起,同时回传给用户
# 异步:
	当一个异步调用发出去后,调用者不必一直等待调用结果的返回,异步调用,要想获得结果,
Nginx :将同一个页面上的资源进行查询,查到一个就回传一个,直到将所有资源都回传完毕结束
# 一般有两种方式:
	1、主动轮询异步调用的结果;
	2、被调用方通过callback(回调通知)来通知调用方调用结果。

阻塞与非阻塞:

	(客户端(Nginx)在请求服务器端(MySQL)数据时,等待服务器端回传数据的模式)
阻塞与非阻塞的重点在于进/线程等待消息时候的行为,也就是在等待消息的时候,当前进/线程是挂起状态,还是非挂起状态。
# 阻塞:
	调用在发出去后,在消息返回之前,当前进/线程会被挂起,直到有消息返回,当前进/线程才会被激活(Nginx会一直等待MySQL将数据查询到后,再将数据填充到PHP页面中,然后回传用户(Nginx进程是处于暂停状态的))
# 非阻塞:
	调用在发出去后,不会阻塞当前进/线程,而会立即返回。
Nginx发现MySQL无法立即回传数据,那么会结束当前进程,会产生一个事件(有一个MySQL的事件),用释放出来的内存资源处理其他用户的请求。
同步与异步,重点在于消息通知的方式;阻塞与非阻塞,重点在于等消息时候的行为。
	大部分程序的I/O模型都是同步阻塞的,单个进程每次只在一个文件描述符上执行I/O操作,每次I/O系统调用都会阻塞,直到完成数据传输。传统的服务器采用的就是同步阻塞的多进程模型。一个server采用一个进程负责一个request的方式,一个进程负责一个request,直到会话结束。进程数就是并发数,而操作系统支持的进程数是有限的,且进程数越多,调度的开销也越大,因此无法面对高并发。
	Nginx采用了异步非阻塞的方式工作。我们先来先了解一下I/O多路复用中的epoll模型。
# epoll模型:
	当连接有I/O事件产生的时候,epoll就会去告诉进程哪个连接有I/O事件产生,然后进程就去处理这个事件。

为什么Nginx比其他web服务器并发高(Nginx工作原理):

Nginx配置use epoll后,以异步非阻塞方式工作,能够轻松处理百万级的并发连接。
# 处理过程:
	每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到可能发生阻塞的地方。比如向后端服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果后端服务器返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有新的request 进来,他就可以很快再按这种方式处理。而一旦后端服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。通过这种快速处理,快速释放请求的方式,达到同样的配置可以处理更大并发量的目的。
LNAMP:
	nginx:抗并发,处理静态请求
	Apache:动态请求,提高稳定性

代理与反向代理:

# 代理:
	代理客户端请求某一个客户端无法直接请求的资源,这种服务器叫做代理服务器
# 反向代理:(Nginx)
	代替服务器端接受客户端请求的,叫做方向代理

Nginx详解

概述

	Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。
	Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强。

工作模式

# nginx有两种工作模式:
	master-worker模式和单进程模式。
	在master-worker模式下,有一个master进程和至少一个的worker进程,单进程模式顾名思义只有一个进程。这两种模式有各自的特点和适用场景。

master-worker

该模式下,nginx启动成功后,会有一个master进程和至少一个的worker进程。master进程负责处理系统信号,加载配置,管理worker进程(启动,杀死,监控,发送消息/信号等)。worker进程负责处理具体的业务逻辑,也就是说,对外部来说,真正提供服务的是worker进程。生产环境下一般使用这种模式,因为这种模式有以下优点:
1. 稳定性高,只要还有worker进程存活,就能够提供服务,并且一个worker进程挂掉master进程会立即启动一个新的worker进程,保证worker进程数量不变,降低服务中断的概率。
2. 配合linux的cpu亲和性配置,可以充分利用多核cpu的优势,提升性能
3. 处理信号/配置重新加载/升级时可以做到尽可能少或者不中断服务(热重启)

单进程模式:

单进程模式下,nginx启动后只有一个进程,nginx的所有工作都由这个进程负责。由于只有一个进程,因此可以很方便地利用gdb等工具进行调试。该模式不支持nginx的平滑升级功能,任何的信号处理都可能造成服务中断,并且由于是单进程,进程挂掉后,在没有外部监控的情况下,无法重启服务。因此,该模式一般只在开发阶段和调试时使用,生产环境下不会使用。(了解)

配置文件结构

$ vim /usr/local/nginx/conf/nginx.conf

user  www www; #修改为以nginx来运行 #程序运行用户和组
worker_processes auto;   #自动,也可写数字1或者2表示几个进程数 #启动进程,指定nginx启动的工作进程数量,建议按照cpu数目来指定,一般等于cpu核心数目 
error_log  /home/wwwlogs/nginx_error.log  crit; #全局错误日志 crit级别以上的记录 
pid     /usr/local/nginx/logs/nginx.pid; #主进程PID保存文件 
worker_rlimit_nofile 51200; #文件描述符数量 
events    
	{      
		use epoll;    #(单独添加)使用epoll模型,对于2.6以上的内核,建议使用epoll模型以提高性能    
		worker_connections 51200;      #工作进程的最大连接数量    
	}

http{    #网站优化参数    
			#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '   
        #  '$status $body_bytes_sent "$http_referer" '    
        #  '"$http_user_agent" "$http_x_forwarded_for"';     
        #access_log  logs/access.log  main; 
        #当想要日志记录格式用mian格式记录时,取消注释则/usr/local/nginx/logs/access.log记录就会是main格式    
    server { #具体的某一网站的配置信息        
    	listen 80; #监听端口        
    	root html; #网页根目录(/usr/local/nginx/html)        
    	server_name www.kernel.com; #服务器域名        
    	index index.html; #默认加载页面        
    	access_log logs/access.log; #访问日志保存位置       
        ......;        
      location (.*)\.php$ {   # 用正则匹配具体的访问对象;        
      }        
      location {        
      跳转等规则;       
      }    
  	}    
  	server {        
  		虚拟主机;        
  		} 
  	}

Nginx相关实验

Nginx的状态统计

安装nginx时将 --with-http_stub_status_module 模块开启,修改nginx配置文件(写入添加要访问的server标签中)

$ vim /usr/local/nginx/conf/nginx.conf
location /status{    
	stub_status on;    开启统计模块    
	access_log  off;    不要记录状态统计的信息。    
	}

$ nginx -t  
$ pkill -HUP nginx

客户端访问网址

http://192.168.15.112/status

"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数、成功的TCP握手次数、已处理的请求数

目录保护

在状态统计的location中添加:

$ vim /usr/local/nginx/conf/nginx.conf
# 在server标签中添加
location /admin {
	auth_basic "Welcome to nginx_status!"; 
	auth_basic_user_file /usr/local/nginx/conf/status.pass;
}

使用Apache的命令htpasswd进行用户密码文件的创建(生成在上面指定的位置)

$ yum -y install httpd 
$ htpasswd -c /usr/local/nginx/conf/status.pass user

重启nginx并再次访问统计页面

$ nginx -t  
$ pkill -HUP nginx

基于IP的身份验证(访问控制)

a、接着上一个实验完成操作

在状态统计的location中添加:

$ vim /usr/local/nginx/conf/nginx.conf
location /status{    
	stub_status on;    开启统计模块    
	access_log  off;    不要记录状态统计的信息。    
	
	allow 192.168.88.1; 
	deny 192.168.88.0/24; # 仅允许192.168.88.1访问服务器
	}	

重启

$ nginx -t  
$ pkill -HUP nginx

nginx的虚拟主机(基于域名)

a、提前准备好两个网站的域名,并且规划好两个网站网页存放目录
# 在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息
$ vim /usr/local/nginx/conf/nginx.conf
server {    
	listen 80;   
   server_name blog.kernel.com;    
   index index.html index.htm index.php;   
   root  html/blog;    
   access_log  logs/blog-access.log  main;
}
server {    
	listen 80;    
	server_name bbs.kernel.com;    
	index index.html index.htm index.php;    
	root  html/bbs;    
	access_log  logs/bbs-access.log  main; 
}

$ nginx -t  
$ pkill -HUP nginx

分别访问两个不同的域名验证结果

 windows添加hosts地址解析
 192.168.66.11 www.typecho.com
 192.168.66.11 www.wordpress.com

nginx的反向代理

代理和反向代理?
代理:代理的对象是客户端
反向代理:代理的对象是服务器端
a、在另外一台机器上安装apache,启动并填写测试页面
b、在nginx服务器的配置文件中添加(写在某一个网站的server标签内

$ vim /usr/local/nginx/conf/nginx.conf
location / {    
	#完全反向代理 
	proxy_pass http://192.168.88.100:80; #此处填写apache服务器的IP地址
}

$ nginx -t  
$ pkill -HUP nginx
c、重启nginx,并使用客户端访问测试

负载调度(负载均衡)

负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

使用默认的rr轮训算法,修改nginx配置文件

upstream bbs { #此标签在server标签前添加    
	server 192.168.88.100:80;    
	server 192.168.88.200:80;    填写apache服务器的IP地址
} 
server {    
	........;    #修改自带的location / 的标签,将原内容删除,添加下列两项    		location / {        
		proxy_pass http://bbs; #添加反向代理,代理地址填写upstream声明的名字        proxy_set_header Host $host; #重写请求头部,保证网站所有页面都可访问成功    }
}

开启并设置两台88.100 & 88.200的主机

安装apache并设置不同的index.html页面内容(设置不同页面是为了看实验效果)

重启nginx,并使用客户端访问测试

拓展补充:rr算法实现加权轮询

upstream bbs { 
	server 192.168.88.100:80 weight=1; 
	server 192.168.88.200:80 weight=2; 
}

1、准备4太虚拟机

1、客户端

2、nginx yum -y install nginx安装 (网络yum源将7改为6即可)(88.110)

将命令创建软连接,重启,并测试主页

vim /usr/local/nginx/conf/nginx.conf

nginx -t pkill -HUP nginx

3、apache yum -y install httpd安装(88.10)

!

在html目录下创建index.html文件,写入www.apache1.com

4、apache yum -y install httpd安装()

在html目录下创建index.html文件,写入www.apache2.com

img

nginx实现https

a、安装nginx时,需要将--with-http_ssl_module 模块开启
b、生成证书和秘钥文件
注意:在实验环境中可以用命令生成测试,在生产环境中必须要在https证书厂商注册

1、生成证书和秘钥文件

cd /usr/local/nginx/conf/ 
mkdir ssl 
cd ssl 
openssl genrsa -out kernel.key 1024 建立服务器私钥,生成RSA密钥 
openssl req -new -key kernel.key -out kernel.csr 需要依次输入国家,地区,组织,email。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书 
openssl x509 -req -days 365 -sha256 -in kernel.csr -signkey kernel.key -out kernel.crt 生成签字证书

2、修改server标签(利用虚拟主机+rewrite的功能)

img

3、在对应要进行加密的server标签中添加以下内容开启SSL

img

4、检查有没有启动nginx和php端口80 9000

netstat -antp

5、重启nginx

pkill -HUP nginx

6、浏览器测试

http://192.168.190.122


posted @ 2020-04-20 10:58  候你已久  阅读(123)  评论(0)    收藏  举报