文章目录
- 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 PID
kill -TERM `/www/server/nginx/logs/nginx.pid`
示例三:发送HUP信号给master进程,master进程会控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程
kill -HUP PID
kill -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/plain
default_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/bash
mkdir -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/conf
echo '<!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.html
echo '<!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.html
echo '<!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.html
echo '<!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.html
echo '<!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.html
echo '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请求的location
location /server1/location1 {
root /home/www/web;
index index_server1_location1.html;
}
# 配置处理/server1/location2请求的location
location /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.conf
echo '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请求的location
location /server2/location1 {
root /home/www/myweb;
index index_server2_location1.html;
}
# 配置处理/server2/location2请求的location
location /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/