1、Nginx基础学习笔记

一、Nginx的安装:

相关参考

 

二、VSCode的安装:

VSCode使用Remote SSH远程连接Linux服务器,开发者可以根据自己的需求选择合适的插件来增强编辑器的功能,如语法高亮、代码片段、调试工具等

相关参考

 

三、Nginx的基本介绍:

Nginx是高性能的HTTP和反向代理的服务器,特点是占用内存少,并发能力强,能经受高负载的考验

1、Nginx的文件位置:

/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志

2、Nginx的基本命令:

#启动
nginx

#使用systemctl启动
systemctl start nginx

#配置开机启动
systemctl enable nginx

#查看nginx是否启动成功
curl 127.0.0.1:80

#立即停止
nginx -s stop

#使用systemctl停止
systemctl stop nginx

#执行完当前请求再停止
nginx -s quit

#重新加载配置文件,相当于restart
nginx -s reload

#使用systemctl重新加载
systemctl reload nginx

#将日志写入一个新的文件
nginx -s reopen

#测试配置文件
nginx -t

#查看日志
journalctl -xe

3、Nginx的日志说明:

日志位于/var/log/nginx/

#查看access日志
tail -f access.log

#查看error日志
tail -f error.log

4、Nginx的配置说明:

配置文件位于/etc/nginx/nginx.conf , 配置文件中此命令会引用/etc/nginx/conf.d目录下所有的.conf文件,这样可以保持主配置文件的简洁,同时配个多个.conf文件方便区分,增加可读性。

相关详解参考

(1)、配置文件的基础结构:

备注:

说明:

全局块

配置影响 nginx 全局的指令。一般有运行 nginx 服务器的用户组、nginx 进程 pid 存放路径、日志存放路径、配置文件引入、允许生成 worker process 数等;

Events块

配置影响 nginx 服务器或与用户的网络连接。有每个进程的最大连接数、选取哪种事件驱动模型处理连接请求、是否允许同时接受多个网路连接、开启多个网络连接序列化等;

Http块

可以嵌套多个 server、配置代理、缓存、日志定义等绝大多数功能和第三方模块的配置。如:文件引入、mime-type 定义、日志自定义、是否使用 sendfile 传输文件、连接超时时间、单连接请求数等;

Server块

配置虚拟主机的相关参数,一个 http 中可以有多个server;

Location块

配置请求的路由,以及各种页面的处理情况;

(2)、nginx.conf 文件详解:

#定义Nginx运行的用户和用户组
#user  nobody;

#开启的线程数(默认为1),一般跟逻辑CPU核数一致
worker_processes  1;

#制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug | info | notice | warn | error | crit | alert | emerg
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

 #指定nginx进程运行文件存放地址
#pid        logs/nginx.pid;


events {
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on

    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off

    use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport

    #单个进程最大连接数(最大连接数=连接数*进程数)
    #根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。
    worker_connections  1024;

    #keepalive超时时间。
    keepalive_timeout 60;
}


