Nginx

一、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 服务器和反向代理服务器。

  1. 高并发处理能力: master-workers 架构允许多个工作进程并行处理客户端请求,从而提高了 Nginx 服务器的并发处理能力。每个工作进程都可以独立地处理多个请求,从而在高负载情况下实现高并发。

  2. 隔离和稳定性: 每个工作进程运行在独立的内存空间中,一个工作进程的崩溃不会影响其他工作进程的运行。这种隔离性提高了服务器的稳定性,避免一个进程的错误影响到整个服务器。

  3. 优雅重启: 在配置更新或服务器升级时,Nginx 可以实现无缝的优雅重启。主进程会启动新的工作进程,然后逐步停止旧的工作进程,从而避免服务中断。

  4. 事件驱动模型: Nginx 使用事件驱动的方式处理连接,例如使用 epoll 或 kqueue。这种模型允许 Nginx 在单个线程中同时处理多个连接,从而有效地利用系统资源。

  5. 资源占用: 每个工作进程都是独立的,它们之间共享监听的套接字,但是不会共享其他资源,从而避免了资源竞争。这有助于减少服务器的资源占用。

  6. 灵活性: 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。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服 务的连接,会占用两个连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值