解释图:==apache采用同步模式处理客户端请求,数据库服务器采用阻塞模式等待响应。Nginx作为Web服务器采用异步非阻塞模式处理客户端请求和等待数据库响应。相比apache,Nginx在相同硬件配置下,可以将并发处理能力提升3到8倍。在处理客户端请求时,apache在向后端服务器发起请求后,线程会一直等待响应;而Nginx会创建事件并将任务挂起,不占用进程资源,从而节省资源并支持更多并发连接。==
#### ==1. 同步与异步==
- **同步**: 任务按顺序执行,一个任务完成后再执行下一个任务。- **例子:** 去银行排队办理业务,前一个人办完你才能开始。
- **异步**:任务可以立即返回,程序可以在任务执行的同时继续执行其他任务。- **例子:** 点外卖,下单后可以继续做其他事情,外卖送达时会收到通知。
#### ==2. 阻塞与非阻塞==
- **阻塞**:在执行某个线程或进程时,程序会暂停执行其他线程或进程,直到该任务完成。- **例子:** 等红绿灯,必须停下来等待绿灯亮起才能继续行驶。
- **非阻塞**:在执行某个线程或进程时,程序不会暂停执行其他线程或进程,线程或进程完成后会通过回调函数或其他机制通知程序。- **例子:** 使用智能烤面包机,面包烤好后会自动弹出并发出提示音,期间你可以做其他事情。
#### 3 代理:
==反向代理:代替后端服务器接受用户请求的角色(nginx)==
==正向代理:代替客户端去访问目标服务器的角色(squid)==
反向代理是指nginx服务器代替后端服务器接收用户请求,并根据请求类型将动态资源交给后端服务器处理;而正向代理则是指squid服务器代替客户端访问目标服务器,它通常用于绕过防火墙或访问受限资源。
![[Pasted image 20240929210952.png]]
解释:在部分反向代理过程中,当用户请求静态资源时,Nginx服务器直接响应;对于动态资源,Nginx通过`proxy_pass`模块将请求转发给Apache服务器。==在反向代理过程中,Nginx接收用户请求,作为客户端发起TCP连接到Apache服务器获取资源,Apache处理后,Nginx将响应结果返回给用户。==
#### 4 负载均衡:
负载均衡的概念是什么?
==首先在服务器构建方式上,当多台服务器共同处理同一件事情就是分布式服务,而负载均衡是分布式的一种,是指在多台服务器上实现同一类任务(而非同一件事情)时,通过分担压力的方式来提高整体性能和稳定性。==例如,当一个人无法独自处理大量煎饼制作工作时,可以找到其他人帮忙,这样就形成了负载均衡的关系。
Nginx与Apache如何结合实现负载均衡?
在生产环境中,通常使用==Nginx作为负载均衡器,它能够将动态资源请求分配给处理能力更强但并发性能较弱的Apache服务器,同时将静态资源请求交给并发能力强的Nginx来处理。==这样,两者优势互补,确保了系统的稳定性和高效性。
如图:
![[Pasted image 20240929210920.png]]
#### 5==Nginx的工作模式==
**master-worker模式**:一个master进程管理和监控多个worker进程,worker进程负责处理具体的业务逻辑。这种模式适用于生产环境,具有高稳定性和性能优势。
**单进程模式**:只有一个进程处理所有任务,适合开发和调试环境。
## 二、Nginx实验:
<注意事项>
1. 注意配置文件中的结尾有;作为结束~!(切记!)
2. 每次实验修改完配置文件后需要热重启nginx才会生效
``` shell
nginx -s reload
```
### 实验1:Nginx的状态统计
``` shell
#安装nginx时将 --with-http_stub_status_module 模块开启
#修改nginx配置文件(写入要访问的server标签中)
vim /usr/local/nginx/conf/nginx.conf
#添加
location /nginx_status{
stub_status on;
access_log off;
}
#客户端访问网址:http://IP/nginx_status
"Active connections"表示当前的活动连接数;
"server accepts handled requests"表示已经处理的连接信息
三个数字依次表示已处理的连接数(根keepalive时间有关)、成功的TCP握手次数(根keepalive时间有关)、已处理的请求数(即请求页面)
```
### **实验2:目录保护
a、原理和apache的目录保护原理一样(利用上一个实验接着完成)
b、在状态统计的location中添加:
``` shell
vim /usr/local/nginx/conf/nginx.conf
#添加
location /nginx_status{
stub_status on;
auth_basic "Welcome to nginx_status!";
auth_basic_user_file /usr/local/nginx/conf/htpasswd.nginx;
}
cd /usr/local/nginx/conf
yum -y install httpd-tools
#使用Apache的命令htpasswd进行用户密码文件的创建(生成在上面指定的位置)
htpasswd -c /usr/local/nginx/conf/htpasswd.nginx user
```
d、重启nginx并再次访问统计页面
``` shell
nginx -t #检测配置文件
nginx -s reload #重新加载配置文件
```
### **实验3:基于IP访问控制
a、接着上一个实验完成操作
b、在状态统计的location中添加:
``` shell
vim /usr/local/nginx/conf/nginx.conf
#添加
location /nginx_status{
stub_status on;
auth_basic "Welcome to nginx_status!";
auth_basic_user_file /usr/local/nginx/conf/htpasswd.nginx;
allow 192.168.90.1;
deny 192.168.90.0/24;
}
#仅允许192.168.90.1访问服务器
```
d、重启nginx并再次访问统计页面
``` shell
nginx -t #检测配置文件
nginx -s reload #重新加载配置文件
```
### **实验4:==nginx的虚拟主机(基于域名)==
a、提前准备好两个网站的域名,并且规划好两个网站网页存放目录
b、在Nginx主配置文件中并列编写两个server标签,并分别写好各自信息
``` shell
#请提前搭好项目
vim /usr/local/nginx/conf/nginx.conf
#虚拟主机标签
server {
listen 80;
server_name www.blog.com;
location / {
root html/blog;
index index.html index.htm index.php info.php;
}
location ~ \.php$ {
root html/blog;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
}
}
```
c、分别访问两个不同的域名验证结果
``` shell
nginx -t #检测配置文件
nginx -s reload #重新加载配置文件
```
### **实验5****:==nginx反向代理(全局或部分反向代理)==
代理和反向代理?
正向代理:找别人代替你去完成一件你完不成的事(代购),代理的对象是客户端
反向代理:替厂家卖东西的人就叫反向代理(烟酒代理) ,代理的对象是服务器端
a、在另外一台机器上安装apache,启动并填写测试页面
b、在nginx服务器的配置文件中添加(写在某一个网站的server标签内)
核心:proxy_pass模块
##### 部分反向代理和全局反向代理
``` shell
vim /usr/local/nginx/conf/nginx.conf
#部分反向代理
location ~ \.php$ {
proxy_pass http://92.168.88.100:80;
}
#用之前要把部分反向代理关了,全局反向代理,写在配置文件的网页目录下
location / {
proxy_pass http://192.168.88.100:80; #此处填写apache服务器的IP地址
}
```
c、重启nginx,并使用客户端访问测试
``` shell
nginx -t #检测配置文件
nginx -s reload #重新加载配置文件
#在浏览器输入 IP/index 测试效果
```
### **实验6 ==负载均衡(结合反向代理才能实现)==
```
负载均衡(Load Balance)其意思就是将任务分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
核心:upstream模块和proxy_pass模块
可以使用调度算法指定被调度对象的权重
算法:
RR #轮询 把请求均匀的分配给各个服务器,避免单个服务器压力过大
WRR #加权轮询 有权重的轮询
a、使用默认的rr轮训算法,修改nginx配置文件
``` shell
vim /usr/local/nginx/conf/nginx.conf
upstream bbs1 { #此标签在server标签前添加
server 192.168.90.101 weight=1;
server 192.168.90.100 weight=2;
}
server {
........;
#修改自带的location / 的标签,将原内容删除,添加下列两项
location / {
proxy_pass http://bbs1; #添加反向代理,代理地址填写upstream声明的名字
proxy_set_header Host $host; #重写请求头部,保证网站所有页面都可访问成功
}
}
```
c、开启并设置两台90.101 & 90.100的主机
安装apache并设置不同的index.html页面内容(设置不同页面是为了看实验效果)
d、重启nginx,并使用客户端访问测试
``` shell
nginx -t #检测配置文件
nginx -s reload #重新加载配置文件
#在浏览器输入 IP/index 测试效果
```
拓展补充:wrr算法实现加权轮询(后期集群再讲更多算法类型和功能)
``` shell
upstream bbs {
server 192.168.88.100:80 weight=1;
server 192.168.88.200:80 weight=2;
}