💝💝💝欢迎来到我的博客,很高兴能够这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容知识,也可以畅所欲言分享您的想法和见解。
img

非常期待和您一起在这个小小的网络世界里共同探索学习和成长。💝💝💝 ✨✨ 欢迎订阅专栏 ✨✨

一.简单介绍

1.介绍

Nginx(发音为”engine x“)是一款高性能轻量级开源 Web 服务器反向代理服务器,它具有以下特点和功能

  1. 高性能:Nginx设计能够处理大量并发连接而不显著增加系统负担。它采用异步事件驱动架构,可以有效处理流量的 Web 请求
  2. 负载均衡:Nginx 支持负载均衡,可以将请求分发到多个后端服务器,以提高网站性能可用性
  3. 反向代理:Nginx 可以充当反向代理,将客户请求转发到后端服务器,隐藏后端服务器的真实 IP 地址,增加安全性可扩展性
  4. 静态文件服务:Nginx 可以高效地提供静态文件(如 HTML、CSS、JavaScript图像等)的服务,减轻应用服务器的负担。
  5. SSL/TLS 支持:Nginx 支持加密通信,可以配置 SSL/TLS 来保护数据传输安全性
  6. URL 重写:Nginx 允许对 URL 进行灵活的重写转发,以实现友好的 URL 结构路由
  7. 缓存:Nginx 可以缓存静态内容动态内容提高响应速度并减轻后端服务器的负担。
  8. 访问控制:Nginx 可以实施访问控制、IP 黑名单基本身份验证安全性措施
  9. 模块化架构:Nginx 使用模块化架构,允许用户通过插件模块扩展功能

Nginx 通常被用于构建高性能的 Web 服务器环境,特别适合处理流量网站应用。它在互联网上广泛使用,并已成为许多大型网站应用关键组件之一。

2.功能

以下是 Nginx 的一些主要功能:

  1. Web 服务器: Nginx 可以作为一个快速高性能的 Web 服务器,可以直接处理和提供静态动态内容

  2. 反向代理 Nginx 可以作为反向代理服务器接收客户请求并将其转发到后端服务器,用于负载均衡、缓存、SSL 终端等。

  3. 负载均衡: Nginx 可以将来自客户端的请求分发到多个后端服务器,实现负载均衡,提高应用可扩展性性能

  4. HTTP 缓存 Nginx 可以缓存静态动态内容,减轻后端服务器的负载,提高响应速度

  5. SSL 终端 Nginx 可以处理 SSL/TLS 连接,用于终止和处理加密通信,减轻后端服务器的计算负担。

  6. 反向代理缓存 Nginx 可以作为反向代理缓存,将动态内容缓存本地,减少对后端服务器的请求,提高响应速度

  7. 动态内容处理: Nginx 可以处理 FastCGI、uWSGI、SCGI 等协议,用于处理动态内容如 PHP、Python、Ruby 等。

  8. 限流速率控制 Nginx 可以实施请求速率控制限流,以防止服务器过载。

  9. 安全性 Nginx 提供安全功能如防止恶意请求、DDoS 攻击防护等。

  10. 虚拟主机 Nginx 支持虚拟主机配置,可以在一个服务器上托管多个域名

  11. 自定义模块 Nginx 支持自定义模块开发,可以根据需求添加自定义的功能和扩展

  12. 事件驱动 Nginx 使用事件驱动的异步架构,可以处理大量并发连接,提供出色的性能

  13. 日志记录 Nginx 可以记录详细访问日志,方便监控分析

Nginx 是一个功能强大的服务器软件,适用于多种应用场景,如 Web 服务器、反向代理、负载均衡、缓存安全保护等。它在大型互联网公司企业中被广泛使用,提供了高性能稳定性。

3.安装步骤

#查看nginx在哪
whereis nginx

#yum 安装ningx
#nginx添加yum repro库中
#下载nginx
wget https://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

