成都网站开发培训机构,监控视频怎么做直播网站,wordpress菜单添加,angular做的网站目录
Nginx 开始
概述
安装#xff08;非 Docker#xff09;
配置环境变量
常用命令
配置文件概述
location 路径匹配方式
配置反向代理
实现效果
准备工作
具体配置
效果演示
配置负载均衡
实现效果
准备工作
具体配置
实现效果
其他负载均衡策略
配置动…目录
Nginx 开始
概述
安装非 Docker
配置环境变量
常用命令
配置文件概述
location 路径匹配方式
配置反向代理
实现效果
准备工作
具体配置
效果演示
配置负载均衡
实现效果
准备工作
具体配置
实现效果
其他负载均衡策略
配置动静分离
概念
实现效果
准备工作
403 错误怎么办
效果演示
底层原理
原理说明
master - worker 模式的好处
worker 的数量设置成多少合适
一个请求占用多少个worker_connectionworker 连接数
假设 nginx 有 1 个 master 和 4 个 worker每个 worker 支持的最大连接数是 1024那么 nginx 的最大并发数是多少 Nginx 开始 概述
a简述
Nginx 是一个高性能的 HTTP 和反向代理服务器特点是占用内存少并发能力强有报告表明支持高达 50 000 个并发连接数. b何为正向代理
正向代理代理客户端在浏览器中配置代理服务器. 通过代理服务器进行互联网访问.
例如在中国大陆是不能直接访问到谷歌因此就需要在浏览器中配置代理服务器通过代理服务器来访问谷歌.
c何为反向代理
反向代理代理服务器. 客户端无需做任何 配置只需要将请求发送给反向代理服务器呦反向代理服务器将请求发送给真实服务器暴露代理服务器地址隐藏真实服务器 IP 地址.
例如客户端要给 8080 端口的 tomcat 发送请求可以不直接访问 tomcat出于安全考虑而是通过将请求发送给 9090 的代理服务器再由 9090 的代理服务器将请求转发给 8080 端口的 tomcat.
d安装直接通过 docker 安装记得挂载配置文件数据卷. 安装非 Docker
a官网下载nginx: download b将下载好的文件上传到终端 Ps想了一下又把文件移到了服务器的 ~/apps 目录下. c解压
tar -zxvf nginx-1.26.1.tar.gz d下载 nginx 运行环境
依次运行以下命令
yum -y install gcc gcc-c autoconf automake makeyum -y install openssl openssl-devele进入到刚解压的文件中进行基本配置输入如下命令
./configure --prefix/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module配置configure --prefix代表安装的路径--with-http_ssl_module安装ssl--with-http_stub_status_module查看nginx的客户端状态
f在解压文件的目录中可以观察到多出了一个 makefile 文件 接着输入以下命令
#编译安装nginx
make make install Ps上一步编译如果出现了错误 “make: *** No rule to make target build, needed by default. Stop”.解决如下 安装配置yum -y install make zlib-devel gcc-c libtool openssl openssl-devel重新./configure ./configure 编译make make install f进入到安装目录上面 --prefix/usr/local/nginx 配置的就是安装目录
cd /usr/local/nginx/ g接着进入sbin目录下执行以下命令启动 nginx h最后直接输入服务器的 ip 就可以访问了只输入服务器 ip默认走 80 端口 Ps如果访问不了就去关闭一下防火墙吧~ 配置环境变量
acd /etc 进入到 etc 目录中
b找到 profile 文件 c添加如下信息
# Nginx 的安装目录
export NGINX_HOME/usr/local/nginx
# Nginx 环境变量配置
export PATH${NGINX_HOME}/bin:${NGINX_HOME}/sbin:$PATH
d刷新环境变量
source /etc/profile
e验证切换到任意目录下输入如下命令 常用命令 Note使用的前提是必须先进入到 /usr/local/nginx/sbin 目录中配置了环境变量可以忽略之后都演示配置后的 a查看 nginx 版本
nginx -v
b停止 nginx
nginx -s stop
c启动 nginx
nginx
d重新加载 nginx
nginx -s reload
将来我们会经常修改 nginx 的配置文件每次修改后就需要重新加载 ngxin 才能生效. 配置文件概述
anginx 配置文件位置
/usr/local/nginx/conf/nginx.conf bnginx 默认配置文件内容去掉注释
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location /50x.html {root html;}}}
cnginx 配置文件三部分组成 1全局块从配置文件开始到 events 块之前的内容. 主要用来设置影响 nginx 服务器整体运行的配置指令例如 worker_processes 1; worker_processes 值越大可以支持的并发处理量越大. 如下
worker_processes 1; # 服务器并发处理能力值越大并发能力越强受自身配置限制2events 块主要用来影响 nginx 服务器与用户的网络连接例如 worker_connections 1024; 表示支持的最大连接数. 如下
events {worker_connections 1024; #最大连接数1024个需灵活配置
} 3http 块nginx 中配置最频繁的地方http 块中包括 http 全局块、server 块.
http 全局块如下
http {include mime.types; # 文件扩展名与文件类型映射表default_type application/octet-stream; # 访问到未定义的扩展名的时候就默认为下载该文件sendfile on; # 日志自定义keepalive_timeout 65; # 超时时间
http 块中的 server 块如下 server {listen 80; # 目前监听的端口号server_name localhost; # 主机名称
server 块中又包括 server 全局块 和 location 块.
全局 server 块如下 server {listen 80; # 目前监听的端口号server_name localhost; # 主机名称
location 块如下 location / { #表示默认首页root html;index index.html index.htm;
root 指定了服务器的根目录上述 root html 表示 nginx 安装目录的路径下的 html 目录以 nginx 安装目录为相对路径. location 路径匹配方式
语法如下
location { | ~ | ~* | ^~ } uri {# ...
}
a表示不含正则表达式的 uri 要求请求字符串和 uri 严格匹配如果匹配成功就停止继续向后匹配并立即处理该请求.
例如如下
location /exact-match {# 配置处理精确匹配的请求proxy_pass http://backend_server;
}只有请求 URI 完全是 /exact-match 时才会匹配这个 location 块其他类似的请求如 /exact-match/ 或 /exact-match123 不会匹配。
b~用于表示 uri 包含正则表达式并且区分大小写.
例如如下
location ~ \.php$ {# 配置处理所有以 .php 结尾的请求例如 /index.php 或者 /foo.phpfastcgi_pass php_backend;
}c~*用于表示 uri 包含正则表达式并且不区分大小写.
d^~不含正则表达式的 uri要求 Nginx 服务器扎到表示 uri 和请求字符串匹配度最高的 location 后立即使用 location 处理请求而不再使用 location 块中的正则 uri 和请求字符串做匹配.
location ^~ /static/ {# 配置处理所有以 /static/ 开头的请求root /data/static;
}例如 static/css/styles.css 或者 /static/js/app.js 配置反向代理
实现效果
打开浏览器在浏览器地址栏中
输入 env-base:9000/aaa 跳转到 env-base:8080tomcat8080 的页面
输入 env-base:9000/bbb 跳转到 env-base:8081tomcat8081 的页面 Psenv-base 为配置 nginx 的服务器 ip 准备工作
a准备两个 tomcat 服务器一个 8080一个 8081
这里使用 docker直接运行以下命令
# 1.先简单启动
docker run --name tomcat -p 8080:8080 -d tomcat:8.0# 2.在宿主机中创建将来容器的映射文件
mkdir -p ~/test/tomcat8080
mkdir -p ~/test/tomcat8081# 3.将容器中的文件拷贝到宿主机
docker cp tomcat:/usr/local/tomcat/webapps/ ~/test/tomcat8080
docker cp tomcat:/usr/local/tomcat/webapps/ ~/test/tomcat8081# 4.删除旧的容器
docker rm -f tomcat# 5.启动新容器
docker run --name tomcat8080 -p 8080:8080 \
-v ~/test/tomcat8080/webapps:/usr/local/tomcat/webapps \
-e TZAsia/Shanghai \
-d tomcat:8.0docker run --name tomcat8081 -p 8081:8080 \
-v ~/test/tomcat8081/webapps:/usr/local/tomcat/webapps \
-e TZAsia/Shanghai \
-d tomcat:8.0正常访问 b由于将来访问 env-base:8080 或者 env-base:8081 实际上都是访问 webapps 下的目录因此为了演示不同效果就在前面创建的 tomcat8080 和 tomcat8081 的 webapps 目录下创建两个不同的文件aaa、bbb和两个不同的 HTMLa.html 和 b.html
~/test/tomcat8080/webapps/aaa/a.html~/test/tomcat8081/webapps/bbb/b.html
效果如下 具体配置
编辑 nginx 配置文件进行反向代理配置 server {listen 9000;server_name env-base;location ~ /aaa/ {proxy_pass http://127.0.0.1:8080;}location ~ /bbb/ {proxy_pass http://127.0.0.1:8081;}} 使用 nginx -s reload 命令重新加载 nginx 效果演示 e上述原理 location ~ /aaa/ { proxy_pass http://127.0.0.1:8080; } 由于 ~ /aaa/ 是正则表达式表示只要路径中含有 /aaa/ 就会被代理
例如输入 env-base:9000/aaa/a.html 就会被代理成 127.0.0.1:8080/aaa/a.html可以正常访问例如输入 env-base:9000/abc/aaa/a.html 就会被代理成 http://127.0.0.1:8080/abc/aaa/a.html404 错误 配置负载均衡
实现效果
浏览器地址栏输入地址 http://env-base:9000/ccc/c.html 实现负载均衡效果平均分配到 8080 和 8081 端口中. 准备工作
准备两个 tomcat 服务器一台 8080一台 8081.在上一章配置反向代理我们已经准备好了两个 tomcat 容器路径分别为 ~/test/tomcat8080、~/test/tomcat8081在两个 tomcat 中 webapps 目录中创建名称是 ccc 文件夹在 ccc 文件夹中创建 c.html 用于测试.
tomcat8080 访问如下 tomcat8081 访问如下 具体配置 实现效果
默认按照轮询的策略分配
第一次 第二次 其他负载均衡策略
默认负载均衡的策略是轮询除此之外还有其他策略如下
aweight 权重
另外可以通过 weight 来控制需要负载均衡的权重. 权重越大访问到的概率越大.
比如将权重都配置为 1表示两者访问到的概率相同. upstream group1 {server 192.168.0.12:80 weight1;server 192.168.0.12:81 weight1;}server {listen 80;server_name localhost;default_type text/html;location /a {proxy_pass https://group1;}} 或者将 80 端口的权重改为 10让其访问到的概率大一些. upstream group1 {server 192.168.0.12:80 weight10;server 192.168.0.12:81 weight1;}server {listen 80;server_name localhost;default_type text/html;location /a {proxy_pass https://group1;}}
bip_hash
每个请求按访问 ip 的hash 结果分配这样子访客固定访问一个后端服务器可以解决session问题
举个例子
A用户固定ip第一次访问到8080 tomcat那么后面就都是访问到这台机器.
upstream myserver {ip_hash;server 127.0.0.1:8080;server 127.0.0.1:8081;
}cfair
根据后端响应时间来分配请求处理时间短的优先分配.
upstream myserver {server 127.0.0.1:8080;server 127.0.0.1:8081;fair;
}配置动静分离
概念
为了加快网站的解析速度可以把动态页面和静态页面由不同的服务器来解析加快解析速度.
实际上就是将来客户端会先访问 nginx如果要访问的是静态资源就会代理到对应放静态资源的 服务器如 html、css、js 如果是动态资源就会代理到对应放动态资源的服务器如 jsp、sevlet
另外这也是一种可以直接通过 url 访问服务器上对应的静态资源的方法如 图片、html、css.
实现效果
在浏览器中输入地址 http://env-base/image/1.png 访问到服务器上 ~/data/image/1.png 图片
在浏览器中输入地址 http://env-base/www/index.html 访问到服务器上 ~/data/www/index.html 页面.
准备工作
在服务器上的 ~/data/image/ 目录下准备一个 1.png 图片. 在服务器上的 ~/data/www/ 目录下准备一个 index.html 页面. d具体配置 重启 nginx. 1 location /www/ { root /root/data/; } 表示如果将来浏览器中输入的 uri 是 /www/ 则匹配服务器上 /root/data 目录下的 /www/ 目录中. 2) autoindex on 表示开启自动显示索引. 403 错误怎么办
a先提一嘴如果出现了 403 错误是因为 静态资源不可以访问在某个家目录下如 /root 也就是 ~/ 目录下.
可以在 nginx.conf 文件中指定用户
# user nobody
修改为
user root; # 设置为 root 用户 b也有可能是权限不足通过 chmod 755 -R 所在文件夹 即可提升权限解决问题. c如果还是不行可能是操作系统设定 SELinux这是 Linux 系统的选项为了保护服务求防止文件被随意获取的机制.
通过 getenforce 就可以查看到默认是开启的Enforcing需要改成 disabled 状态 要想要永久关闭就需要进入配置文件 /etc/sysconfig/selinux 将 SELINUXenforcing 改为SELINUXdisabled
如下 重启机器这时候因该就没问题了. 效果演示
autoindex on 的效果如下 访问到具体图片 以及 html 底层原理
原理说明
nginx 处理请求是以 master - work 的方式如下图 当 nginx 服务器接收到请求之后就会有 master 进程分发给 worker 进程这里类似于于master 给多个 worker 通知说 “我这里有资源了你们快来”然后抢到的那个 worker 进程就会来处理这个请求接着有以下情况
如果请求的是静态资源那么 worker 就直接从当前服务器上取到并返回即可.如果请求的是动态资源需要访问类似于 Tomcat 服务器去数据库中取数据那么 worker 进程就会通过配置的反向代理去 Tomcat 服务器上取资源.
master - worker 模式的好处
a可以使用 nginx -s reload 热部署.
如果有一个 worker 正在处理请求那么此时我们就不希望通过 重启 nginx 的方式来重新加载配置. 而如果有 多个worker此时只有一个 worker 正在处理请求那么就可以让其他 worker 来加载新的配置然后 master 接收到有新的请求时就只给加载了新的配置文件的 worker 进行通知即可.
b多进程隔离.
每一个 worker 是独立的进程如果其中一个 worker 出现问题其他 worker都是独立的继续进程争抢实现请求过程. 不会像一个进程的下的多个线程其中一个线程出了问题其他线程可能都会遭殃. worker 的数量设置成多少合适
a在配置文件中可以这样配置 worker 的数量.
# 设置 worker 数量
worker_process 4;
# worker 绑定 cpu (4 worker 绑定 4 个 cpu)
worker_cpu_affinity 0001 0010 0100 1000# worker 绑定 cpu (4 worker 绑定 8 个 cpu 中的 4 个)
worker_cpu_affinity 00000001 00000010 00000100 00001000 b设置成多少合适
Nginx 和 redis 类似都采用了 io 多路复用机制每个 worker 都是一个独立的进程但是每个进程只有一个主线程通过异步非阻塞的方式来处理请求.
每个 worker 的线程可以把 cpu 的性能发挥到极致所以 worker 的数量 和 服务器的 cput 数量相等最合适. 设置少了会浪费 cpu设置多了会造成 cpu 频繁上下文切换带来的损耗. 一个请求占用多少个worker_connectionworker 连接数
2 或者 4 个原因如下
2个如果访问静态资源只需要 client 给 worker 发送请求worker 返回静态资源即可.
4个如果访问动态资源例如 Java 代码也就是 Tomcat 服务器那么不止需要 client 给 worker 发送请求还需要 worker 去请求 tomcat. 这一来一回加起来就是 4 个连接. 假设 nginx 有 1 个 master 和 4 个 worker每个 worker 支持的最大连接数是 1024那么 nginx 的最大并发数是多少
a静态资源的最大并发数是worker_connections * worker_processes / 2
对应上述就是 1024 * 4 / 2
b动态资源的最大并发数是worker_connections * worker_processes / 4.
对应上述就是 1024 * 4 / 4