Nginx基础篇(Nginx目录结构分析、Nginx的启用方式和停止方式、Nginx配置文件nginx.conf文件的结构、Nginx基础配置实战)

news2025/6/2 12:11:55

文章目录

  • 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,获取方式有两个

  1. 通过ps -ef | grep nginx指令获取

  2. 通过/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_mutexon,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 支持多种事件处理模块,最常用的是:

  1. select:这是最基础的模块,但它在大规模并发连接下效率较低,因为它的时间复杂度是 O(n)
  2. poll:比 select 有所改进,但在大量并发连接下仍然效率不高
  3. kqueue:这是在 BSD 系统上可用的模块,它非常高效,尤其是在高并发环境下
  4. epoll:这是在 Linux 系统上可用的模块,它也非常高效,尤其是在处理大量并发连接时
  5. /dev/poll:这是 Solaris 系统上的模块
  6. 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]] 表示 formatbuffer=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/location1index_server1_location1.html
http://127.0.0.1:8081/server1/location2index_server1_location2.html
http://127.0.0.1:8082/server2/location1index_server2_location1.html
http://127.0.0.1:8082/server2/location2index_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 开放防火墙端口

  1. 如果你使用的是云服务器,在安全组中放行 8081 端口 和 8082 端口
  2. 如果你安装了宝塔,除了在安全组中放行 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/

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2394212.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kafka 的 ISR 机制深度解析:保障数据可靠性的核心防线

在 Kafka 的消息处理体系中&#xff0c;数据的可靠性和高可用性是至关重要的目标。而 ISR&#xff08;In-Sync Replicas&#xff0c;同步副本&#xff09;机制作为 Kafka 实现这一目标的关键技术&#xff0c;在消息复制、故障容错等方面发挥着核心作用。接下来&#xff0c;我们…

移动安全Android——客户端静态安全

一、反编译保护 测试工具 Jadx GitHub - skylot/jadx: Dex to Java decompiler PKID [下载]PKID-APP查壳工具-Android安全-看雪-安全社区|安全招聘|kanxue.com 测试流程 &#xff08;1&#xff09;通过Jadx对客户端APK文件进行反编译&#xff0c;观察是否进行代码混淆 &…

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 核心机制二:超时重传 > 产生丢包…

记录一次apisix上cros配置跨域失败的问题

安全要求不允许跨域请求&#xff0c;但是业务侧由于涉及多个域名&#xff0c;并且需要共享cookie&#xff0c;所以需要配置跨域。 在apisix上配置了cors如下。 结果安全漏扫还是识别到了跨域请求的漏洞。 调试了cors.lua的插件脚本&#xff0c;发现apisix上是如果不在allowOri…

服务器数据恢复—EMC存储raid5阵列故障导致上层应用崩了的数据恢复案例

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

如何保护网络免受零日漏洞攻击?

零日漏洞&#xff08;Zero-Day Vulnerability&#xff09;是指软件或系统中尚未被厂商发现或修补的安全漏洞。这个名称中的“零日”意味着&#xff0c;从漏洞被发现到厂商发布修复补丁的时间是零天&#xff0c;也就是说&#xff0c;黑客可以利用这个漏洞进行攻击&#xff0c;而…

Python打卡训练营-Day13-不平衡数据的处理

浙大疏锦行 知识点&#xff1a; 不平衡数据集的处理策略&#xff1a;过采样、修改权重、修改阈值交叉验证代码 过采样 过采样一般包含2种做法&#xff1a;随机采样和SMOTE 过采样是把少的类别补充和多的类别一样多&#xff0c;欠采样是把多的类别减少和少的类别一样 一般都是缺…

2.qml使用c++

目录 1.概述2.注册方式3. 分类①枚举类②工具类③数据类④资源类②视图类 1.概述 qml是用来干嘛的&#xff1f; 当然是提高UI开发效率的 为什么要混合C&#xff1f; 因为qml无法处理密集型数据逻辑 而加入c则兼顾了性能 达到11>2 总结就是 qml 开发UI, C 实现逻辑 而js的用…

c++5月31日笔记

题目&#xff1a;水龙头 时间限制&#xff1a;C/C 语言 1000MS&#xff1b;其他语言 3000MS 内存限制&#xff1a;C/C 语言 65536KB&#xff1b;其他语言 589824KB 题目描述&#xff1a; 小明在 0 时刻&#xff08;初始时刻&#xff09;将一个空桶放置在漏水的水龙头下。已知桶…

Python打卡训练营Day41

DAY 41 简单CNN 知识回顾 数据增强卷积神经网络定义的写法batch归一化&#xff1a;调整一个批次的分布&#xff0c;常用与图像数据特征图&#xff1a;只有卷积操作输出的才叫特征图调度器&#xff1a;直接修改基础学习率 卷积操作常见流程如下&#xff1a; 1. 输入 → 卷积层 →…

JAVA网络编程——socket套接字的介绍下(详细)

目录 前言 1.TCP 套接字编程 与 UDP 数据报套接字的区别 2.TCP流套接字编程 API 介绍 TCP回显式服务器 Scanner 的多种使用方式 PrintWriter 的多种使用方式 TCP客户端 3. TCP 服务器中引入多线程 结尾 前言 各位读者大家好,今天笔者继续更新socket套接字的下半部分…

实验三 企业网络搭建及应用

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

顶会新热门:机器学习可解释性

&#x1f9c0;机器学习模型的可解释性一直是研究的热点和挑战之一&#xff0c;同样也是近两年各大顶会的投稿热门。 &#x1f9c0;这是因为模型的决策过程不仅需要高准确性&#xff0c;还需要能被我们理解&#xff0c;不然我们很难将它迁移到其它的问题中&#xff0c;也很难进…

《STL--stack 和 queue 的使用及其底层实现》

引言&#xff1a; 上次我们学习了容器list的使用及其底层实现&#xff0c;相对来说是比较复杂的&#xff0c;今天我们要学习的适配器stack和queue与list相比就简单很多了&#xff0c;下面我们就开始今天的学习&#xff1a; 一&#xff1a;stack&#xff08;后进先出&#xff…

基于springboot的医护人员排班系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

CRISPR-Cas系统的小型化研究进展-文献精读137

Progress in the miniaturization of CRISPR-Cas systems CRISPR-Cas系统的小型化研究进展 摘要 CRISPR-Cas基因编辑技术由于其简便性和高效性&#xff0c;已被广泛应用于生物学、医学、农学等领域的基础与应用研究。目前广泛使用的Cas核酸酶均具有较大的分子量&#xff08;通…

利用python工具you-get下载网页的视频文件

有时候我们可能在一个网站看到一个视频&#xff08;比如B站&#xff09;&#xff0c;想下载&#xff0c;但是页面没有下载视频的按钮。这时候&#xff0c;我们可以借助python工具you-get来实现下载功能。下面简要说下步骤 &#xff08;一&#xff09;因为使用的是python工具&a…

【stm32开发板】单片机最小系统原理图设计

一、批量添加网络标签 可以选择浮动工具中的N&#xff0c;单独为引脚添加网络标签。 当芯片引脚非常多的时候&#xff0c;选中芯片&#xff0c;右键选择扇出网络标签/非连接标识 按住ctrl键即可选中多个引脚 点击将引脚名称填入网络名 就完成了引脚标签的批量添加 二、电源引…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.2 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.2 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用。 dataframe<-data.frame( Surfacec(74,64,60,92…