# 建立nginxyum仓库
rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm

#查看nginx信息
yum info nginx

#查看yum仓库中nginx版本
yum --showduplicates list nginx | expand

#安装nginx,默认安装最新稳定版本 及 nginx 1.20.2
yum install nginx

#查看版本
nginx -V

#查看日志
tail -f /var/log/nginx/error.log

#配置文件地址
/etc/nginx/nginx.conf

二.常用命令

1.启动 nginx

#查看nginx位置
whereis nginx

#nginx可用
systemctl enable nginx

#启动nginx
systemctl start nginx

#查看进程
netstat -nltp

#查看状态
systemctl status nginx

2.停止 nginx

#停止 nginx
systemctl stop nginx

3.重启 nginx

#重启 nginx
systemctl restart nginx

4.重新加载配置

#重新加载配置
systemctl reload nginx

5.设置开机启动

#设置开机启动
systemctl enable nginx

6.关闭开机启动设置

#关闭开机启动设置
systemctl disable nginx

7.检查配置是否正确

#检查配置是否正确(常用)
nginx -t

8.检查加载模块

./nginx -V

9.重新加载

#进入nginx可执行目录sbin下,输入命令,不用重启
./nginx -s reload

10.指定启动

#启动nginx,并挂在配置文件目录宿主机
docker run -d --name deepexi-belle-damo-nginx --privileged=true --dns 114.114.114.114 -p 80:80  
-v /etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf 
 --restart=always deploy.deepexi.com/datasense-test/deepexi-belle-damo-nginx:v1.0.0

三.常见配置

Nginx 的主配置文件是 nginx.conf这个配置文件一共由三部分组成,分别为全局块、events 块和 http 块。在 http 块中,又包含 http 全局块、多个 server 块。每个 server 块中,可以包含 server 全局块和多个 location 块。在同一配置块中嵌套的配置块,各个之间存在次序关系

1.配置目录

#从 / 根目录查找文件名为 nginx.conf文件
find / -name nginx.conf

#从/etc 目录查找文件名为 nginx.conf 的文件
find /etc -name nginx.conf

#检查配置文件
nginx -t

#目录
/etc/nginx

2.执行目录

/usr/sbin/nginx

3.站点目录

/usr/share/nginx/html

4.我的 nginx 配置

