nginx介绍
为什么学习nginx
问题1: 客户端到底该给哪一台服务器发送请求
问题2:如果所有的请求发送到一个服务器
问题3:客户端发送请求,有请求静态资源和动态资源
在这里我们在客户端和服务器端加入了nginx,nginx,可以实现动静分离,nginx能够处理静态资源,不用服务器去处理。nginx会有一个负载均衡的算法,判断将请求发到哪个服务器合适。
nginx的历史
nginx是由俄罗斯人研发的,研发的目的是为了应付Rambler(俄罗斯访问量第二)网站,并且在2014年发布
nginx的特点
-
稳定性极强 7*24小时不间断的运行下去
-
nginx提供了非常丰富的实例
-
占用内存小,并发能力强
nginx安装
Docker安装
version: '3.7' services: nginx: image: nginx restart: always container_name: nginx ports: - 80:80 - 443:443#在opt下建立文件夹 [root@localhost opt]# mkdir docker_nginx #建立yaml文件导入上述配置 #一键启动 docker-compose up -d
#进入nginx容器中 [root@localhost docker_nginx]# docker exec -it nginx /bin/bash #找到配置文件 root@a10bdbdf46c8:/# cd /etc/nginx/
nginx离线安装
在有些时候nginx的安装需要在内网机器上安装,所以不能联网,需要手动安装依赖,gcc pcre等依赖,具体不在介绍
查看配置文件
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
#以上统称全局块,worker_processes的数值越大,nginx的并发能力就越强
#error_log 代表错误日志的存放位置
#pid nginx运行的标识
events {
worker_connections 1024;
}
#event块
# worker_connections,它的数值越大,nginx越强
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;
-----------------conf.d/*.conf-----------------
server {
listen 80;
listen [::]:80;
server_name localhost;
/var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#server块
#listen 代表nginx监听的端口号
#localhost代表接收的请求ip
#location块
#root 将接受的请求根据 /usr/share/nginx/html去寻找静态资源
#index 默认去上述的路径中找到index.html或者index.htm,响应给用户
----------------------------------------------
}
#http块
#include 代表引入一个文件-》mime.types存放了大量的媒体信息
#另外一个 include 引入了/etc/nginx/conf.d/*.conf为结尾的配置文件。
####总共五大块
我们主要修改的就是server块,我们只需关注conf.d下的文件就可以啦
nginx反向代理
正向代理的特点
-
正向代理服务器是客户端设立的
-
客户端了解代理服务器和目标服务器都是谁
-
最终的目的是实现突破访问权限,提高访问速度,对,目标服务器隐藏客户端的ip
反向代理
反向代理的特点
-
反向代理服务器是配置在服务端的
-
客户端是不知道访问的是哪一台服务器
-
使用反向代理可以达到负载均衡,可以隐藏服务器的真正ip地址
nginx实现反向代理
#准备一个目标服务器 tomcat服务器,保证直接访问
#需要一个反向代理服务器 Nginx
#修改配置文件
#基于反向代理访问到tomcat
location /{
proxy_pass http://192.168.198.3:8080/;#请求进来转发的位置,通过访问Nginx的80端口就可以访问。
}
#需要一个客户端 浏览器
关于server块中location中的路径映射
#精准匹配
location /{
=精准匹配,主机名后面不能带任何的字符串 /后没东西(www.baidu.com/)
}
#通用匹配
location /XXX{
#匹配所有以/XXX开头的路径
}
#正则匹配
location ~/xxx{
#匹配所有以/XXX开头的路径
}
#匹配开头路径
location ~^ /images/{
#匹配所有images开头的路径
}
#匹配结尾路径
location ~*\.(gif|jpg|png){
#匹配以gif或者jpg或者png结尾的匹配
}
#优先级关系
#精准匹配>正则匹配>(匹配开头和结尾)>通用匹配
nginx负载均衡
nginx默认为我们提供了三种负载均衡的策略
-
轮询 将客户端发起的请求,平均的分配给每一台服务器
-
权重 会将客户端的请求,根据服务器的权重值不同,分配不同的数量
-
ip_hash 基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上,如果IP地址不变,会始终访问一台服务器
轮询
修改配置文件
upstream myserver{
server 192.168.192.3:8080;
server 192.168.192.3:8081;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://myserver/; #在这块直接访问两个服务地址
}
}
#轮询并不是一个一个的轮询 记得取upstream的名字不要用下划线,可能会出现一些不可名状的问题。
权重
修改配置文件
upstream myserver{
server 192.168.192.3:8080 weight=10; #只需要在这里加权重
server 192.168.192.3:8081 weight=5; #加权重
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://myserver/; #在这块直接访问两个服务地址
}
}
ip_hash
upstream myserver{
ip_hash; #只需要在这里加上这句话就可以,
server 192.168.192.3:8080;
server 192.168.192.3:8081;
}
server {
listen 80;
server_name localhost;
location /{
proxy_pass http://myserver/; #在这块直接访问两个服务地址
}
}
nginx动静分离
Nginx的并发能力就得到了一个公式
并发能力=全局块中的worker_processes *event块中的woker_connections/4或者/2
动态资源代理
location /{
procy_pass 路径;
}
静态资源代理
location /{
root 静态资源路径;
index 默认访问资源;
autoindex on;#代表展示静态资源的全部内容,以链表的形式展开。
}
#添加一个数据卷映射Nginx的目录
#添加index.html
注意事项
配置location块注意 访问匹配顺序 全路径 >正则 >/
访问静态资源 alias 配置的是实际路径 root只适用于/