一、初识
1、相关概念
1)正向代理
一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得内容返回给客户端。
2)反向代理
位于用户与目标服务器之间,但是对于用户而言,反向代理服务器相当于目标服务器,即用户值机额访问反向代理服务器就可以获得目标服务器的资源。用户不需要知道目标服务器的地址,也无需在用户端做任何设定。
3)负载均衡
指将负载进行平衡、分摊到多个操作单元上进行运行。
4)动静分离
在web服务器结构中,将静态页面与动态页面或者静态内容接口和动态内容接口分来不同系统访问的架构设计方法,进而提升整个服务器的访问性能和可维护性。
2、安装
nginx官网
Linux版本官方安装步骤:
安装成功:
安装时存在的问题指路:
linux安装nginx遇到的报错
安装后的资源目录:
类型 | 路径 |
---|---|
nginx.conf配置文件 | etc/nginx/nginx.conf |
nginx启动脚本 | etc/sysconfig/nginx |
nginx log | var/log/nginx |
nginx pid | var/run/nginx.pid |
3、虚拟主机配置
1、配置文件
//查看安装路径
nginx -t
#设置worker进程的归属 用户 用户组
#user nobody;
#指定worker进程数 自动
worker_processes 1;
# 设置错误日志的位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 指定master进程编号 存储的位置
#pid logs/nginx.pid;
events {
#单个worker进程最大的连接数
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#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;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
client_max_body_size 100M;
#gzip on;
#一个server就是一个服务
server {
listen 80;
server_name lcoalhost;
location / {
#当前web服务资源存放的位置
root html;
index index.html index.html;
}
#error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html{
root html;
}
}
}
4、配置域名
在安装nginx目录下,创建文件夹study、work、relex,并创建文件index.html
在上面配置文件中添加server
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
server {
listen 80;
server_name study.com;
root /etc/nginx/study;
location / {
index index.html;
}
}
server {
listen 80;
server_name relex.com;
root /etc/nginx/relex;
location / {
index index.html;
}
}
server {
listen 80;
server_name work.com;
root /etc/nginx/work;
location / {
index index.html;
}
}
}
以Linux为例,本机去测试。
在C:\Windows\System32\drivers\etc中找到host文件,添加192.168.21.129 study.com relex.com work.com
ip地址可以使用ip addr查询
直接访问配置的域名即可。
三个域名通过CDN服务解析出来的IP应该是同一个,Nginx会根据请求的域名来调用对应的服务来处理请求
4、location匹配规则
location会根据用户请求中的url来匹配上面的/URI表达式,如果可以匹配,选择location{}块中的配置来处理用户请求。
location[=|~*]/uri/ {
…
}
~
标识一个正则匹配,区分大小写
~*
标识执行一个正则匹配,不区分大小写
=
进行普通字符精确匹配
注意/和{之间的空格
优先级:
实际使用配置:
//代理
location =/ {
procy_pass http://tomcat:8080/index
}
//静态文件请求
//目录匹配
location ^~/static/ {
root/webroot/static/;
}
//后缀匹配
location ~*\.(gif|jpg|jpeg|png|css|js|ico)$ {
root/webroot/res/;
}
//通用规则,用来转发动态请求到后端应用服务器,非静态文件请求默认是动态
location / {
procy_pass http://tomcat:8080/
}
二、应用实战
1、实现反向代理
主要就是在配置文件中,配置
server{
listen 80;
server_name localhost;
location / {
#这里的i地址是服务器的地址,端口是项目
proxy_pass http://192.168.20.1:8081;
#提交方式
proxy_method POST;
}
}
注意这里的代理请求方式
用于将客户端请求转发给后端服务器或负载均衡器,并传递一些请求头信息,以便于日志记录或保留客户端信息
#在localtion中加入
#将客户端请求的Host头部设置为变量的值,保存客户端请求的服务器名称
proxy_set_header HOST $host;
#保存客户端请求的协议(HTTP/HTTPS)
proxy_set_header X-Forwarded-Proto $scheme;
#将客户端的真实IP地址传递给后端服务器,而不考虑请求是否经过了代理或负载均衡器
proxy_set_header X-Real-IP $remote_addr;
#所有经过的代理服务器的IP地址都追加到 X-Forwarded-For 字段中,以便后端服务器能够获取整个请求链上的IP地址信息
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 如果你只关心客户端的真实IP地址,而不需要了解请求的传递路径,可以使用 proxy_set_header X-Real-IP
$remote_addr; 这个指令,将客户端的真实IP地址直接传递给后端服务器。 - 如果你需要了解请求的传递路径以及所有经过的代理服务器的IP地址,可以使用 proxy_set_header X-Forwarded-For
$proxy_add_x_forwarded_for; 这个指令,将整个请求链上的IP地址信息传递给后端服务器。
2、负载均衡
- 网络负载均衡的大致原理是利用一定的分配策略将网络负载平衡的分摊大网络集群的哥哥操作单元上,使得单个重负载任务能够分担到多个单元上进行处理,使得大量并发访问或数据流量分担到多个单元上分别处理,从而减少用户的等待响应时间
- upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡
#负载均衡配置
upstream web_test {
#服务器列表
server 192.168.20.1:8081;
server 192.168.20.1:8082;
server 192.168.20.1:8083;
}
server{
listen 80;
server_name localhost;
location / {
#和upstream是对应的
proxy_pass http://web_test ;
}
}
- server 192.168.20.1:8081 down; 当前服务器停用
- server 192.168.20.1:8081 backup; 当前服务器是备用服务器
- server 192.168.20.1:8081 weight; 当前server负载过重,权重越大被请求几率越大,默认是1
3、负载均衡策略
1)轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
会出现会话不一致的问题
2)IP Hash
如果是同一个IP,就分配到一个后端服务器中
在upstream 中加入 ip_hash;
3)权重
服务器性能不一样,性能好的承担更多
可以指定轮询比率,weight和访问几率成正比
server 192.168.20.1:8081 weight=1;
server 192.168.20.1:8082 weight=2;
server 192.168.20.1:8083 weight=3;
4、动静分离
location ~* .(.jpg|png|js|css|gif){
静态资源存放的路径包
root static;
#过期时间
expires 1d;
}
5、原理分析
1)进程模型分析
- 多进程方式:进程之间是独立的,如果要保证数据的一致性,就要进程之间的数据复制,资源开销增大
- 多线程方式:共享内存,
- 异步方式:客户端发送请求到服务器,可以立马操作其他业务
在这里插入图片描述
2)热部署
/sbin/nginx -c conf/nginx.conf -s reload
3)worker进程处理请求
![!](https://img-blog.csdnimg.cn/2bc7fed9360d499dab59cb254d3245c3.png)
master:管理进程,不负责具体的业务处理,接受外界信号,向worker进程发送信号
worker:具体处理用户请求的,数量可以设置,一般和cpu个数一样