nginx的安装和使用
前言
Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru 站点(俄文:Рамблер)开发的.
它也是一种轻量级的Web服务器,可以作为独立的服务器部署网站(类似Tomcat)。它高性能和低消耗内存的结构受到很多大公司青睐,如淘宝网站架设。
- 轻量级,同样是web 服务,比apache占用更少的内存及资源 ,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 这归功于Nginx为我们选择了 epoll and kqueue 作为开发模型.
- 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
- 高度模块化的设计,编写模块相对简单
- 社区活跃,各种高性能模块出品迅速啊
- Nginx本身就是一个反向代理服务器
- 负载均衡能力突出,Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.
安装使用
Nginx 的安装步骤比较简单,安装在windows上推荐使用压缩包的安装方式。压缩包安装方式配置属性更灵活。
源码:https://trac.nginx.org/nginx/browser
下载
百度搜索Nginx,找到官网直接下载对应版本的压缩包。 有稳定版本和最新版本及以前版本,推荐使用稳定版本开发
-
下载完成之后,进行解压可以看到如下 文件结构。
-
双击nginx,exe 就启动了。在页面输入localhost。出现如下界面则表示安装成功。默认监听80端口号
安装
发布为Windows服务
虽然双击运行nginx.exe就可以启动,但是为了解决windows重启后可以自动启动nginx,我们可以将nginx发布为windows服务
需要借助"Windows Service Wrapper"小工具,项目地址: https://github.com/kohsuke/winsw
下载地址: http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/1.18/winsw-1.18-bin.exe
下载该工具后,将其放在 Nginx安装目录下,并重命名为nginx-service.exe
,创建配置文件nginx-service.xml
(名字要和工具名一样),
创建 nginx-service.exe.config
(为支持NET 4.0 runtime,默认只支持NET 2.0 runtime)
文件结构如下:
nginx-service.xml 内容如下:
<service> <id>nginx</id> <name>Nginx Service</name> <description>High Performance Nginx Service</description> <logpath>D:\nginx-1.14.0\logs</logpath> <log mode="roll-by-size"> <sizeThreshold>10240</sizeThreshold> <keepFiles>8</keepFiles> </log> <executable>D:\nginx-1.14.0\nginx.exe</executable> <startarguments>-p D:\nginx-1.14.0</startarguments> <stopexecutable>D:\nginx-1.14.0\nginx.exe</stopexecutable> <stoparguments>-p D:\nginx-1.14.0 -s stop</stoparguments> </service>
nginx-service.exe.config 内容如下:
<configuration> <startup> <supportedRuntime version="v2.0.50727" /> <supportedRuntime version="v4.0" /> </startup> <runtime> <generatePublisherEvidence enabled="false"/> </runtime> </configuration>
在cmd中运行如下命令安装windows服务
D:\nginx-1.14.0\nginx-service.exe install
之后就可以在Windows服务面板中启动服务了
日常常用启停cmd命令
为了方便日常维护的使用,目前已经封装了bat文件,可以使用以下命令保存为bat文件,步骤如下:
-
将下面代码拷贝到txt文件
-
配置nginx.exe所在的目录
SET NGINX_PATH=E: //nginx.exe所在的盘符 SET NGINX_DIR=E:\web\nginx-1.12.2\ //nginx.exe所在的目录
-
文件另存为.bat文件,重命名为nginx-help.bat
-
放到nginx根目录
日常启停功能的cmd命令:
====================================================
@echo off
rem 提供日常启停功能的cmd命令
echo ==================begin========================
cls
SET NGINX_PATH=E:
SET NGINX_DIR=E:\web\nginx-1.12.2\
color 0a
TITLE Nginx 管理程序控制面板
CLS
ECHO.
ECHO. * Nginx 管理程序 *
ECHO. * 创建2018-02-26 *
ECHO.
:MENU
ECHO. * nginx 进程list *
tasklist|findstr /i "nginx.exe"
ECHO.
ECHO. [1] 启动Nginx
ECHO. [2] 关闭Nginx
ECHO. [3] 重启Nginx
ECHO. [4] 退 出
ECHO.
ECHO.请输入选择项目的序号:
set /p ID=
IF "%id%"=="1" GOTO start
IF "%id%"=="2" GOTO stop
IF "%id%"=="3" GOTO restart
IF "%id%"=="4" EXIT
PAUSE
:start
call :startNginx
GOTO MENU
:stop
call :shutdownNginx
GOTO MENU
:restart
call :shutdownNginx
call :startNginx
GOTO MENU
:shutdownNginx
ECHO.
ECHO.关闭Nginx......
taskkill /F /IM nginx.exe > nul
ECHO.OK,关闭所有nginx 进程
goto :eof
:startNginx
ECHO.
ECHO.启动Nginx......
IF NOT EXIST "%NGINX_DIR%nginx.exe" ECHO "%NGINX_DIR%nginx.exe"不存在
%NGINX_PATH%
cd "%NGINX_DIR%"
IF EXIST "%NGINX_DIR%nginx.exe" (
echo "start '' nginx.exe"
start "" nginx.exe
)
ECHO.OK
goto :eof
界面效果:
基本功能
注意:
- 每个指令必须有分号结束
- 在nginx.conf的注释符号为“#”
Nginx配置文件结构
打开conf文件夹,Nginx服务器的基础配置,默认的配置也存放在此,以下是你的安装文件目录结构:
下面主要介绍nginx.conf,文件结构如下:
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
说明:
-
全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
-
events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
-
http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
-
server块:配置虚拟主机的相关参数,一个http中可以有多个server。
-
location块:配置请求的路由,以及各种页面的处理情况。
配置文件示例
########### 每个指令必须有分号结束。#################
#user administrator administrators; #配置用户或者组,默认为nobody nobody。
#worker_processes 2; #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid; #指定nginx进程运行文件存放地址
error_log log/error.log debug; #制定日志路径,级别。这个设置可以放入全局块,
http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
events {
accept_mutex on; #设置网路连接序列化,防止惊群现象发生,默认为on
multi_accept on; #设置一个进程是否同时接受多个网络连接,默认为off
#use epoll; #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain
#access_log off; #取消服务日志
log_format myFormat '$remote_addr–$remote_user [$time_local] $request
$status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
access_log log/access.log myFormat; #combined为日志格式的默认值
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
sendfile_max_chunk 100k; #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
error_page 404 https://www.baidu.com; #错误页
server {
keepalive_requests 120; #单连接请求上限次数。
listen 4545; #监听端口
server_name 127.0.0.1; #监听地址
location ~*^.+$ { #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
#root path; #根目录
#index vv.txt; #设置默认页
proxy_pass http://mysvr; #请求转向mysvr 定义的服务器列表
deny 127.0.0.1; #拒绝的ip
allow 172.18.5.54; #允许的ip
}
}
}
上面是nginx的基本配置,需要注意的有以下几点:
- $remote_addr 与$http_x_forwarded_for 用以记录客户端的ip地址;
- $remote_user :用来记录客户端用户名称;
- $time_local : 用来记录访问时间与时区;
- $request : 用来记录请求的url与http协议;
- $status : 用来记录请求状态;成功是200,
- $body_bytes_s ent :记录发送给客户端文件主体内容大小;
- $http_referer :用来记录从那个页面链接访问过来的;
- $http_user_agent :记录客户端浏览器的相关信息;
- 惊群现象:一个网路连接到来,多个睡眠的进程被同事叫醒,但只有一个进程能获得链接,这样会影响系统性能。(如何解决“惊群”现象)
- 每个指令必须有分号结束。
站点搭建
搭建静态站点非常简单,只需要3步:
- http下增加server节点,一个server节点就是一个网站
- 配置server节点下的server_name(服务器名称
域名或IP
)和listen(端口
)节点 - 配置server节点下root(
网站目录
)和index(默认页
)节点
配置好以上三步,直接启动nginx就可以看到效果了
比较推荐的写法是在conf文件夹下建立一个名为webapps
的文件夹,针对一个站点单独建立一个.conf文件,然后在nginx.conf主配置文件内include进来,方便后期维护,不然多个server节点都配置在nginx.conf下会显得非常臃肿,下面附上搭建demo
-
在新建的
webapps
文件夹下建一个名为web1.conf
的配置文件:## backend for web1 ## ## Start www.web1.com ## server { listen 9001; server_name localhost; error_log logs/error.log; root html; #配置了index节点,默认按顺序查找返回配置的页面 #index index.html index.htm index.php; location / { default_type text/html; return 200 '我是web1'; } #返回固定文本 location ~ ^/get_text { default_type text/html; return 200 'This is text!'; } #返回固定json location ~ ^/get_json { default_type application/json; return 200 '{"status":"success","result":"nginx json"}'; } #错误页 error_page 404 /404.html; location = /40x.html { } #错误页 error_page 500 502 503 504 /50x.html; location = /50x.html { } } ## End www.web1.com ##
-
在nginx.conf主配置文件内使用include引入
web1.conf
文件#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { charset utf-8; include mime.types; default_type application/octet-stream; #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 logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; #引入web1配置文件 include webapps/web1.conf; }
配置好后启动nginx就可以看到效果了
在浏览器输入http://localhost:9001/
在浏览器输入http://localhost:9001/get_json
正向代理
如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
具体配置和用法待补充…
反向代理
如果局域网向Internet提供资源服务,让Internet上的其他客户端来访问局域网内的资源,使它们必须通过一个代理服务器来进行访问,这种服务就称为反向代理。正向代理和反向代理逻辑正好相反。
模拟一个场景:有web1和web2两个网站,希望可以实现用户访问web2可以获取到web1的网站
新建一个web2.conf,内容如下
## backend for web2 ##
## Start www.web2.com ##
server {
listen 9002;
server_name 127.0.0.1;
error_log logs/error.log;
root html;
#配置了index节点,默认按顺序查找返回配置的页面
#index index.html index.htm index.php;
location / {
default_type text/html;
return 200 '我是web2';
}
location /web1 {
proxy_pass http://127.0.0.1:9001/;
}
}
## End www.web2.com ##
在nginx.conf引入,并重启nginx
在浏览器输入http://localhost:9002
在浏览器输入http://localhost:9002/web1
以上就是使用proxy_pass来实现反向代理的功能
负载均衡
Nginx的upstream目前支持的负载策略分别是:
轮询策略
,权重轮询策略
,ip_hash策略
,fair策略,url_hash策略,least_conn策略等。
目前我总结的nginx负载策略共两大类,分别是:内置策略
和扩展策略
。内置策略有3种,包括:轮询策略、权重轮询策略和ip_hash策略。默认情况下内置策略会编译进Nginx的内核,只需要在nginx配置中指明参数即可,扩展策略需要额外注册模块来配置。
负载均衡的作用:
-
转发功能
按照一定的算法【权重、轮询】,将客户端请求转发到不同应用服务器上,减轻单个服务器压力,提高系统并发量。
-
故障移除
通过心跳检测的方式,判断应用服务器当前是否可以正常工作,如果服务器期宕掉,自动将请求发送到其他应用服务器。
-
恢复添加
如检测到发生故障的应用服务器恢复工作,自动将其添加到处理用户请求队伍中。
轮询策略
这种是默认的策略,把每个请求按顺序逐一分配到不同的server,如果server挂掉,能自动剔除
。
upstream example.com {
server 192.168.99.100:9001;
server 192.168.99.100:9002;
}
权重轮询策略
使用weight来指定server访问比率,weight默认是1。以下配置会是server2访问的比例是server1的两倍。
upstream example.com {
server 192.168.99.100:9001 weight=1;
server 192.168.99.100:9002 weight=2;
}
ip_hash策略
每个请求会按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理,可以解决session的问题。如果server挂掉,能自动剔除
。
upstream example.com {
ip_hash;
server 192.168.99.100:9001;
server 192.168.99.100:9002;
}
ip_hash可以和weight结合使用。
least_conn策略
最少连接,把请求分配到连接数最少的server
upstream example.com {
least_conn;
server 192.168.99.100:9001;
server 192.168.99.100:9002;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。与weight分配策略类似。
upstream example.com {
server 192.168.99.100:9001;
server 192.168.99.100:9002;
fair;
}
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
注意:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法。
upstream example.com {
server 192.168.99.100:9001;
server 192.168.99.100:9002;
hash $request_uri;
hash_method crc32;
}
Sticky策略
该策略在多台服务器的环境下,为了确保一个客户端只和一台服务器通讯,它会保持长连接,并在结束会话后再次选择一个服务器,保证了压力均衡。
upstream example.com {
sticky;
server 192.168.99.100:9001;
server 192.168.99.100:9002;
}
其他配置
upstream还可以为每个设备设置状态值,这些状态值的含义分别如下:
down 表示当前的server暂时不参与负载.
weight 默认为1.weight越大,负载的权重就越大。
max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误.
fail_timeout : max_fails次失败后,暂停的时间。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
upstream bakend{ #定义负载均衡设备的Ip及设备状态
ip_hash;
server 10.0.0.11:9090 down;
server 10.0.0.11:8080 weight=2;
server 10.0.0.11:6060;
server 10.0.0.11:7070 backup;
}
示例Demo
创建一个名为web3.conf的配置文件,内容如下:
## backend for web3 ##
upstream example {
server 127.0.0.1:9004; #web1
server 127.0.0.1:9005; #web2
}
## Start www.web3.com ##
server {
listen 9003;
server_name 127.0.0.1;
error_log logs/error.log;
root html;
#配置了index节点,默认按顺序查找返回配置的页面
index index.html index.htm index.php;
location / {
proxy_pass http://example;
}
}
### 为了演示效果,我直接在同文件搭建了web1和web2 ###
server {
listen 9004;
server_name 127.0.0.1;
error_log logs/error.log;
root html;
#配置了index节点,默认按顺序查找返回配置的页面
index index.html index.htm index.php;
location / {
default_type text/html;
return 200 '我是负载后的web1';
}
}
server {
listen 9005;
server_name 127.0.0.1;
error_log logs/error.log;
root html;
#配置了index节点,默认按顺序查找返回配置的页面
index index.html index.htm index.php;
location / {
default_type text/html;
return 200 '我是负载后的web2';
}
}
## End www.web3.com ##
在nginx.conf引入,并重启nginx
在浏览器输入http://localhost:9003
再刷新下,就跳转到了web2
后续问题
如果关了server1,再多次刷新页面,接下来出现的就会都是server2的页面,但是时而快时而慢。这其中原因是当如果nginx将请求转发到server2时,服务器会马上跳转成功,但是如果是转到server1,因为server1已经关闭了,所以会出现一段等待响应过程的过程,要等它失败后才会转到server2。
而这个等待响应的时间我们是可以配置的。
这个时间由以下3个参数控制:
proxy_connect_timeout:与服务器连接的超时时间,默认60s
fail_timeout:当该时间内服务器没响应,则认为服务器失效,默认10s
max_fails:允许连接失败次数,默认为1
等待时间 = proxy_connect_timeout + fail_timeout * max_fails
如果我这样配置的话,只需等待6秒就可以了。
日志配置和日志切割
日志配置
日志对于统计排错来说非常有利的。下面总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、log_subrequest、rewrite_log、error_log。
nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。
-
access_log指令
语法: access_log path [format [buffer=size [flush=time]]];
access_log path format gzip[=level] [buffer=size] [flush=time];
access_log syslog:server=address[,parameter=value] [format];
access_log off;
默认值: access_log logs/access.log combined;
配置段: http, server, location, if in location, limit_except
gzip压缩等级。
buffer设置内存缓存区大小。
flush保存在缓存区中的最长时间。
不记录日志:access_log off;
使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined; -
log_format指令
语法: log_format name string …;
默认值: log_format combined “…”;
配置段: http
name表示格式名称,string表示等义的格式。log_format有一个默认的无需设置的
combined日志格式,相当于apache的combined日志格式,如下所示:log_format combined '$remote_addr - $remote_user [$time_local] ' ' "$request" $status $body_bytes_sent ' ' "$http_referer" "$http_user_agent" ';
如果nginx反向代理之后,web服务器无法直接获取到客户端真实的IP地址了。 $remote_addr获取反向代理的IP地址。反向代理服务器在转发请求的http头信息中,可以增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。PS: 获取用户真实IP参见 Nginx 反向代理获取真实IP问题 ,如下所示:
log_format porxy '$http_x_forwarded_for - $remote_user [$time_local] ' ' "$request" $status $body_bytes_sent ' ' "$http_referer" "$http_user_agent" ';
日志格式允许包含的变量注释如下:
变量 注释 $remote_addr $http_x_forwarded_for(反向) 记录客户端IP地址 $remote_user 记录客户端用户名称 $request 记录请求的URL和HTTP协议 $status 记录请求状态 $body_bytes_sent 发送给客户端的字节数,不包括响应头的大小; 该变量与Apache模块mod_log_config里的“%B”参数兼容。 $bytes_sent 发送给客户端的总字节数。 $connection 当前通过一个连接获得的请求数量。 $connection_requests 当前通过一个连接获得的请求数量。 $msec 日志写入时间。单位为秒,精度是毫秒。 $pipe 如果请求是通过HTTP流水线(pipelined)发送,pipe值为“p”,否则为“.”。 $http_referer 记录从哪个页面链接访问过来的 $http_user_agent 记录客户端浏览器相关信息 $request_length 请求的长度(包括请求行,请求头和请求正文)。 $request_time 请求处理时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。 $time_iso8601 ISO8601标准格式下的本地时间。 $time_local 通用日志格式下的本地时间。 发送给客户端的响应头拥有“sent_http_”前缀。 比如$sent_http_content_range,
实例如下:http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '"$status" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '"$gzip_ratio" $request_time $bytes_sent $request_length'; log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" ' '"$status" $body_bytes_sent $request_time $bytes_sent $request_length ' '[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]'; open_log_file_cache max=1000 inactive=60s; server { server_name ~^(www\.)?(.+)$; access_log logs/$2-access.log main; error_log logs/$2-error.log; location /srcache { access_log logs/access-srcache.log srcache_log; } } }
-
open_log_file_cache指令
语法: open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cache off;
默认值: open_log_file_cache off;
配置段: http, server, location对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off),格式如下:
参数注释如下:
max:设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。
inactive:设置存活时间,默认是10s
min_uses:设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次
valid:设置检查频率,默认60s
off:禁用缓存
实例如下:open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
-
log_not_found指令
语法: log_not_found on | off;
默认值: log_not_found on;
配置段: http, server, location
是否在error_log中记录不存在的错误。默认是。 -
log_subrequest指令
语法: log_subrequest on | off;
默认值: log_subrequest off;
配置段: http, server, location
是否在access_log中记录子请求的访问日志。默认不记录。 -
rewrite_log指令
由ngx_http_rewrite_module模块提供的。用来记录重写日志的。对于调试重写规则建议开启。 Nginx重写规则指南
语法: rewrite_log on | off;
默认值: rewrite_log off;
配置段: http, server, location, if
启用时将在error log中记录notice级别的重写日志。 -
error_log指令
语法: error_log file | stderr | syslog:server=address[,parameter=value] [debug | info | notice | warn | error | crit | alert | emerg];
默认值: error_log logs/error.log error;
配置段: main, http, server, location
配置错误日志。
日志切割
nginx日志默认情况下统统写入到一个文件中,文件会变的越来越大,非常不方便查看分析。以日期来作为日志的切割是比较好的,通常我们是以每日来做统计的。下面来说说nginx日志切割。
具体这边不展开细讲,直接上一个模版,按照模版配置就行了
#日志切割,按天切割
if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
set $tttt $1;
}
access_log logs/access/web3/access-$tttt.log main;
##cache##
proxy_connect_timeout 500;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout 600;
#连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
proxy_send_timeout 500;
#后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
proxy_buffer_size 128k;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffers 4 128k;
#同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
proxy_busy_buffers_size 256k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_temp_file_write_size 128k;
#proxy缓存临时文件的大小
proxy_temp_path ./data/proxy_temp_dir;
#用于指定本地目录来缓冲较大的代理请求
proxy_cache_path ./data/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
将以上配置放在server下,如下图所示:
配置好后重启nginx,直接访问,就会在对应的目录生成以下的log文件,内容如下:
服务器缓存配置
nginx的一大功能就是完成静态资源的分离部署,减轻后端服务器的压力,如果给这些静态资源再加一级nginx的缓存,可以进一步提升访问效率。
第一步:添加nginx.conf的http级别的缓存配置
##cache##
proxy_connect_timeout 500;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_read_timeout 600;
#连接成功后_等候后端服务器响应的时间_其实已经进入后端的排队之中等候处理
proxy_send_timeout 500;
#后端服务器数据回传时间_就是在规定时间内后端服务器必须传完所有数据
proxy_buffer_size 128k;
#代理请求缓存区_这个缓存区间会保存用户的头信息以供Nginx进行规则处理_一般只要能保存下头信息即可
proxy_buffers 4 128k;
#同上 告诉Nginx保存单个用的几个Buffer最大用多大空间
proxy_busy_buffers_size 256k;
#如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐*2
proxy_temp_file_write_size 128k;
#proxy缓存临时文件的大小
proxy_temp_path ./data/proxy_temp_dir;
#用于指定本地目录来缓冲较大的代理请求
proxy_cache_path ./data/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
此处的重点在最后一句,缓存存储路径为:./data/proxy_cache_dir,levels=1:2代表缓存的目录结构为2级目录
第二步:在访问静态文件的location上添加缓存
#静态数据保存时效
location ~ \.html$ {
proxy_cache cache_one;
#此处的cache_one必须于上一步配置的缓存区域名称相同
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1d;
proxy_cache_valid any 1m;
#不同的请求设置不同的缓存时效
proxy_cache_key $uri$is_args$args;
#生产缓存文件的key,通过4个string变量结合生成
expires 30d;
#其余类型的缓存时效为30天
proxy_set_header X-Forwarded-Proto $scheme;
}
此处需要注意:
只有在proxy_pass的时候,才会生成缓存,下一次请求执行到proxy_pass的时候会判断是否有缓存,如果有则直接读缓存,返回给客户端,不会执行proxy_pass;如果没有,则执行proxy_pass,并按照规则生成缓存文件;可以到nginx的cache文件夹下看是否生成了缓存文件。
具体这边不展开细讲,直接上一个模版,按照模版配置就行了
修改nginx.conf文件:
修改web3.conf文件:
打开浏览器访问http://localhost:9003,生成的缓存如下:
知识链接
小知识:
如果我们没有备案的域名,又想做出域名的效果,我们可以在本地修改hosts来达到效果
win 下hosts 的地址为 C:\Windows\System32\drivers\etc
我们需要在hosts文件里面添加如下配置127.0.0.1 www.web1.com
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)