Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)
文章目录
- 1. Nginx目录结构分析
- 1.1 conf目录
- 1.2 html目录
- 1.3 logs目录
- 1.4 sbin目录
- 2. Nginx的启用方式和停止方式
- 2.1 信号控制
- 2.1.1 信号
- 2.1.2 调用命令
- 2.2 命令行控制
- 2.2.1 基础操作类
- 2.2.2 配置测试类
- 2.2.3 进程控制类
- 2.2.4 路径与文件类
- 2.2.5 高级配置类
- 3. Nginx配置文件(nginx.conf)的结构
- 3.1 全局块
- 3.1.1 user指令
- 3.1.2 work_process指令
- 3.1.3 daemon指令
- 3.1.4 pid指令
- 3.1.5 error_log指令
- 3.1.6 include指令
- 3.2 events块
- 3.2.1 accept_mutex指令
- 3.2.2 multi_accept指令
- 3.2.3 worker_connections指令
- 3.2.4 use指令
- 3.3 http块
- 3.3.1 自定义mime-type指令
- 3.3.2 自定义服务日志
- 3.3.2.1 access_log指令
- 3.3.2.2 log_format指令
- 3.3.3 sendfile指令
- 3.3.4 keepalive_timeout指令
- 3.3.5 keepalive_requests指令
- 4. Nginx基础配置实战
- 4.1 需求分析
- 4.2 准备工作
- 4.2.1 创建www用户
- 4.2.2 执行创建目录和创建文件的脚本
- 4.3 修改nginx的配置文件
- 4.4 开放防火墙端口
- 4.5 访问测试
如果想了解更多与Nginx相关的内容,可以查看Nginx专栏中的文章: Nginx
视频教程:14-Nginx的目录结构分析
1. Nginx目录结构分析
在使用Nginx之前,我们先分析Nginx的目录结构,重点关注conf、html、logs、sbin四个目录
/www/server/nginx
├── conf
│ ├── enable-php-00.conf
│ ├── enable-php-52.conf
│ ├── enable-php-53.conf
│ ├── enable-php-54.conf
│ ├── enable-php-55.conf
│ ├── enable-php-56.conf
│ ├── enable-php-70.conf
│ ├── enable-php-71.conf
│ ├── enable-php-72.conf
│ ├── enable-php-73.conf
│ ├── enable-php-74.conf
│ ├── enable-php-75.conf
│ ├── enable-php-80.conf
│ ├── enable-php-81.conf
│ ├── enable-php-82.conf
│ ├── enable-php-83.conf
│ ├── enable-php-84.conf
│ ├── enable-php.conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── luawaf.conf
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf
│ ├── nginx.conf.default
│ ├── pathinfo.conf
│ ├── proxy.conf
│ ├── rewrite
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ ├── vhost
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
│ ├── error.log
│ └── nginx.pid
├── sbin
│ └── nginx
1.1 conf目录
conf目录存储的是Nginx的配置文件
- CGI,Common Gateway Interface,公共网关接口
- CGI是一种一种标准协议,用于在Web服务器和外部程序(如脚本或二进制文件)之间传递数据,实现动态生成网页内容
-
fastcgi.conf:fastcgi相关配置文件
-
fastcgi.conf.default:fastcgi.conf的备份文件
-
fastcgi_params:fastcgi的参数文件
-
fastcgi_params.default:fastcgi的参数备份文件
-
scgi_params:scgi的参数文件
-
scgi_params.default:scgi的参数备份文件
koi-utf、koi-win、win-utf:这三个文件都是与编码转换映射相关的配置文件,用于将一种编码转换成另一种编码
- uwsgi_params:uwsgi的参数文件
- uwsgi_params.default:uwsgi的参数备份文件
- mime.types:记录的是HTTP协议中的Content-Type的值和文件后缀名的对应关系
- mime.types.default:mime.types的备份文件
- nginx.conf:这个是Nginx的核心配置文件,这个文件非常重要,也是我们即将要学习的重点
- nginx.conf.default:nginx.conf的备份文件
1.2 html目录
html目录存放的事Nginx自带的两个静态的html页面
- 50x.html:访问失败后的失败页面
- index.html:成功访问的默认首页
1.3 logs目录
logs目录存储的是Nginx的日志文件,当Nginx服务器启动后,logs目录中会有 access.log error.log 和nginx.pid三个文件出现
1.4 sbin目录
sbin目录存储的是nginx文件,nginx文件用于控制Nginx的启动和停止等操作
2. Nginx的启用方式和停止方式
在Linux系统中有很多种方式启用Nginx和停止Nginx,本文介绍两种:
- 信号控制
- 命令行控制
2.1 信号控制
Nginx默认采用的是多进程的方式来工作的,当Nginx启动后,我们通过sudo ps -ef | grep nginx
命令可以查看到如下内容
sudo ps -ef | grep nginx
从上图中可以看到,Nginx后台进程中包含一个master进程和多个worker进程,master进程主要用来管理worker进程,包含接收外界的信息,并将接收到的信号发送给各个worker进程,监控worker进程的状态
当worker进程出现异常退出后,会自动重新启动新的worker进程,而worker进程则是专门用来处理用户请求的,各个worker进程之间是平等的并且相互独立,处理请求的机会也是一样的
nginx的进程模型,我们可以参考下图:
我们现在作为管理员,只需要通过给master进程发送信号就可以来控制Nginx,这个时候我们需要有两个前提条件,一个是要操作的master进程,一个是信号
要想操作Nginx的master进程,就需要获取到master进程的进程号ID,获取方式有两个
-
通过
ps -ef | grep nginx
指令获取 -
通过
/www/server/nginx/logs/nginx.pid
日志文件获取
2.1.1 信号
信号 | 作用 |
---|---|
TERM/INT | 立即关闭整个服务 |
QUIT | "优雅"地关闭整个服务 |
HUP | 重读配置文件并使用服务对新配置项生效 |
USR1 | 重新打开日志文件,可以用来进行日志切割 |
USR2 | 平滑升级到最新版的nginx |
WINCH | 所有子进程不在接收处理新连接,相当于给work进程发送QUIT指令 |
2.1.2 调用命令
调用命令的格式为:kill -signal PID
- signal:信号
- PID:Nginx的master进程的PID
示例一:发送TERM/INT信号给master进程,Nginx服务将立即关闭
kill -TERM PID
kill -TERM `cat /www/server/nginx/logs/nginx.pid`kill -INT PID
kill -INT `cat /www/server/nginx/logs/nginx.pid`
示例二:发送QUIT信号给master进程,master进程会控制所有的work进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉
kill -QUIT PIDkill -TERM `/www/server/nginx/logs/nginx.pid`
示例三:发送HUP信号给master进程,master进程会控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程
kill -HUP PIDkill -TERM `cat /www/server/nginx/logs/nginx.pid`
示例四:发送USR1信号给master进程,告诉Nginx重新开启日志文件
kill -USR1 PID
kill -TERM `/www/server/nginx/logs/nginx.pid`
示例五:发送USR2信号给master进程,告诉master进程要平滑升级,这个时候会重新开启对应的master进程和work进程,整个系统中将会有两个master进程,并且新的master进程的PID会被记录在/usr/local/nginx/logs/nginx.pid
而之前的旧的master进程PID会被记录在/www/server/nginx/logs/nginx.pid.oldbin
文件中,接着再次发送QUIT信号给旧的master进程,让其处理完请求后再进行关闭
kill -USR2 PID
kill -USR2 `cat /www/server/nginx/logs/nginx.pid`
kill -QUIT PID
kill -QUIT `cat /www/server/nginx/logs/nginx.pid.oldbin`
示例六:发送WINCH信号给master进程,让master进程控制不让所有的work进程再接收新的请求,请求处理完后关闭work进程,注意master进程不会被关闭掉
kill -WINCH PID
kill -WINCH `cat /www/server/nginx/logs/nginx.pid`
2.2 命令行控制
此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来控制Nginx状态,我们可以通过nginx -h
来查看都有哪些参数可以用
nginx -h
root@hcss-ecs-276a:~# nginx -h
nginx version: nginx/1.28.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
[-e filename] [-c filename] [-g directives]
Options:
-?,-h : this help
-v : show version and exit
-V : show version and configure options then exit
-t : test configuration and exit
-T : test configuration, dump it and exit
-q : suppress non-error messages during configuration testing
-s signal : send signal to a master process: stop, quit, reopen, reload
-p prefix : set prefix path (default: /www/server/nginx/)
-e filename : set error log file (default: logs/error.log)
-c filename : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file
2.2.1 基础操作类
-
-?
,-h
:显示帮助信息(当前界面),用于快速查看可用命令 -
-v
:仅显示Nginx的版本号nginx -v # 输出: nginx version: nginx/1.28.0
-
-V
:显示完整版本信息(含编译参数),用于排查环境配置问题nginx -V # 输出: 编译选项(如 --prefix=/www/server/nginx)
2.2.2 配置测试类
-
-t
:测试配置语法,不修改服务状nginx -t # 输出: 语法是否正确(如 "test is successful")
-
-T
:测试配置并输出完整配置内容,用于调试复杂配置nginx -T # 输出当前生效的完整配置(覆盖默认配置)
2.2.3 进程控制类
-
-s signal
:向master进程发送信号nginx -s reload # 重新加载配置(热更新) nginx -s stop # 强制停止服务(立即关闭) nginx -s quit # 优雅停止服务(等待请求处理完) nginx -s reopen # 重启日志文件(用于日志切割)
2.2.4 路径与文件类
-
-e filename
:指定错误日志文件路径nginx -e /var/log/nginx/error.log # 自定义错误日志位置
-
-c filename
:指定配置文件路径(配置文件的默认路径为conf/nginx.conf
)nginx -c /etc/nginx/custom.conf # 使用自定义配置文件
2.2.5 高级配置类
-
-g directives
:在命令行中设置全局指令(覆盖配置文件中的nginx.conf
部分)nginx -g "worker_processes 4; error_log /dev/null;" # 自定义 worker 数量和错误日志
3. Nginx配置文件(nginx.conf)的结构
Windows版本的Nginx和Linux版本的Nginx配置文件的整体结构相同,某个具体属性的值可能不同,本文介绍的是Linux版本的Nginx
我们浏览Nginx自带的nginx.conf配置文件,将其中的注释部分(Nginx的配置文件中使用#
来注释)删掉,可以发现配置文件主要分为三大块:
- 全局块
- events块
- http块(http块中可以配置多个server块,每个server块可以配置多个location块)
worker_processes 1;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}
3.1 全局块
3.1.1 user指令
user指令用于配置运行Nginx服务器的worker进程的用户和用户组
语法 | 默认值 | 位置 |
---|---|---|
user user [group] | nobody | 全局块 |
当客户端请求某个文件时,如果worker进程所在的用户和用户组没有该文件的访问权限,将会抛出以下错误
403 Forbidden
3.1.2 work_process指令
work_process指令用于配置Nginx生成工作进程的数量,这个是Nginx服务器实现并发处理服务的关键所在
理论上来说workder_process的值越大,可以支持的并发处理量也越多,但事实上这个值的设定受服务器自身的限制,建议将该值和服务器CPU的内核数保持一致,或者直接将该值设置为auto
语法 | 默认值 | 位置 |
---|---|---|
worker_processes specific_number/auto; | 1/atuo | 全局块 |
将worker_processes设置成2后输入ps -ef | grep nginx
指令
ps -ef | grep nginx
3.1.3 daemon指令
daemon指令用于设置Nginx是否以守护进程的方式启动
守护进程是Linux后台执行的一种服务进程,特点是独立于控制终端,不会随着终端关闭而停止
语法 | 默认值 | 位置 |
---|---|---|
daemon on|off; | daemon on; | 全局块 |
3.1.4 pid指令
pid指令用于配置存储Nginx当前master进程的进程号ID的文件路径
语法 | 默认值 | 位置 |
---|---|---|
pid file_path; | logs/nginx.pid; | 全局块 |
3.1.5 error_log指令
error_log指令用来配置Nginx错误日志的存放路径
语法 | 默认值 | 位置 |
---|---|---|
#error_log file_path; | #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; | 全局块、http、server、location |
Nginx的日志级别如下(按严重程度从低到高排列)
日志级别 | 解释 |
---|---|
debug | 调试信息,用于开发阶段的问题排查(如变量值、函数调用链) |
info | 普通事件记录(如服务启动/停止、请求处理完成) |
notice | 值得注意的非错误事件(如配置变更、非致命权限警告) |
warn | 潜在问题警告(如文件权限不足、资源占用过高) |
error | 导致功能受阻的错误(如数据库连接失败、文件读写异常) |
crit | 严重错误(如内存耗尽、关键组件崩溃) |
alert | 必须立即采取措施的紧急情况(如磁盘空间不足、安全攻击检测) |
emerg | 系统不可用/需要紧急重启(如主进程崩溃、网络协议栈失效) |
建议不要设置成info及info以下的等级,因为日志级别太低时会记录大量的日志,频繁的磁盘I/O将会影响Nginx的性能
3.1.6 include指令
用来引入其他配置文件,使Nginx的配置更加灵活
语法 | 默认值 | 位置 |
---|---|---|
#include file_path; | 无 | 任意位置 |
3.2 events块
3.2.1 accept_mutex指令
accept_mutex指令用来设置Nginx网络连接序列化
语法 | 默认值 | 位置 |
---|---|---|
accept_mutex on|off; | accept_mutex on; | events |
当 accept_mutex
设置为 on
时,它会为接受新连接的操作加锁,使得在任何时候只有一个工作进程能够接受新的连接。这样可以防止多个工作进程同时尝试接受同一个连接,从而避免了所谓的“惊群”问题(thundering herd problem)
惊群问题是指在多进程或线程环境中,当某个事件发生时,多个进程或线程同时被唤醒并尝试处理该事件,但由于只有一个进程或线程能够实际处理该事件,其他的进程或线程就会发现自己做了无用功,这会导致资源的浪费和性能的下降
通过设置 accept_mutex
为 on
,Nginx 能够确保在任意时刻只有一个工作进程去尝试接受新的连接,从而避免了多个工作进程之间的竞争,提高了连接处理的效率
3.2.2 multi_accept指令
multi_accept指令用于设置是否允许同时接收多个网络连接
语法 | 默认值 | 位置 |
---|---|---|
multi_accept on|off; | multi_accept on; | events |
当 multi_accept
设置为 on
时,允许一个工作进程在一次事件循环中接受多个连接,而不是一次只接受一个连接
3.2.3 worker_connections指令
worker_connections指令用于配置单个worker进程最大的连接数
语法 | 默认值 | 位置 |
---|---|---|
worker_connections number; | worker_connections 512; | events |
这里的连接数不仅仅包括和前端用户建立的连接数,而是包括所有可能的连接数。另外number值不能大于操作系统支持打开的最大文件句柄数量
3.2.4 use指令
use指令用于设置Nginx服务器选择哪种事件驱动来处理网络消息
语法 | 默认值 | 位置 |
---|---|---|
use method; | 根据具体的操作系统而定 | events |
Nginx 支持多种事件处理模块,最常用的是:
- select:这是最基础的模块,但它在大规模并发连接下效率较低,因为它的时间复杂度是 O(n)
- poll:比 select 有所改进,但在大量并发连接下仍然效率不高
- kqueue:这是在 BSD 系统上可用的模块,它非常高效,尤其是在高并发环境下
- epoll:这是在 Linux 系统上可用的模块,它也非常高效,尤其是在处理大量并发连接时
- /dev/poll:这是 Solaris 系统上的模块
- eventport:这是 Solaris 10 及以上版本上的模块
事件处理模型是Nginx优化部分的一个重要内容,我们强调过要使用Linux内核在2.6以上,就是为了能使用epoll函数来优化Nginx
在 Linux 系统上,epoll 是处理大量并发连接的首选方法,因为它的时间复杂度是 O(1),这意味着无论连接数多少,处理每个事件的成本都是固定的
3.3 http块
3.3.1 自定义mime-type指令
视频教程:28-Nginx的http块MIME-Type的使用
我们都知道浏览器中可以显示的内容有HTML、XML、GIF等种类繁多的文件、媒体等资源,浏览器为了区分这些资源,就需要使用mime-type
mime-type是网络资源的媒体类型,Nginx作为web服务器,也需要能够识别前端请求的资源类型
在Nginx的配置文件中,默认有以下两行配置
include mime.types;
default_type application/octet-stream;
default_type指令用于配置Nginx响应前端请求默认的mime-type类型
语法 | default_type mime-type; |
---|---|
默认值 | default_type text/plain; |
位置 | http、server、location |
在default_type之前还有一句include mime.types
,include之前我们已经介绍过,相当于把mime.types文件中mime类型与相关类型文件的文件后缀名的对应关系加入到当前的配置文件中
请求某些接口的时候需要返回指定的文本字符串或者JSON字符串,如果逻辑非常简单或者是固定的字符串,那么可以使用Nginx快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用,并且响应性能非常快
location /get_text {# 这里也可以设置成text/plaindefault_type text/html;return 200 "This is nginx's text";
}location /get_json{default_type application/json;return 200 '{"name":"TOM","age":18}';
}
3.3.2 自定义服务日志
Nginx中日志的类型分access.log、error.log两种类型
-
access.log:记录用户所有的访问请求
-
error.log:记录Nginx本身运行时的错误信息,不会记录用户的访问请求
Nginx服务器支持对服务日志的格式、大小、输出等进行设置,需要使用到两个指令,分别是access_log和log_format指令
3.3.2.1 access_log指令
access_log指令用于设置用户访问日志的相关属性
语法 | 默认值 | 位置 |
---|---|---|
access_log path [format[buffer=size]] | access_log logs/access.log combined; | http、server、location |
中括号 []
在Nginx配置语法中用于表示可选参数。如果一个参数被放在中括号内,意味着这个参数是可选的,可以根据需要选择是否提供
嵌套中括号的使用是为了清晰地表示参数之间的依赖关系和可选性,具体来说:
- 外层中括号
[format[buffer=size]]
表示format
和buffer=size
是可选的 - 内层中括号
[buffer=size]
表示buffer=size
只有在format
已经被指定的情况下才是可选的
3.3.2.2 log_format指令
log_format指令用于指定日志的输出格式
语法 | 默认值 | 位置 |
---|---|---|
log_format name [escape=default|json|none] string…; | log_format combined “…”; | http |
默认的access_log指令和默认的log_format指令如下
#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;
3.3.3 sendfile指令
sendfile指令用于设置Nginx服务器是否使用sendfile()传输文件,该属性可以大大提高Nginx处理静态资源的性能
语法 | 默认值 | 位置 |
---|---|---|
sendfile on|off; | sendfile on; | http、server、location |
3.3.4 keepalive_timeout指令
keepalive_timeout指令用于设置长连接的超时时间
为什么要使用keepalive呢,我们都知道HTTP是一种无状态协议,客户端向服务端发送一个TCP请求,服务端响应完毕后断开连接
如果客户端向服务端发送多个请求,每个请求都需要重新创建一次连接,效率相对来说比较多,使用keepalive模式,可以告诉服务器端在处理完一个请求后保持这个TCP连接的打开状态,若接收到来自这个客户端的其他请求,服务端就会利用这个未被关闭的连接,而不需要重新创建一个新连接,提升效率
但是这个连接也不能一直保持,这样的话,连接如果过多,也会是服务端的性能下降,这个时候就需要我们进行设置其的超时时间
语法 | 默认值 | 位置 |
---|---|---|
keepalive_timeout time; | keepalive_timeout 65s; | http、server、location |
3.3.5 keepalive_requests指令
keepalive_requests指令用于设置一个keep-alive连接使用的次数
语法 | 默认值 | 位置 |
---|---|---|
keepalive_requests number; | keepalive_requests 100; | http、server、location |
4. Nginx基础配置实战
视频教程:01-Nginx基础配置实例需求分析
4.1 需求分析
我们已经对Nginx服务器配置文件的结构和涉及的基本指令有了基本了解。通过合理配置基本指令,我们可以让一台Nginx服务器正常工作,提供基本的web服务器功能
接下来我们将通过一个比较完整和简单的基础配置实例来巩固下前面所学习的指令及其配置,需求如下:
将访问URL中的127.0.0.1改成你的IP地址
访问URL | 对应文件 |
---|---|
http://127.0.0.1:8081/server1/location1 | index_server1_location1.html |
http://127.0.0.1:8081/server1/location2 | index_server1_location2.html |
http://127.0.0.1:8082/server2/location1 | index_server2_location1.html |
http://127.0.0.1:8082/server2/location2 | index_server2_location2.html |
- 如果访问的资源不存在,返回自定义的404页面
- 将/server1和/server2的配置使用不同的配置文件分割,将两个配置文件放到/home/www/conf目录下,使用include指令进行合并,同时为/server1和/server2分别创建一个访问日志文件
4.2 准备工作
我们需要提前创建好对应的目录,准备好相应的的文件,整体的目录结构如下
tree /home/www
/home/www
├── conf
│ ├── server1.conf
│ └── server2.conf
├── script.sh
└── web
├── 404.html
├── server1
│ ├── location1
│ │ └── index_server1_location1.html
│ ├── location2
│ │ └── index_server1_location2.html
│ └── logs
│ └── access.log
└── server2
├── location1
│ └── index_server2_location1.html
├── location2
│ └── index_server2_location2.html
└── logs
└── access.log
4.2.1 创建www用户
我们创建一个新的www用户,并为www用户设置密码
sudo useradd www
sudo passwd www
默认情况下useradd
命令会为用户自动创建一个家目录(/home/www
)
4.2.2 执行创建目录和创建文件的脚本
在/home/www
目录下创建一个名为script.sh
的脚本文件
touch /home/www/script.sh
使用vim编辑器打开脚本文件,将以下内容粘贴到script.sh脚本文件中(可以不用先创建脚本文件,直接使用vim编辑器打开脚本文件,如果文件不存在vim编辑器会自动创建)
记得将127.0.0.1改成你的服务器的IP地址(第113行和第138行)
#!/bin/bashmkdir -p /home/www/web/server1/location1
mkdir -p /home/www/web/server1/location2
mkdir -p /home/www/web/server1/logs
touch /home/www/web/server1/logs/access.log
mkdir -p /home/www/web/server2/location1
mkdir -p /home/www/web/server2/location2
mkdir -p /home/www/web/server2/logs
touch /home/www/web/server2/logs/access.log
mkdir -p /home/www/confecho '<!DOCTYPE html>
<html>
<head><title>Server1 Location1</title>
</head>
<body><h1>Welcome to Server1 Location1</h1>
</body>
</html>' > /home/www/web/server1/location1/index_server1_location1.htmlecho '<!DOCTYPE html>
<html>
<head><title>Server1 Location2</title>
</head>
<body><h1>Welcome to Server1 Location2</h1>
</body>
</html>' > /home/www/web/server1/location2/index_server1_location2.htmlecho '<!DOCTYPE html>
<html>
<head><title>Server2 Location1</title>
</head>
<body><h1>Welcome to Server2 Location1</h1>
</body>
</html>' > /home/www/web/server2/location1/index_server2_location1.htmlecho '<!DOCTYPE html>
<html>
<head><title>Server2 Location2</title>
</head>
<body><h1>Welcome to Server2 Location2</h1>
</body>
</html>' > /home/www/web/server2/location2/index_server2_location2.htmlecho '<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>404 - Page Not Found</title><style>body {font-family: Arial, sans-serif;background-color: #f4f4f4;color: #333;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;}.container {text-align: center;background: #fff;padding: 2rem;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}h1 {color: #e74c3c;font-size: 4rem;margin-bottom: 1rem;}p {font-size: 1.2rem;margin-bottom: 2rem;}a {display: inline-block;padding: 10px 20px;background-color: #3498db;color: #fff;text-decoration: none;border-radius: 5px;transition: background-color 0.3s ease;}a:hover {background-color: #2980b9;}</style>
</head>
<body><div class="container"><h1>404</h1><p>Oops! The page you are looking for does not exist.</p><a href="/">Go Back Home</a></div>
</body>
</html>
' > /home/www/web/404.htmlecho 'server {# 配置监听端口和主机名称listen 8081;server_name 127.0.0.1;# 配置请求处理日志存放路径access_log /home/www/web/server1/logs/access.log server1;# 配置错误页面error_page 404 /404.html;# 配置处理/server1/location1请求的locationlocation /server1/location1 {root /home/www/web;index index_server1_location1.html;}# 配置处理/server1/location2请求的locationlocation /server1/location2 {root /home/www/web;index index_server1_location2.html;}# 配置错误页面转向location = /404.html {root /home/www/web;index 404.html;}
}' > /home/www/conf/server1.confecho 'server {# 配置监听端口和主机名称listen 8082;server_name 127.0.0.1;# 配置请求处理日志存放路径access_log /home/www/web/server2/logs/access.log server2;# 配置错误页面,对404.html做了定向配置error_page 404 /404.html;# 配置处理/server2/location1请求的locationlocation /server2/location1 {root /home/www/myweb;index index_server2_location1.html;}# 配置处理/server2/location2请求的locationlocation /server2/location2 {root /home/www/web;index index_server2_location2.html;}# 配置错误页面转向location = /404.html {root /home/www/web;index 404.html;}
}
' > /home/www/conf/server2.conf
接着为脚本文件赋予执行权限
chmod +x /home/www/script.sh
运行以下指令运行脚本
/home/www/script.sh
4.3 修改nginx的配置文件
在nginx的配置文件(nginx.conf)的http模块中添加以下内容
# 配置请求处理日志格式
log_format server1 '==========Server1 access log==========';
log_format server2 '==========Server2 access log==========';include /home/www/conf/*.conf;
4.4 开放防火墙端口
- 如果你使用的是云服务器,在安全组中放行 8081 端口 和 8082 端口
- 如果你安装了宝塔,除了在安全组中放行 8081 端口 和 8082 端口,可能还要在宝塔中放行 8081 端口 和 8082 端口
4.5 访问测试
浏览器访问以下网址,将127.0.0.1改成你的服务器的IP地址
http://127.0.0.1:8081/server1/location1/
浏览器访问以下网址,将127.0.0.1改成你的服务器的IP地址
http://127.0.0.1:8081/server1/location3/
相关文章:

Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)
文章目录 1. Nginx目录结构分析1.1 conf目录1.2 html目录1.3 logs目录1.4 sbin目录 2. Nginx的启用方式和停止方式2.1 信号控制2.1.1 信号2.1.2 调用命令 2.2 命令行控制2.2.1 基础操作类2.2.2 配置测试类2.2.3 进程控制类2.2.4 路径与文件类2.2.5 高级配置类 3. Nginx配置文件…...

Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线
在 Kafka 的消息处理体系中,数据的可靠性和高可用性是至关重要的目标。而 ISR(In-Sync Replicas,同步副本)机制作为 Kafka 实现这一目标的关键技术,在消息复制、故障容错等方面发挥着核心作用。接下来,我们…...

移动安全Android——客户端静态安全
一、反编译保护 测试工具 Jadx GitHub - skylot/jadx: Dex to Java decompiler PKID [下载]PKID-APP查壳工具-Android安全-看雪-安全社区|安全招聘|kanxue.com 测试流程 (1)通过Jadx对客户端APK文件进行反编译,观察是否进行代码混淆 &…...
LeetCode 1524. 和为奇数的子数组数目
好的!让我们详细解释 LeetCode 1524. 和为奇数的子数组数目 这道题的思路和解法。 题目: https://leetcode.cn/problems/number-of-sub-arrays-with-odd-sum/description/ 题目分析 问题描述: 给定一个整数数组 arr,返回其中和…...

Redis最佳实践——安全与稳定性保障之连接池管理详解
Redis 在电商应用的连接池管理全面详解 一、连接池核心原理与架构 1. 连接池工作模型 #mermaid-svg-G7I3ukCljlJZAXaA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G7I3ukCljlJZAXaA .error-icon{fill:#552222;}…...

核心机制三:连接管理(三次握手)
核心机制一:确认应答 > 实现可靠传输的核心 接受方给发送方返回"应答报文"(ack) 1)发送方能够感知到对方是否收到 2)如果对方没有收到,发送方采取措施 序号按照字节编排 (连续递增) 确认序号按照收到数据的最后一个字节序号 1 核心机制二:超时重传 > 产生丢包…...
HarmonyOS DevEco Testing入门教程
一、DevEco Testing体系架构 分层测试框架 单元测试层:支持JS/TS/ArkTS语言的JUnit风格测试 UI测试层:基于XCTest框架扩展的视觉化测试工具 云测平台:集成华为云真机调试实验室 核心测试能力 分布式测试引擎:支持跨设备协同测…...

记录一次apisix上cros配置跨域失败的问题
安全要求不允许跨域请求,但是业务侧由于涉及多个域名,并且需要共享cookie,所以需要配置跨域。 在apisix上配置了cors如下。 结果安全漏扫还是识别到了跨域请求的漏洞。 调试了cors.lua的插件脚本,发现apisix上是如果不在allowOri…...
Spring Data Redis 实战指南
Spring Data Redis 核心特性 Spring Data Redis 是基于 Redis 的 NoSQL 内存数据结构存储解决方案,为 Spring 应用程序提供与 Redis 交互的高级抽象层。其核心架构设计体现了对现代应用需求的深度适配,主要技术特性可归纳为以下维度: 数据结构支持体系 作为多模型数据存储…...

服务器数据恢复—EMC存储raid5阵列故障导致上层应用崩了的数据恢复案例
服务器存储数据恢复环境: EMC某型号存储中有一组由8块硬盘组建的raid5磁盘阵列。 服务器存储故障: raid5阵列中有2块硬盘离线,存储不可用,上层应用崩了。 服务器存储数据恢复过程: 1、将存储中的所有硬盘编号后取出&a…...

如何保护网络免受零日漏洞攻击?
零日漏洞(Zero-Day Vulnerability)是指软件或系统中尚未被厂商发现或修补的安全漏洞。这个名称中的“零日”意味着,从漏洞被发现到厂商发布修复补丁的时间是零天,也就是说,黑客可以利用这个漏洞进行攻击,而…...

Python打卡训练营-Day13-不平衡数据的处理
浙大疏锦行 知识点: 不平衡数据集的处理策略:过采样、修改权重、修改阈值交叉验证代码 过采样 过采样一般包含2种做法:随机采样和SMOTE 过采样是把少的类别补充和多的类别一样多,欠采样是把多的类别减少和少的类别一样 一般都是缺…...
【专题】神经网络期末复习资料(题库)
神经网络期末复习资料(题库) 链接:https://blog.csdn.net/Pqf18064375973/article/details/148332887?sharetypeblogdetail&sharerId148332887&sharereferPC&sharesourcePqf18064375973&sharefrommp_from_link 【测试】 Th…...

2.qml使用c++
目录 1.概述2.注册方式3. 分类①枚举类②工具类③数据类④资源类②视图类 1.概述 qml是用来干嘛的? 当然是提高UI开发效率的 为什么要混合C? 因为qml无法处理密集型数据逻辑 而加入c则兼顾了性能 达到11>2 总结就是 qml 开发UI, C 实现逻辑 而js的用…...
【数据结构】字符串操作整理(C++)
1. 字符串长度与容量 size() / length() 定义:返回字符串的当前长度(字符数)。用法: string s "hello"; cout << s.size(); // 输出:5提示:size() 和 length() 功能完全相同࿰…...
PostgreSQL的扩展 dblink
PostgreSQL的扩展 dblink dblink 是 PostgreSQL 的一个核心扩展,允许在当前数据库中访问其他 PostgreSQL 数据库的数据,实现跨数据库查询功能。 一、dblink 扩展安装与启用 1. 安装扩展 -- 使用超级用户安装 CREATE EXTENSION dblink;2. 验证安装 -…...

c++5月31日笔记
题目:水龙头 时间限制:C/C 语言 1000MS;其他语言 3000MS 内存限制:C/C 语言 65536KB;其他语言 589824KB 题目描述: 小明在 0 时刻(初始时刻)将一个空桶放置在漏水的水龙头下。已知桶…...

Python打卡训练营Day41
DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化:调整一个批次的分布,常用与图像数据特征图:只有卷积操作输出的才叫特征图调度器:直接修改基础学习率 卷积操作常见流程如下: 1. 输入 → 卷积层 →…...
【Java进阶】图像处理:从基础概念掌握实际操作
一、核心概念:BufferedImage - 图像的画布与数据载体 在Java图像处理的世界里,BufferedImage是当之无愧的核心。你可以将它想象成一块内存中的画布,所有的像素数据、颜色模型以及图像的宽度、高度等信息都存储在其中。 BufferedImage继承自…...

JAVA网络编程——socket套接字的介绍下(详细)
目录 前言 1.TCP 套接字编程 与 UDP 数据报套接字的区别 2.TCP流套接字编程 API 介绍 TCP回显式服务器 Scanner 的多种使用方式 PrintWriter 的多种使用方式 TCP客户端 3. TCP 服务器中引入多线程 结尾 前言 各位读者大家好,今天笔者继续更新socket套接字的下半部分…...
Apache SeaTunnel 引擎深度解析:原理、技术与高效实践
Apache SeaTunnel 作为新一代高性能分布式数据集成平台,其核心引擎设计融合了现代大数据处理架构的精髓。 Apache SeaTunnel引擎通过分布式架构革新、精细化资源控制及企业级可靠性设计,显著提升了数据集成管道的执行效率与运维体验。其模块化设计允许用…...
深入理解 Maven 循环依赖问题及其解决方案
在 Java 开发领域,Maven 作为主流构建工具极大简化了依赖管理和项目构建。然而**循环依赖(circular dependency)**问题仍是常见挑战,轻则导致构建失败,重则引发类加载异常和系统架构混乱。 本文将从根源分析循环依赖的…...
pytest中的元类思想与实战应用
在Python编程世界里,元类是一种强大而高级的特性,它能在类定义阶段深度定制类的创建与行为。而pytest作为热门的测试框架,虽然没有直接使用元类,但在设计机制上,却暗含了许多与元类思想相通的地方。接下来,…...
前端生成UUID
UUID(Universally Unique Identifier)是一种在分布式系统中广泛使用的标识符,具有全球唯一性。在前端开发中,生成可靠的UUID对于数据追踪、会话管理、缓存键生成等场景至关重要。接下来将深入探讨UUID的实现原理、前端生成方案及最佳实践。 一、UUID标准与版本 1. UUID结构…...
玩客云WS1608控制LED灯的颜色
玩客云WS1608控制LED灯的颜色 玩客云设备有个红、绿、蓝三色led灯,在刷入armbian系统以后,这个灯的颜色就会显示异常,往往是一直显示红色。 如果要自动动手调整led灯的颜色,控制命令如下(需要root用户执行࿰…...

实验三 企业网络搭建及应用
实验三 企业网络搭建及应用 一、实验目的 1.掌握企业网络组建方法。 2.掌握企业网中常用网络技术配置方法。 二、实验描述 某企业设有销售部、市场部、技术部和财务部四个部门。公司内部网络使用二层交换机作为用户的接入设备。为了使网络更加稳定可靠,公司决定…...

顶会新热门:机器学习可解释性
🧀机器学习模型的可解释性一直是研究的热点和挑战之一,同样也是近两年各大顶会的投稿热门。 🧀这是因为模型的决策过程不仅需要高准确性,还需要能被我们理解,不然我们很难将它迁移到其它的问题中,也很难进…...
ReactJS 中的 JSX工作原理
文章目录 前言✅ 1. JSX 是什么?🔧 2. 编译后的样子(核心机制)🧱 3. React.createElement 做了什么?🧠 4. JSX 与组件的关系🔄 5. JSX 到真实 DOM 的过程📘 6. JSX 与 Fr…...

《STL--stack 和 queue 的使用及其底层实现》
引言: 上次我们学习了容器list的使用及其底层实现,相对来说是比较复杂的,今天我们要学习的适配器stack和queue与list相比就简单很多了,下面我们就开始今天的学习: 一:stack(后进先出ÿ…...
ArcGIS Pro 3.4 二次开发 - 地理处理
环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 地理处理1 通用1.1 如何执行模型工具1.2 设置地理处理范围环境1.3 在 Geoprocessing 窗格中打开脚本工具对话框1.4 打开特定工具的地理处理工具窗格1.5 获取地理处理项目项1.6 阻止通过GP创建的特征类自动添加到地图中1.7 GPExecut…...