本篇参考于尚硅谷
https://www.bilibili.com/vide...
本次安装全程使用docker
一: Nginx简介
1.1 nginx概述
Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。
1.2 nginx作为web服务器
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。
参考 https://lnmp.org/nginx.html
1.3 正向代理
如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
1.4 反向代理
其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
1.5 负载均衡
当客户端请求数据发送到服务器,服务器处理完请求后将结果返回给客户端。这种单一模式在早期是适用的,当访问和数据量增加以及业务复杂度增加时候就不再适用了,可以通过提升服务器配置来解决,但是服务器提升是有限制,顶级物理配置不能解决问题,这样就只能在纵向解决问题。增加服务器数量,把请求分发到各个服务器将负载发到不同的服务器,这就是负载均衡。
1.6 动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
二: Nginx安装
docker安装nginx参照:
三: Nginx常用命令和配置文件
3.1 nginx 常用的命令
在容器中
帮助命令
nginx -h
查看版本信息
nginx -v
关闭命令
nginx -s stop
重新加载命令 (可做开启命令)
nginx -s reload
设置开机自动启动
chkconfig nginx on
3.2 nginx.conf 配置文件
etc/nginx/conf.d/default.conf #默认资源配置文件
etc/nginx/nginx.conf #默认配置
/usr/share/nginx/html #初始页面 资源位置
/var/log/nginx #日志文件地址
#全局块
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
# events块 影响nginx服务器与用户的网络连接
events {
worker_connections 1024; #支持连接的最大数
}
#http全局块
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 /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
# server 块
#每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
#而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
四: Nginx配置实例-反向代理
4.1 配置实例1
创建一个tomcat容器开放 9001端口
在 nginx.conf文件 中添加serer块 就可以访问tomcat了
server {
listen 80;
server_name ip地址;
location / {
proxy_pass http://ip地址:9001;
}
}
4.2 配置实例2
使用nginx 反向代理,根据访问的路径跳转到不同端口的服务中
访问 ip地址:8080/edu 跳转到ip地址:9001:edu
访问 ip地址:8080/vod 跳转到ip地址:9002:vod
在两个tomcat容器中的webapps文件夹中分别添加edu文件夹和vod文件夹
修改配置文件 server模块
server {
listen 80;
server_name IP地址;
location ~ /edu/ {
proxy_pass http://IP地址:9001;
}
location ~ /vod/ {
proxy_pass http://IP地址:9002;
}
}
location指令说明:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
五: nginx 配置实例-负载均衡
5.1 修改nginx.conf文件的server块
可以参考 nginxa安装
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 39.108.79.168;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://pic;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
upstream pic{
server 39.108.79.168:9001 weight=5;
server 39.108.79.168:9002 weight=5;
}
5.2 nginx 分配服务器策略
第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down 掉,能自动剔除。
第二种weight
weight 代表权重默认为1,权重越高被分配的客户端越多
第三种ip_hash
每个请求按访问ip 的hash 结果分配,这样每个访客固定访问一个后端服务器
第四种fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
六: nginx 原理与优化参数配置
master-workers的机制的好处
首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
需要设置多少个worker
Nginx 同redis 类似都采用了 io 多路复用机制,每个worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
设置worker 数量
worker_processes 4
work 绑定cpu(4 work 绑定4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
work 绑定cpu (4 work 绑定8cpu 中的4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000
连接数worker_connection
这个值是表示每个worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源来 说 , 能 够 支 持 的 最大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
七: nginx 搭建集群 主从模式
此处可参考
https://m.jb51.net/article/17...
https://www.cnblogs.com/jinji...
配置好的镜像已经发到阿里云
docker pull registry.cn-shanghai.aliyuncs.com/rem/nginx_keeplived:latest
创建两个容器
docker run -tid --privileged --name nginx_master --restart=always -p 6001:80 rem/nginx_keeplived /usr/sbin/init
docker run -tid --privileged --name nginx_slave --restart=always -p 6002:80 rem/nginx_keeplived /usr/sbin/init
要是容器里面nginx没有启动 可以命令启动 也可以重载启动
systemctl start nginx.service
nginx -s reload
设置开机启动
chkconfig nginx on
查看启动
查看keepalived状态
修改里面的资源文件后访问
宿主机 外部测试
断开master容器后
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。