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

文章目录

  • [1. Nginx目录结构分析](#1. Nginx目录结构分析)
    • [1.1 conf目录](#1.1 conf目录)
    • [1.2 html目录](#1.2 html目录)
    • [1.3 logs目录](#1.3 logs目录)
    • [1.4 sbin目录](#1.4 sbin目录)
  • [2. Nginx的启用方式和停止方式](#2. Nginx的启用方式和停止方式)
    • [2.1 信号控制](#2.1 信号控制)
      • [2.1.1 信号](#2.1.1 信号)
      • [2.1.2 调用命令](#2.1.2 调用命令)
    • [2.2 命令行控制](#2.2 命令行控制)
      • [2.2.1 基础操作类](#2.2.1 基础操作类)
      • [2.2.2 配置测试类](#2.2.2 配置测试类)
      • [2.2.3 进程控制类](#2.2.3 进程控制类)
      • [2.2.4 路径与文件类](#2.2.4 路径与文件类)
      • [2.2.5 高级配置类](#2.2.5 高级配置类)
  • [3. Nginx配置文件(nginx.conf)的结构](#3. Nginx配置文件(nginx.conf)的结构)
    • [3.1 全局块](#3.1 全局块)
      • [3.1.1 user指令](#3.1.1 user指令)
      • [3.1.2 work_process指令](#3.1.2 work_process指令)
      • [3.1.3 daemon指令](#3.1.3 daemon指令)
      • [3.1.4 pid指令](#3.1.4 pid指令)
      • [3.1.5 error_log指令](#3.1.5 error_log指令)
      • [3.1.6 include指令](#3.1.6 include指令)
    • [3.2 events块](#3.2 events块)
      • [3.2.1 accept_mutex指令](#3.2.1 accept_mutex指令)
      • [3.2.2 multi_accept指令](#3.2.2 multi_accept指令)
      • [3.2.3 worker_connections指令](#3.2.3 worker_connections指令)
      • [3.2.4 use指令](#3.2.4 use指令)
    • [3.3 http块](#3.3 http块)
      • [3.3.1 自定义mime-type指令](#3.3.1 自定义mime-type指令)
      • [3.3.2 自定义服务日志](#3.3.2 自定义服务日志)
        • [3.3.2.1 access_log指令](#3.3.2.1 access_log指令)
        • [3.3.2.2 log_format指令](#3.3.2.2 log_format指令)
      • [3.3.3 sendfile指令](#3.3.3 sendfile指令)
      • [3.3.4 keepalive_timeout指令](#3.3.4 keepalive_timeout指令)
      • [3.3.5 keepalive_requests指令](#3.3.5 keepalive_requests指令)
  • [4. Nginx基础配置实战](#4. Nginx基础配置实战)
    • [4.1 需求分析](#4.1 需求分析)
    • [4.2 准备工作](#4.2 准备工作)
      • [4.2.1 创建www用户](#4.2.1 创建www用户)
      • [4.2.2 执行创建目录和创建文件的脚本](#4.2.2 执行创建目录和创建文件的脚本)
    • [4.3 修改nginx的配置文件](#4.3 修改nginx的配置文件)
    • [4.4 开放防火墙端口](#4.4 开放防火墙端口)
    • [4.5 访问测试](#4.5 访问测试)

如果想了解更多与Nginx相关的内容,可以查看Nginx专栏中的文章: Nginx

视频教程:14-Nginx的目录结构分析

1. Nginx目录结构分析

在使用Nginx之前,我们先分析Nginx的目录结构,重点关注conf、html、logs、sbin四个目录

properties 复制代码
/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命令可以查看到如下内容

bash 复制代码
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服务将立即关闭

bash 复制代码
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进程不再接收新的请求,等所有请求处理完后,在把进程都关闭掉

bash 复制代码
kill -QUIT PID

kill -TERM `/www/server/nginx/logs/nginx.pid`

示例三:发送HUP信号给master进程,master进程会控制旧的work进程不再接收新的请求,等处理完请求后将旧的work进程关闭掉,然后根据nginx的配置文件重新启动新的work进程

bash 复制代码
kill -HUP PID

kill -TERM `cat /www/server/nginx/logs/nginx.pid`

示例四:发送USR1信号给master进程,告诉Nginx重新开启日志文件

bash 复制代码
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进程,让其处理完请求后再进行关闭

bash 复制代码
kill -USR2 PID
kill -USR2 `cat /www/server/nginx/logs/nginx.pid`
bash 复制代码
kill -QUIT PID
kill -QUIT `cat /www/server/nginx/logs/nginx.pid.oldbin`

示例六:发送WINCH信号给master进程,让master进程控制不让所有的work进程再接收新的请求,请求处理完后关闭work进程,注意master进程不会被关闭掉

bash 复制代码
kill -WINCH PID
kill -WINCH `cat /www/server/nginx/logs/nginx.pid`

2.2 命令行控制

此方式是通过Nginx安装目录下的sbin下的可执行文件nginx来控制Nginx状态,我们可以通过nginx -h来查看都有哪些参数可以用

bash 复制代码
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的版本号

    bash 复制代码
    nginx -v  # 输出: nginx version: nginx/1.28.0
  • -V显示完整版本信息(含编译参数),用于排查环境配置问题

    bash 复制代码
    nginx -V  # 输出: 编译选项(如 --prefix=/www/server/nginx)

2.2.2 配置测试类

  • -t测试配置语法,不修改服务状

    bash 复制代码
    nginx -t  # 输出: 语法是否正确(如 "test is successful")
  • -T测试配置并输出完整配置内容,用于调试复杂配置

    bash 复制代码
    nginx -T  # 输出当前生效的完整配置(覆盖默认配置)

2.2.3 进程控制类

  • -s signal向master进程发送信号

    bash 复制代码
    nginx -s reload  # 重新加载配置(热更新)
    nginx -s stop    # 强制停止服务(立即关闭)
    nginx -s quit    # 优雅停止服务(等待请求处理完)
    nginx -s reopen  # 重启日志文件(用于日志切割)

2.2.4 路径与文件类

  • -e filename指定错误日志文件路径

    bash 复制代码
    nginx -e /var/log/nginx/error.log  # 自定义错误日志位置
  • -c filename指定配置文件路径 (配置文件的默认路径为conf/nginx.conf

    bash 复制代码
    nginx -c /etc/nginx/custom.conf  # 使用自定义配置文件

2.2.5 高级配置类

  • -g directives在命令行中设置全局指令 (覆盖配置文件中的 nginx.conf 部分)

    bash 复制代码
    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块)
properties 复制代码
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指令

bash 复制代码
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的配置文件中,默认有以下两行配置

properties 复制代码
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快速实现,这样就不用编写程序响应请求了,可以减少服务器资源占用,并且响应性能非常快

properties 复制代码
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指令如下

properties 复制代码
#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 准备工作

我们需要提前创建好对应的目录,准备好相应的的文件,整体的目录结构如下

bash 复制代码
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用户设置密码

bash 复制代码
sudo useradd www
bash 复制代码
sudo passwd www

默认情况下useradd命令会为用户自动创建一个家目录(/home/www

4.2.2 执行创建目录和创建文件的脚本

/home/www目录下创建一个名为script.sh的脚本文件

bash 复制代码
touch /home/www/script.sh

使用vim编辑器打开脚本文件,将以下内容粘贴到script.sh脚本文件中(可以不用先创建脚本文件,直接使用vim编辑器打开脚本文件,如果文件不存在vim编辑器会自动创建)

记得将127.0.0.1改成你的服务器的IP地址(第113行和第138行)

bash 复制代码
#!/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

接着为脚本文件赋予执行权限

bash 复制代码
chmod +x /home/www/script.sh

运行以下指令运行脚本

bash 复制代码
/home/www/script.sh

4.3 修改nginx的配置文件

在nginx的配置文件(nginx.conf)的http模块中添加以下内容

nginx 复制代码
# 配置请求处理日志格式
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地址

url 复制代码
http://127.0.0.1:8081/server1/location1/

浏览器访问以下网址,将127.0.0.1改成你的服务器的IP地址

url 复制代码
http://127.0.0.1:8081/server1/location3/
相关推荐
qq_290606273 分钟前
debian12.9或ubuntu,vagrant离线安装插件vagrant-libvirt
linux·ubuntu·vagrant
MR_Colorful30 分钟前
DOCKER使用记录
运维·docker·容器
m0_694845571 小时前
云服务器如何自动更新系统并保持安全?
运维·服务器·安全·云计算
穷人小水滴1 小时前
在 Android 设备上写代码 (Termux, code-server)
android·linux·visual studio code
开开心心_Every2 小时前
功能丰富的PDF处理免费软件推荐
运维·笔记·qt·智能手机·pdf·音视频·ruby
dessler2 小时前
Web服务器-Tomcat
linux·运维·tomcat
禾仔仔2 小时前
RISC-V特权模式及切换
linux·risc-v
好名字更能让你们记住我3 小时前
Linux多线程(六)之线程控制4【线程ID及进程地址空间布局】
linux·运维·服务器·开发语言·jvm·c++·centos
神一样的老师4 小时前
CFTel:一种基于云雾自动化的鲁棒且可扩展的远程机器人架构
运维·自动化
code monkey.4 小时前
【寻找Linux的奥秘】第九章:自定义SHELL
linux·shell·c/c++