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:
五、动静分离:
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作为非常有效的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; } } }
八、相关参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)