http {
    #文件扩展名与文件类型映射表
    include       mime.types;

    #默认文件类型
    default_type  application/octet-stream;

    #access_log off; #取消服务日志
  
   #下面代码为日志格式的设定,main为日志格式的名称,可自行设置,后面引用
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #引用日志main
    #access_log  logs/access.log  main;

    #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。
    #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。
    sendfile        on;

    # 当使用sendfile 函数,tcp_nopush 才起作用,是tcp协议栈中的知识点
    # 当tcp_nopush = on 时,会调用tcp_cork 方法,是默认的,就是收到的数据报不会立即发送出去,而是等到数据报最大时,一次性传输出去,有利于解决网络堵塞。 
    #tcp_nopush     on;

    # 客户端连接超时时间
    # = 0 : 表示禁用长连接。
    # = x :表示长连接timeout
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #HttpGZip模块配置
    #开启gzip压缩
    #gzip  on;

    #设置允许压缩的页面最小字节数
    #gzip_min_length 1k;

    #申请4个单位为16K的内存作为压缩结果流缓存
    #gzip_buffers 4 16k;

    #设置识别http协议的版本,默认为1.1
    #gzip_http_version 1.1;

    #指定gzip压缩比,1-9数字越小,压缩比越小,速度越快
    #gzip_comp_level 2;

    #指定压缩的类型
    #gzip_types text/plain application/x-javascript text/css application/xml;

    #让前端的缓存服务器进过gzip压缩的页面
    #gzip_vary on; 




    #虚拟主机的配置
    server {
        #监听端口
        listen       80;

        #设置主机域名
        server_name  localhost;

        #设置访问的语言编码
        #charset koi8-r;

        #设置虚拟主机访问日志的存放路径及日志的格式为main
        #access_log  logs/host.access.log  main;

        #设置虚拟主机的基本信息
        location / {
           #设置虚拟主机的网站根目录
            root   html;

           #设置虚拟主机默认访问的网页
            index  index.html index.htm;
        }
        #备注说明: location [修饰符或正则表达式]{}
        #修饰符:
        #1、 =     等于,严格匹配 ,匹配优先级最高。
        #2、 ^~  表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。
        #3、 ~     区分大小写
        #4、 ~*  不区分大小写
        #优先级:优先级从高到低依次为:
        #1、 精确匹配(=)
        #2、 前缀匹配(^~)
        #3、 正则匹配(~和~*)
        #4、 不写
        

        #对 / 启用反向代理
        location / {
            proxy_pass  http://127.0.0.1:88;

            #以下是一些反向代理的配置可删除
            proxy_redirect off;

            #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            #client_max_body_size       10m;   #允许客户端请求的最大单文件字节数
            #client_body_buffer_size    128k;  #缓冲区代理缓冲用户端请求的最大字节数
            #proxy_connect_timeout      300;   #nginx跟后端服务器连接超时时间(代理连接超时)
            #proxy_send_timeout         300;   #后端服务器数据回传时间(代理发送超时)
            #proxy_read_timeout         300;   #连接成功后,后端服务器响应时间(代理接收超时)
            #proxy_buffer_size          4k;    #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            #proxy_buffers              4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            #proxy_busy_buffers_size    64k;   #高负荷下缓冲大小(proxy_buffers*2)
            #proxy_temp_file_write_size 64k;   #设定缓存文件夹大小,大于这个值,将从upstream服务器传
         }

        #设定查看Nginx状态的地址
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file confpasswd; #htpasswd文件的内容可以用apache提供的htpasswd工具来产生。
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

 

四、反向代理:

1、正向代理与反向代理:

(1)、正向代理:

客户端代理转发请求称为正向代理。例如VPN。

(2)、反向代理:

服务器端代理转发请求称为反向代理。例如nginx

 

2、相关配置:

通过监听9000端口,访问http://localhost:9000/nacos/index.html将被代理到 http://localhost:8080/nacos/index.html

server {
        listen   9000;
        server_name  localhost;

        location /nacos {
                proxy_pass http://localhost:8080;
        }
}

 

3、设置代理请求headers:

由于使用反向代理之后,后端服务无法获取用户的真实IP,所以,一般反向代理都会设置以下header信息

 

五、动静分离:

Nginx动静分离是将静态请求和动态请求分开,由不同的服务器进行解析(使用Nginx处理静态页面,后端服务处理动态请求),可以提高系统的访问速度,有效的给后端服务器降压。

 

1、相关配置:

server {
        listen   8888;   #配置前端请求端口,实际端口是8080
        server_name  localhost;     #自定义,主要用于区分当多个server的监听端口重复的情况

        #配置静态访问地址(前端)
        location / {
            root /home/demo/dist;  #静态文件的实际位置
            index index.html index.htm;
            try_files $uri $uri/ /index.html;  #try_files检查文件是否存在使用
        }

        #配置动态请求地址(后端)
        location /v1/ {
            #设置向代理服务器发送请求时的请求头数据,由于使用反向代理之后,后端服务无法获取用户的真实IP
            #nginx的主机地址
            proxy_set_header Host $http_host;
            #用户端真实的IP,即客户端IP
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://localhost:8080;
        }
}

2、备注说明:

location的修饰符

说明

=

等于,严格匹配 ,匹配优先级最高。

^~

表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。优先级第二高。

~

区分大小写

~*  

不区分大小写

3、相关demo:

使用Nginx部署前后端分离项目并实现负载均衡

 

六、负载均衡:

通过增加服务器的数量,将请求均衡分发到各个服务器上,利用负载均衡服务器将原先的请求是集中到单个服务器上的情况改为请求分发到多个服务器上。

nginx作为非常有效的HTTP负载平衡器,会将流量分配到多个应用程序服务器,可以提升Web应用程序的性能,提高扩展性和可靠性。

1、相关配置:

upstream nacos-server-demo {
        #配置负载均衡策略:不写,默认采用轮询机制
        server localhost:2200;
        server localhost:2201;
}

server {
        listen   80;
        server_name  localhost;

        location /nacos {
                proxy_pass http://nacos-server-demo;
        }
}

 

2、负载均衡策略:

(1)、轮询(默认):

 该策略是Nginx默认的负载均衡策略,每一个客户端请求按时间顺序轮流分配到不同的服务器上,如果后端服务不可以用,会自动过滤掉。

upstream my_test_server {
  server localhost:8080;
  server localhost:8081;

}

(2)、weight 权重:

weight代表权重的意思,用于指定轮询的几率,默认权重都是1,可以手动设置调整,权重越高,被分配的次数越多,weight权重和访问比例是成正比的,用于解决后端服务器性能不均衡时,调整访问比例。

upstream my_test_server {
      #权重越高,被分配次数越多
  server localhost:8080 weight=1;
  server localhost:8081 weight=2;
}

(3)、ip_hash:

 ip_hash是将每个请求按照访问ip的hash结果(通过哈希算法获得)进行分配,这种方式可以保证同一客户端的请求将始终定向到同一服务器。

upstream my_test_server {
  ip_hash;
  server localhost:8080;
  server localhost:8081;
}

优点:可以保证session会话,解决服务器之间session不能共享的问题。

(4)、least_conn最小连接:

将请求转发给连接数较少(即:较为空闲的)的后端服务器。

每个后端服务器配置可能不同,处理的请求也有可能不同,对于处理的请求有快有慢,least_conn是根据后端服务器的连接情况,动态的选择连接数量较少的一台服务器来处理当前的请求。

upstream my_test_server {
  least_conn;
  server localhost:8080;
  server localhost:8081;
}

(5)、fair(第三方插件):

 fair是按照服务器端的响应时间来分配请求,响应时间短的服务器优先分配。第三方的负载均衡策略需要安装第三方的插件。

upstream my_test_server {
  fair;
  server localhost:8080;
  server localhost:8081;
}

(6)、url_hash(第三方插件)

url_hash是根据url的hash结果进行分配请求,每一个url会固定到同一个服务器上,配合缓存使用,可以减少不必要的下载和资源时间的浪费。每次同一个url请求到达同一个服务器上,第一次加载后放入缓存,后面再次请求,直接取缓存资源。如果不采用url_hash,可能会导致请求到达不同的服务器,资源出现重新加载的情况。第三方的负载均衡策略需要安装第三方的插件。

upstream my_test_server {
  hash $request_uri;
  server localhost:8080;
  server localhost:8081;
}

 

七、缓冲与缓存机制:

反向代理的一个问题是代理大量用户时会增加服务器进程的性能冲击影响。在大多数情况下,可以很大程度上能通过利用nginx​的缓冲和缓存功能减轻。

1、缓冲:

缓冲一般放在内存中,如果不适合放入内存(比如超过了指定大小),则会将响应写入磁盘临时文件中。

启用缓冲后,nginx先将后端的请求响应(response)放入缓冲区中,等到整个响应完成后,再发给客户端。

#缓冲:启用on/禁用off
proxy_buffering on;
#设置代理缓冲区大小,Nginx 针对单个连接,缓存来自代理服务器的响应
proxy_buffers 24 4k;
#设置从代理服务器读取并保存用户头信息的缓冲区大小(来自后端服务器的响应)
proxy_buffer_size 1k;
#设置高负荷下的缓冲大小,一般为 proxy_buffers 的两倍
proxy_busy_buffers_size 8k;
#当proxy_buffers放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,
#它与 proxy_cache 没有关系;大于这个值,将从 upstream 服务器传回,设置为 0 禁用;
proxy_max_temp_file_size 2048m;
#当缓存被代理的服务器响应到临时文件时,这个选项限制每次写临时文件的大小
proxy_temp_file_write_size 32k;
#用于指定临时文件所在的目录
proxy_temp_path /usr/local/nginx/proxy_temp

2、缓存:

启用缓存后,nginx将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量

#设置缓存路径和相关参数(必选),key=mycache
proxy_cache_path /tmp/nginx/cache levels=1:2  keys_zone=mycache:10m max_size=10g;
#引用设置的缓存配置(必选)
proxy_cache mycache;
#对响应状态码为200 302的响应缓存100s
proxy_cache_valid 200 302 100s;
#对响应状态码为404的响应缓存200s
proxy_cache_valid 404 200s;
#proxy_cache_valid any 5m;
#请求参数带有nocache或者comment时不使用缓存
proxy_cache_bypass $arg_nocache $arg_comment;
#忽略被代理服务器设置的"Cache-Control"头信息
proxy_ignore_headers "Cache-Control";
#对GET HEAD POST方法进行缓存
proxy_cache_methods GET HEAD POST;
#当缓存过期时,当构造上游请求时,添加If-Modified-Since和If-None-Match头部,值为过期缓存中的Last-Modified值和Etag值。
proxy_cache_revalidate on;
#当被代理服务器返回403时,nginx可以使用历史缓存来响应客户端,该功能在一定程度上能能够为客户端提供不间断访问
proxy_cache_use_stale http_403;

3、相关配置的demo:

http {
    #设置缓存路径和相关参数(必选)
    proxy_cache_path  /tmp/nginx/cache levels=1:2  keys_zone=mycache:10m max_size=10g;
    server {
        listen 80;
        location /cache  {
            proxy_pass http://192.168.1.135:8080;

            #引用缓存配置(必选)
            proxy_cache mycache;

            #对响应状态码为200 302的响应缓存100s
            proxy_cache_valid 200 302 100s;
            #对响应状态码为404的响应缓存200
            proxy_cache_valid 404 200s;

            #请求参数带有nocache或者comment时不使用缓存
            proxy_cache_bypass $arg_nocache $arg_comment;

            #忽略被代理服务器设置的"Cache-Control"头信息
            proxy_ignore_headers "Cache-Control"; 

            #对GET HEAD POST方法进行缓存 
            proxy_cache_methods GET HEAD POST;

            #当缓存过期时,当构造上游请求时,添加If-Modified-Since和If-None-Match头部,值为过期缓存中的Last-Modified值和Etag值。
            proxy_cache_revalidate on;

            #当被代理服务器返回403时,nginx可以使用历史缓存来响应客户端,该功能在一定程度上能能够为客户端提供不间断访问
            proxy_cache_use_stale http_403;

            #默认开启,开启代理缓冲区(内存)
            proxy_buffering on;
            #设置响应头的缓冲区设为8k
            proxy_buffer_size 8k;
            #设置网页内容缓冲区个数为8,单个大小为8k
            proxy_buffers 8 8k;
            #设置当nginx还在读取被代理服务器的数据响应的同时间一次性向客户端响应的数据的最大为16k
            proxy_busy_buffers_size 16k;
            #临时文件最大为1024m
            proxy_max_temp_file_size 1024m;
            #设置一次往临时文件的大小最大为16k
            proxy_temp_file_write_size 16k;
            #设置临时文件存放目录
            proxy_temp_path /tmp/proxy_temp;

            #设置和被代理服务器连接的超时时间为60s
            proxy_connect_timeout 60;
            #设置向被代理服务器发送请求的超时时间为60s
            proxy_send_timeout 60;
            #设置从被代理服务器读取响应的超时时间为60s
            proxy_read_timeout 60;

            #添加缓存状态参数,方便测试是否命中缓存
            add_header cache $upstream_cache_status;
        }
    }
}

 

八、相关参考:

nginx入门学习参考

nginx详解学习参考

nginx配置学习参考

 

posted on 2023-10-16 00:45  爱文(Iven)  阅读(24)  评论(0编辑  收藏  举报

导航