一、docker安装启动
1.拉取镜像:
docker pull nginx
2.创建挂载目录
mkdir -vp /mydata/nginx
#进入nginx目录
创建:
mkdir -vp logs html conf/conf.d
给这些文件权限:
chmod -R 777 nginx
启动:
docker run -d --name nginx -p 8081:80 nginx#我的80端口被占用了所以外暴露端口改为8081
3.拷贝容器里面的nginx配置文件
#将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /mydata/nginx/
#将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /mydata/nginx/conf
#将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /mydata/nginx
#将容器中的log下的文件复制到宿主机
docker cp nginx:/var/log/nginx /mydata/nginx/logs#后面的路径要换成自己刚刚创建的nginx的路径
我们需要的配置文件已经全部准备好了,原先启动的nginx容器,没有进行挂载,可以删除了!
docker stop nginx
docker rm nginx
使用docker ps -a查看docker的进程
4.重新运行nginx容器,并进行数据挂载:
docker run --privileged=true -e TZ="Asia/Shanghai" -it -d --name nginx -p 8081:80 -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/nginx.conf:/etc/nginx/nginx.conf -v /mydata/nginx/conf/conf.d/default.conf:/etc/nginx/conf.d/default.conf -v /mydata/nginx/logs:/var/log/nginx nginx
二、Nginx的作用
1.作为 web 服务器、动静分离
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php 等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发, 性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高 达 50,000 个并发连接数。
2.反向代理
反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问。
我们只 需要将请求发送到反向代理服务器(nginx),由反向代理服务器去选择目标服务器获取数据后,在返 回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器 地址,隐藏了真实服务器 IP 地址。反向代理的主要作用是隐藏后端真实服务器的细节,提供负载均衡、缓存、SSL 加密等功能,同时让客户端无感知地与代理服务器通信,而不需要知道真实服务器的存在。这使得系统具备更好的可维护性、安全性和性能。
3.正向代理
nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
简单一点:通过代理服务器来访问服务器的过程 就叫 正向代理。
需要在客户端配置代理服务器进行指定网站访问
4.负载均衡
"将一个后端项目部署成多个实例,在 Nginx 中使用散列(hash)和轮询等负载均衡算法,将来自客户端的请求分散到不同的服务器上。负载均衡是一种技术,通过将请求分发到多个后端服务器,实现服务器负载的平衡,以提高性能和可靠性。Nginx,作为一种反向代理服务器,可以使用不同的负载均衡算法,例如散列算法将特定的请求路由到特定的服务器,轮询算法按顺序将请求发送到后端服务器。通过这种方式,系统可以更有效地处理请求,避免单一服务器过载,从而提供更好的用户体验。"
三、Nginx的配置文件
所在位置:因为我们进行了数据挂载,所以可以直接查看我们拷贝出来的:/mydata/nginx/nginx.conf
user nginx;#指定 Nginx 进程运行的用户。在这里,Nginx 进程将以 nginx 用户的身份运行。
worker_processes auto;#设置 Nginx 启动的工作进程数量,这里使用 auto 表示根据可用 CPU 核心#数量自动选择进程数量。
error_log /var/log/nginx/error.log notice;#设置错误日志的路径和级别为 notice,意味着只记录#通知级别及以上的错误信息。
pid /var/run/nginx.pid;#指定保存 Nginx 进程 ID 的文件路径。
events {#定义与处理连接和事件相关的配置。
worker_connections 1024;#设置每个工作进程的最大连接数。
}
http {#定义 HTTP 服务的配置。
include /etc/nginx/mime.types;#包含 MIME 类型的配置文件。
default_type application/octet-stream;# 设置默认的 MIME 类型。
#定义日志格式,用于记录访问日志。
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;#: 启用 sendfile,可加速文件传输。
#tcp_nopush on;
keepalive_timeout 65;#设置 keep-alive 连接超时时间。
#gzip on;
include /etc/nginx/conf.d/*.conf;#加载位于 /etc/nginx/conf.d/ 目录下的所有以 .conf 后缀结尾的配置文件。这个特性让你能够将 Nginx 配置文件拆分成多个小的模块化文件,更便于管理和维护。
}
主要可以分为三块:
1.全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
2.events块(事件块)
events 块涉及的指令**主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否 允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。**
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
3.HTTP 块:
HTTP 块包含了配置 Nginx 作为 HTTP 服务器的设置。它通常是最详细的部分,包括了 HTTP 服务相关的配置,如 MIME 类型、日志格式、虚拟主机、负载均衡等。它又可以大致分为两部分:
http全局块:http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
server块:在 HTTP 块内,你可以包含多个 server 块,每个 server 块用于配置一个虚拟主机。每个 server 块定义了一组监听的端口和域名,以及与该虚拟主机相关的其他配置项。在 server 块内,你可以设置虚拟主机的根目录、日志、SSL 配置等。
实现反向代理的一个常见方法是在 Nginx 的配置文件中配置 server 块
一个server块示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
}
}
在这个示例中:
listen 80; 指定监听的端口。
server_name example.com; 指定虚拟主机的域名。
location / { ... } 定义了针对根 URL 路径的配置。
proxy_pass http://backend_server; 将请求转发给名为 backend_server 的后端服务器。
你需要将 backend_server 替换为实际的后端服务器的地址。这样配置后,当客户端请求 http://example.com 时,Nginx 会将请求转发给后端服务器,并将后端服务器的响应返回给客户端。
所以,配置 server 块是实现反向代理的关键步骤之一。在 server 块内,你还可以添加其他的配置项,如缓存、日志、负载均衡等,以根据需求对反向代理的行为进行调整。
四、Nginx实现自定义域名以及反向代理
最终要实现的结果:通过访问www.syc.com访问到我的云服务器的Elasticsearch的首页
首先我们明白一个概念:
我们发送请求是这样的:比如我们要访问:localhost:8080,浏览器会先访问电脑的这个文件夹下:C:\Windows\System32\drivers\etc\hosts下的内容,看是否有被缓存:比如localhost就被缓存为:
# localhost name resolution is handled within DNS itself.
# 127.0.0.1 localhost
# ::1 localhost如果没有找到,就会再去公网的DNS上去寻找域名对应的ip地址,所以,我们可以在这个文件里面自定义一个域名:syc:他的地址定义为我们的虚拟机上的地址,然后我们访问nginx监听的端口,
开干,因为这个文件时无法打开的
所以,我们将hosts文件复制到桌面,将他重命名为hosts.txt,在这文件最后添加:
127.0.0.1 syc.com
接下来修改nginx的配置文件:
在http块添加了如下内容:
配置上游服务器,ES是给这个服务器取的名字
upstream ES{
//这里我直接让nginx代理到我服务器的ES首页
server 121.37.31.79:9200;
}
server {
listen 8888;
server_name syc.com;//监听到syc.com的所有8888请求
location / {
proxy_pass http://ES;//代理给这个地址 ,这个名字就是我们在总配置文件中配置的,如上
}
}
重启nginx
docker restart nginx
访问 syc.com:8888,但是发现无法访问,这是为什么呢?
原因是我们启动容器的时候,只映射了80端口到外面,所以我们访问的8888端口是这个服务器的8888端口,而不是这个nginx容器内的8888,于是,需要停掉nginx 删除,重新启动,并且添加一个参数:
-p 8888:8888
这就是一个最简单的反向代理了!
五、动静分离
原理:指定规则:将请求为/static/**的都给ngin进行处理
1.进入ngin的html文件夹,新建static文件夹,存入我们的静态资源
2.配置nginx:
在我们项目的配置文件中配置:
server {
listen 8888;
server_name syc.com;
location /static/ { #当请求的 URL 包含 /static/ 路径时,Nginx 将从 #/usr/share/nginx/html 目录中寻找静态文件并返回给客户端
root /usr/share/nginx/html;
}
location / {
proxy_set_header Host $host;#这会将客户端的 Host 头部信息传递到后端服务器(代理目标#服务器)。
proxy pass http://ES;
#error page404
}
}
六、负载均衡
upstream ES{//在这里配置上游服务器的时候,多配置几个,
server 121.37.31.79:9200;
}
如
upstream ES{
server 121.37.31.79:9300;server 121.37.31.79:9200;
server 121.37.31.79:9400;
}这样就可以了,默认使用轮训算法,
自定义分配算法:
#ip哈希,
upstream myapp {
ip_hash;server 121.37.31.79:9300;
server 121.37.31.79:9200;
server 121.37.31.79:9400;
}#最少连接;
upstream myapp {
least_conn;server 121.37.31.79:9300;
server 121.37.31.79:9200;
server 121.37.31.79:9400;
}#加权轮训
upstream myapp {
least_conn;server 121.37.31.79:9300 weight=3;
server 121.37.31.79:9200 weight=2;
server 121.37.31.79:9400;
}等...
七、Nginx原理
1、nginx的线程模型
Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。
进程模型:
2. master-workers 的机制的好处
总之,Nginx 的 master-workers 架构通过充分利用多核处理器和并发处理机制,提供了高性能、稳定性和灵活性,使其成为一个出色的 Web 服务器和反向代理服务器。
高并发处理能力: master-workers 架构允许多个工作进程并行处理客户端请求,从而提高了 Nginx 服务器的并发处理能力。每个工作进程都可以独立地处理多个请求,从而在高负载情况下实现高并发。
隔离和稳定性: 每个工作进程运行在独立的内存空间中,一个工作进程的崩溃不会影响其他工作进程的运行。这种隔离性提高了服务器的稳定性,避免一个进程的错误影响到整个服务器。
优雅重启: 在配置更新或服务器升级时,Nginx 可以实现无缝的优雅重启。主进程会启动新的工作进程,然后逐步停止旧的工作进程,从而避免服务中断。
事件驱动模型: Nginx 使用事件驱动的方式处理连接,例如使用 epoll 或 kqueue。这种模型允许 Nginx 在单个线程中同时处理多个连接,从而有效地利用系统资源。
资源占用: 每个工作进程都是独立的,它们之间共享监听的套接字,但是不会共享其他资源,从而避免了资源竞争。这有助于减少服务器的资源占用。
灵活性: master-workers 架构允许根据系统资源和负载情况,通过调整工作进程的数量来优化性能。你可以根据服务器硬件和预期的负载情况来配置工作进程的数量。
3. 设置多少个 worker
Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,但每个进 程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话 下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
worker 数和服务器的 cpu 数相等是最为适宜
4. 连接数 worker_connection
第一个:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的 最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4。
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接 数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于 HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访 问最大并发数是: worker_connections * worker_processes /2,而如果是 HTTP 作 为反向代 理来说,最大并发数量应该是 worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服 务的连接,会占用两个连接。