server {
        listen       80;
				server_name  qinyingjie.top;
        root         /usr/share/nginx/html;
        include /etc/nginx/default.d/*.conf;
        location / {
	       	root   html;
    	  	index  index.html index.htm;
	       	proxy_pass http://localhost:8080/;
       	}
				location ~ .*.(gif|jpg|jpeg|png|jfif)$ {
	         root  /kwan/;
           autoindex    on ;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
}

5.服务器

43.139.90.182 qinyingjie.top

6.配置文件的优先级

启动时可以指定配置文件

首先,说明结论:同一目录下存在多个配置文件时,Nginx是按照文件的名称先后顺序依次读取的!

#验证配置文件
/usr/local/nginx/sbin/nginx -tc /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf

#指定配置文件启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

#指定配置文件重启
/usr/local/nginx/sbin/nginx -s reload -c /usr/local/nginx/conf/nginx.conf

#说明:-c 参数指定运行nginx系统自定义配置文件。
#若加:使用自定义配置文件。
#若不加:使用默认的nginx.conf(一般位于/usr/local/conf/nginx.conf,具体以实际情况为准)
nginx -c /usr/local/nginx/conf/nginx.conf

7.websocket

要在 Nginx 中开通 WebSocket,需要在 Nginx 配置文件中添加相应的配置。

以下是一个简单的 Nginx 配置文件示例,其中开通了 WebSocket:

http {
    # ...

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }

    server {
        listen 80;
        server_name example.com;

        location /ws/ {
            proxy_pass http://backend_server/ws/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

这个配置文件中,map 指令用于将 HTTP 请求头中UpgradeConnection 字段映射到 Nginx 的变量中,proxy_pass 指令用于将请求转发到后端服务器,proxy_http_version 指令用于指定使用 HTTP 1.1 协议进行转发,proxy_set_header 指令用于设置请求头字段

具体来说,proxy_set_header Upgrade $http_upgrade; 指令用于将 HTTP 请求头中Upgrade 字段设置为 $http_upgrade 变量的值,proxy_set_header Connection $connection_upgrade; 指令用于将 HTTP 请求头中Connection 字段设置为 $connection_upgrade 变量的值。

这样,当客户端发送一个 WebSocket 请求时,Nginx 就会将其转发到后端服务器,并将请求头中UpgradeConnection 字段设置为 WebSocket 需要的值,从而成功开通了 WebSocket。

四.牛逼特性

1.域名配置

upstream qinyingjie.top {
  server localhost:8080;
}
location / {
  proxy_pass https://www.qinyingjie.top;
}
server_name  qinyingjie.top;

2.图片展示

location ~ .*.(gif|jpg|jpeg|png|jfif)$ {
  proxy_pass https://www.qinyingjie.top;
  root /kwan/;
  autoindex on;
}

3.负载均衡

1.轮训

upstream open-api-test-category{
    server 10.250.16.111:8195;
    server 10.250.16.111:8196;
}

location / {
    proxy_pass http://open-api-test-category/;
}

2.权重

upstream open-api-test-category{
    server 10.250.16.111:8195 weight=1;
    server 10.250.16.111:8196 weight=3;
}

location / {
    proxy_pass http://open-api-test-category/;
}

3.hash

upstream open-api-test-category{
    server 10.250.16.111:8195;
    server 10.250.16.111:8196;
    ip_hash;
}

location / {
    proxy_pass http://open-api-test-category/;
}

4.动静分离

location ~ .*.(gif|jpg|jpeg|png|jfif)$ {
    root   /kwan/ ;
    autoindex    on ;
}

5.正向代理

6.反向代理

location / {
    root   html;
    index  index.html index.htm;
    proxy_pass http://localhost:8080/;
}

7.root 和 alias 区别

基本区别alias 指定的目录是准确的,root 是指定目录的上级目录,并且该上级目录要含有 location 指定名称的同名目录。另外,根据前文所述,使用 alias 标签的目录块中不能使用 rewritebreak

在 nginx 配置中的良好习惯是:

#直观理解如下形式:
location /dev/{
	alias /web/dev/doc/; #这个查找文件路径直接是/web/dev/doc/
}

location /dev/{
	root /web/dev/doc/; #这个查找文件的路径应该是/web/dev/doc/dev
}
# 这里使用root配置 如果访问 192.168.2.3/pak/a.html对应路径为:/usr/local/pak/a.html
# 通过root配置则location配置的/pak/一定是要在root对应的/usr/local/目录下要有的目录

8.proxy_pass

结论:

1.proxy_pass 末尾斜杠

location  /api/ {
    proxy_pass http://127.0.0.1:8000/;
}

请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/test

2.proxy_pass 末尾斜杠

location  /api/ {
    proxy_pass http://127.0.0.1:8000;
}

请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/api/test

3.proxy_pass 包含路径,且末尾有斜杠

location  /api/ {
    proxy_pass http://127.0.0.1:8000/user/;
}

请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/user/test

4.proxy_pass 包含路径,末尾无斜杠

location  /api/ {
    proxy_pass http://127.0.0.1:8000/user;
}

请求地址:http://localhost/api/test
转发地址:http://127.0.0.1:8000/usertest

9.限流功能

nginx 提供了两种限流方式

限制请求速率:nginx 的 ngx_http_limit_req_module 模块提供限制请求处理速率的能力,使用了漏桶算法(leaky bucket algorithm)。我们可以想像有一只上面进水、下面匀速出水的桶,如果桶里面有水,那刚进去的水就要存在桶里等下面的水流完之后才会流出,如果进水的速度大于水流出的速度,桶里的水就会满,这时水就不会进到桶里,而是直接从桶的上面溢出。对应到处理网络请求,水代表从客户端来的请求,而桶代表一个队列,请求在该队列中依据先进先出(FIFO)算法等待被处理。漏的水代表请求离开缓冲区并被服务器处理,溢出代表了请求被丢弃并且永不被服务。

漏桶算法

image-20230106162431269

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;

server {
    location ~* .(html)$ {
        limit_req zone=mylimit;
    }
}

limit_req_zone 用于设置限流共享内存区域的参数,格式为:limit_req_zone key zone rate

limit_req_zone 只是设置限流参数,如果要生效的话,必须和 limit_req 配合使用。limit_req格式为:limit_req zone=name [burst=number] [nodelay]。
上面的例子简单指定了 zone=mylimit,表示使用 mylimit 这个区域的配置,在请求 html 文件时进行限流。我们可以理解为这个桶目前没有任何储存水滴的能力,到达的所有不能立即漏出的请求都会被拒绝。如果我 1 秒内发送了 10 次请求,其中前 500 毫秒 1 次,后 500 毫秒 9 次,那么只有前 500 毫秒的请求和后 500 毫秒的第一次请求会响应,其余请求都会被拒绝

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;

server {
    location ~* .(html)$ {
        limit_req zone=mylimit burst=5;
    }
}

burst 表示在超过设定的访问速率后能额外处理的请求数。当 rate=2r/s 时,表示每 500ms 可以处理一个请求。burst=5 时,如果同时有 10 个请求到达,nginx 会处理第 1 个请求,剩余 9 个请求中,会有 5 个被放入队列,剩余的 4 个请求会直接被拒绝然后每隔 500ms队列获取一个请求进行处理,此时如果后面继续有请求进来,如果队列中的请求数目超过了 5,会被拒绝,不足 5 的时候添加队列中进行等待我们可以理解为现在的桶可以存 5 滴水:

limit_req_zone $binary_remote_addr zone=mylimit:10m rate=2r/s;

server {
    location ~* .(html)$ {
        limit_req zone=mylimit burst=5 nodelay;
    }
}

nodelay 表示不延迟。设置 nodelay 后,第一个到达的请求和队列中的请求会立即进行处理,不会出现等待的请求。需要注意的是,虽然队列中的 5 个请求立即被处理了,但是队列中的位置依旧是按照 500ms速度依次被释放的。后面的 4 个请求依旧是被拒绝的,长期来看并不会提高吞吐量的上限,长期吞吐量的上限是由设置的 rate 决定的。

nginx 限流使用了令牌桶算法:

image-20230105172231302

漏桶算法和令牌桶算法都是用于实现流量控制和限流的算法,但它们的原理和适用场景略有不同

漏桶算法: 漏桶算法模拟了一个漏桶,请求被认为是水滴,以固定的速率流出(漏出)系统。如果流入的请求速率超过了漏桶的容量,多余的请求将会被丢弃或者等待下一个时间段。漏桶算法适用于平滑流量,防止系统被大量突发流量压垮。但是,对于短时间内的突发流量,漏桶算法并不是特别有效,因为它无法快速处理瞬时大量的请求,而只能以固定的速率处理。

令牌桶算法令牌桶算法也是一种流量控制算法,它基于一个令牌桶的概念令牌以一定的速率被添加到桶中,每个请求在处理之前需要获取一个令牌,如果没有可用的令牌,则请求将被暂时阻塞或丢弃。令牌桶算法可以适应瞬时的突发流量,因为当桶中积累足够多的令牌时,可以快速处理突发请求,而不会受限于固定的速率。这使得令牌桶算法更适合处理突发流量的情况。

所以,总的来说,漏桶算法更适合平滑流量,而令牌桶算法更适合应对突发流量。在实际应用中,可以根据需求选择合适的算法来实现流量控制和限流。

五.docker 安装 nginx

1.安装步骤

#查找nginx
docker search nginx

#下载镜像
docker pull nginx:latest

#查看本地镜像
docker images

#运行容器
docker run --name nginx-test -p 8080:80 -d nginx
参数说明--name nginx-test:容器名称-p 8080:80: 端口进行映射,将本地 8080 端口映射容器内部80 端口-d nginx: 设置容器在在后台一直运行。

#访问是否成功
127.0.01:8080

2.启动命令

#启动nginx,并挂在配置文件目录宿主机
docker run -d --name deepexi-belle-damo-nginx 
--privileged=true 
--dns 114.114.114.114 
-p 80:80  
-v /etc/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf 
--restart=always deploy.deepexi.com/datasense-test/deepexi-belle-damo-nginx:v1.0.0

六.配置 https

1.上传证书

scp  /Users/qinyingjie/Downloads/www.qinyingjie.top_nginx/www.qinyingjie.top_bundle.crt root@43.139.90.182:/etc/nginx

scp  /Users/qinyingjie/Downloads/www.qinyingjie.top_nginx/www.qinyingjie.top.key root@43.139.90.182:/etc/nginx

2.http 的配置

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

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 {
    worker_connections 1024;
}

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 {
        listen       80;
				server_name  qinyingjie.top;
        root         /usr/share/nginx/html;
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
        location / {
	       root   html;
    	       index  index.html index.htm;
	       		 proxy_pass http://127.0.0.1:8080/;
       	}
	location ~ .*.(gif|jpg|jpeg|png|jfif|webp)$ {
	         root  /kwan/;
                 autoindex    on ;
        }
        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

# Settings for a TLS enabled server.
#
#    server {
#        listen       443 ssl http2 default_server;
#        listen       [::]:443 ssl http2 default_server;
#        server_name  _;
#        root         /usr/share/nginx/html;
#
#        ssl_certificate "/etc/pki/nginx/server.crt";
#        ssl_certificate_key "/etc/pki/nginx/private/server.key";
#        ssl_session_cache shared:SSL:1m;
#        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM;
#        ssl_prefer_server_ciphers on;
#
#        # 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 {
#        }
#    }

}

3.证书文件名

www.qinyingjie.top_bundle.crt
www.qinyingjie.top.key

4.https 的配置

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

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 {
    worker_connections 1024;
}

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 {
       listen 80;
       #请填写绑定证书的域名
       server_name www.qinyingjie.top;
       #把http的域名请求转成https
       return 301 https://$host$request_uri;
    }
    server {
     #SSL 默认访问端口号为 443
     listen 443 ssl;
     #请填写绑定证书的域名
     server_name www.qinyingjie.top;
     #请填写证书文件的相对路径绝对路径
     ssl_certificate  www.qinyingjie.top_bundle.crt;
     #请填写私钥文件的相对路径或绝对路径
     ssl_certificate_key www.qinyingjie.top.key;
     ssl_session_timeout 5m;
     #请按照以下套件配置,配置加密套件写法遵循 openssl 标准。
     ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
     #请按照以下协议配置
     ssl_protocols TLSv1.2 TLSv1.3;
     ssl_prefer_server_ciphers on;
     location / {
       #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
       #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
       root html;
       index index.html index.htm;
        proxy_pass http://127.0.0.1:8080/;
     }
     location ~ .*.(gif|jpg|jpeg|png|jfif|webp)$ {
       root  /kwan/;
       autoindex    on ;
     }
    }

}

5.验证

#检查配置是否正确(常用)
nginx -t

6.加载配置

nginx -s reload

7.查看日志

#全局查看
cat  /var/log/nginx/error.log

#尾部查看
tail -f  /var/log/nginx/error.log

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

原文地址:https://blog.csdn.net/qyj19920704/article/details/134259159

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50332.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注