从零开始的渗透测试学习(十)

Nginx

Nginx(发音为"engine-x")是一个高性能的开源Web服务器和反向代理服务器。下面是对Nginx的详细解释:

  1. Web服务器功能:Nginx旨在提供高性能、稳定性和低资源消耗的Web服务器功能。它能够处理大量并发连接并快速响应客户端请求。Nginx支持静态和动态内容的传输,并提供了强大的配置选项,使得开发人员可以灵活地配置和优化服务器。

  2. 反向代理服务器:作为反向代理服务器,Nginx可以代理来自客户端的请求,并将这些请求转发到后端服务器。通过使用反向代理,Nginx可以实现负载均衡、缓存、SSL终端和请求分发等功能。这使得Nginx成为构建可扩展和高可用性Web应用程序架构的理想选择。

  3. 事件驱动和非阻塞架构:Nginx采用事件驱动的架构模型,以及基于异步、非阻塞的处理方式。这种设计使得Nginx能够高效地处理并发连接,而无需为每个连接分配额外的线程或进程。这样,Nginx能够更好地利用系统资源,提供更好的性能和扩展性。

  4. 模块化结构:Nginx具有模块化的结构,允许用户自定义和扩展服务器功能。它提供了丰富的可选模块,如负载均衡、缓存、压缩、访问控制和安全性等。这使得Nginx能够灵活地适应各种使用场景,并满足特定需求。

  5. 高度可配置:Nginx的主要配置文件为nginx.conf,其中包含了各种配置指令和块。通过编辑配置文件,可以定制Nginx的行为,如监听端口、设置虚拟主机、配置代理和缓存规则等。Nginx还支持动态重新加载配置,无需重启整个服务器即可应用更改,这有助于减少服务中断时间。

  6. 强大的生态系统:Nginx已经成为一个庞大的开源生态系统,拥有广泛的社区支持和第三方模块。在Nginx的生态系统中,你可以找到许多有用的插件、工具和资源,用于优化性能、增加功能和解决实际问题。

Nginx的安装

在Linux系统上安装Nginx通常需要以下步骤:

  1. 安装Nginx:运行以下命令以安装Nginx。

    yum install nginx
  2. 启动Nginx服务:安装完成后,运行以下命令启动Nginx服务。

    sudo systemctl start nginx.service
  3. 验证Nginx是否运行:在浏览器中输入服务器的IP地址或域名,例如 http://服务器IP地址,你应该能够看到Nginx默认的欢迎页面。如果你无法访问,请确保防火墙没有阻止80端口。

  4. 配置Nginx(可选):Nginx的主要配置文件为/etc/nginx/nginx.conf,可以根据需要进行修改。你还可以创建Nginx的虚拟主机配置文件,用于托管多个网站或应用程序。

  5. 管理Nginx服务:你可以使用以下命令来管理Nginx服务:

    • 启动Nginx服务:sudo systemctl start nginx.service

    • 停止Nginx服务:sudo systemctl stop nginx.service

    • 重启Nginx服务:sudo systemctl restart nginx.service

    • 检查Nginx服务状态:sudo systemctl status nginx.service

    • 开机自启动 sudo systemctl enable nginx.service

Nginx配置文件

Nginx配置文件详解 - 知乎 (zhihu.com)

配置文件目录 /etc/nginx

nginx 网站根目录 /user/share/nginx

Nginx的主要配置文件是nginx.conf,它位于/etc/nginx/目录下。下面是一个简单的示例nginx.conf文件的结构和常见配置选项:

nginxCopy Codeuser nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
​
events {
    worker_connections 1024;
}
​
http {
    include /etc/nginx/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 /var/log/nginx/access.log main;
​
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
​
    keepalive_timeout 65;
​
    gzip on;
    include /etc/nginx/conf.d/*.conf;
}

在这个示例中,nginx.conf文件分为三个主要部分:userworker_processesevents是全局级别的指令;http块包含HTTP模块的相关指令;serverlocation块用于配置虚拟主机和请求路径的特定设置。

以下是一些常见的Nginx配置指令的解释:

  • user:指定Nginx工作进程的运行用户。

  • worker_processes:指定Nginx启动的工作进程数,通常设置为auto以根据系统资源自动确定。

  • error_log:指定错误日志文件的路径。

  • pid:指定Nginx主进程ID文件的路径。

  • events:配置与工作进程相关的事件模型和连接数等参数。

  • http:HTTP模块的主要配置块。

  • include:包含其他配置文件,常用于将配置模块化。

  • log_format:定义访问日志格式。

  • access_log:指定访问日志文件的路径和格式。

  • sendfile:允许使用sendfile系统调用来提高传输文件的效率。

  • tcp_nopushtcp_nodelay:优化TCP连接的参数。

  • keepalive_timeout:指定客户端和服务器之间的持久连接超时时间。

  • gzip:启用Gzip压缩输出。

详解:

# 全局参数
user nginx;              # Nginx进程运行用户
worker_processes auto;   # Nginx工作进程数,通常设置为CPU核数
error_log /var/log/nginx/error.log warn;    # 错误日志路径和日志级别
pid /run/nginx.pid;      # 进程PID保存路径
​
# 定义事件模块
events {
    worker_connections 1024;    # 每个工作进程最大并发连接数
    use epoll;                  # 使用epoll网络模型,提高性能
    multi_accept on;            # 开启支持多个连接同时建立
}
​
# 定义HTTP服务器模块
http {
    # 缓存文件目录
    client_body_temp_path /var/cache/nginx/client_temp;
    proxy_temp_path /var/cache/nginx/proxy_temp;
    fastcgi_temp_path /var/cache/nginx/fastcgi_temp;
​
    # 定义日志格式,main是默认的日志格式
    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 /var/log/nginx/access.log main;
​
    # 定义MIME类型
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
​
    # 代理参数
    proxy_connect_timeout 6s;       # 连接超时时间
    proxy_send_timeout 10s;         # 发送超时时间
    proxy_read_timeout 10s;         # 接收超时时间
    proxy_buffer_size 16k;          # 缓冲区大小
    proxy_buffers 4 32k;            # 缓冲区个数和大小
    proxy_busy_buffers_size 64k;    # 忙碌缓冲区大小
    proxy_temp_file_write_size 64k; # 代理临时文件写入大小
​
    # 启用压缩,可以提高网站访问速度
    gzip on;
    gzip_min_length 1k;                    # 最小压缩文件大小
    gzip_types text/plain text/css application/json application/javascript application/xml;
​
    # 定义HTTP服务器
    server {
        listen 80;              # 监听端口
​
        server_name example.com;    # 域名
​
        # 重定向到HTTPS,强制使用HTTPS访问
        if ($scheme != "https") {
            return 301 https://$server_name$request_uri;
        }
​
        # HTTPS服务器配置
        ssl_certificate      /etc/nginx/ssl/server.crt;    # SSL证书路径
        ssl_certificate_key  /etc/nginx/ssl/server.key;    # SSL私钥路径
​
        # SSL会话缓存参数
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
​
        # 配置代理路径
        location / {
            proxy_pass http://localhost:8080;        # 转发请求的目标地址
            proxy_set_header Host $host;             # 设置请求头中的Host字段
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                            # 设置HTTP头中的X-Forwarded-For字段,表示客户端真实IP,多个IP用逗号隔开
            proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP
        }
​
        # 配置静态文件访问路径
        location /static/ {
            alias /path/to/static/files/;   # 静态文件的目录
            expires 7d;                     # 静态文件缓存时间
            add_header Pragma public;       # 添加HTTP响应头
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }
​
        # 配置错误页面
        error_page 404 /404.html;           # 404错误页
        location = /404.html {
            internal;                       # 不接受外部访问
            root /usr/share/nginx/html;     # 404错误页文件所在目录
        }
​
        # 配置重定向
        location /old/ {
            rewrite ^/old/([^/]+) /new/$1 permanent;   # 将/old/xxx路径重定向为/new/xxx,返回301状态码
        }
    }
​
    # 其他服务配置
    # server {
    #     ...
    # }
​
    # 配置TCP负载均衡
    upstream backends {
        server backend1.example.com:8080 weight=5;  # 后端服务器地址和权重
        server backend2.example.com:8080;
        server backend3.example.com:8080 backup;   # 备用服务器
        keepalive 16;                               # 连接池大小
    }
​
    server {
        listen 80;
        server_name example.com;
​
        location / {
            proxy_pass http://backends;             # 负载均衡转发请求的目标地址
            proxy_set_header Host $host;            # 设置请求头中的Host字段
            proxy_set_header X-Real-IP $remote_addr; # 设置请求头中的X-Real-IP字段,表示客户端真实IP
        }
    }
}

通过Nginx构建静态网站

 

通过Nginx构建动态网站

lnmp

mysql

apache与nginx的区别

Apache和Nginx是两种常见的Web服务器软件,它们在设计和功能上有一些区别:

  1. 架构设计

    • Apache:采用多进程模型,每个连接都由一个单独的进程处理。每个进程相对较重,占用较多的内存资源。

    • Nginx:采用事件驱动和异步非阻塞的架构,使用少量的固定的工作线程来处理连接。这使得Nginx能够高效地处理大量并发请求,并且占用较少的系统资源。

  2. 性能

    • Nginx:由于其轻量级的架构和事件驱动模型,在处理静态文件和高并发请求方面表现更出色。在负载均衡、反向代理等场景下,Nginx通常比Apache具有更高的性能。

    • Apache:在处理动态内容和复杂的处理逻辑方面更为灵活,适合处理PHP等脚本语言。但在高并发情况下性能较Nginx稍逊一些。

  3. 配置

    • Nginx:使用基于文本的配置文件,配置语法简洁清晰,并且支持热加载配置,修改配置后无需重启服务。

    • Apache:使用基于文本的配置文件(主配置文件+各个虚拟主机配置文件),配置语法灵活复杂,支持模块化配置。修改配置后需要重启Apache服务。

  4. 生态系统

    • Apache:有丰富的插件和模块,支持各种功能扩展,如PHP、Python、SSL等。

    • Nginx:虽然生态系统相对较小,但也有一些常用的模块和第三方插件。Nginx通常与其他服务(如PHP-FPM)配合使用来提供完整的Web应用环境。

Nginx具有以下几个优势:

  1. 高并发处理能力:Nginx采用事件驱动和异步非阻塞的架构,可以高效地处理大量并发连接。它使用少量的工作线程来处理请求,每个线程能够处理多个连接,从而节省了系统资源,并且能够快速响应高负载情况下的请求。

  2. 低内存消耗:相比于传统的多进程模型的Web服务器,如Apache,Nginx的内存消耗更低。Nginx的工作进程需要较少的内存,并且这些进程的大小基本固定,不会因为连接数的增加而显著增加内存消耗。

  3. 强大的静态文件处理:Nginx在处理静态文件方面非常高效。它可以直接从磁盘上将静态文件发送给客户端,而无需将这些文件加载到内存中。这样可以节省大量的系统资源,并提高文件传输速度。

  4. 热部署和配置更新:Nginx支持动态热加载配置文件,即使在运行时也可以修改配置文件而无需重启服务器。这使得对Nginx进行配置更加灵活和方便,同时避免了服务中断。

  5. 反向代理和负载均衡:Nginx是一款优秀的反向代理服务器,可以将客户端请求转发给多个后端服务器,并平衡负载。它支持多种负载均衡算法,如轮询、IP哈希等,可以实现高可靠性和高可扩展性的应用架构。

  6. 丰富的模块和扩展性:Nginx有一个活跃的社区,提供了许多第三方模块和插件来扩展其功能。例如,可以通过安装第三方模块,将Nginx作为反向代理与其他应用程序集成,如PHP-FPM、Node.js等。

总的来说,Nginx以其高性能、低资源消耗、灵活的配置和扩展性而闻名。它适用于处理大量并发连接和静态文件服务,并且在反向代理和负载均衡等场景下表现出色。

apache 的优势

  1. 广泛支持和兼容性:Apache是最早的开源Web服务器软件之一,广泛应用于各种操作系统和平台。它与不同的操作系统(如Linux、Windows等)以及开发技术(如PHP、Python等)具有很好的兼容性,可以轻松地集成到多种环境中。

  2. 动态内容处理和模块丰富:Apache对于处理动态内容非常灵活,支持多种脚本语言和框架。它提供了丰富的模块库,可以满足各种需求,如数据库连接、身份验证、URL重写等。这使得开发人员可以方便地扩展和定制Apache的功能。

  3. 可配置性和灵活性:Apache提供了直观且易于理解的配置文件格式。它允许用户灵活地配置和定制Web服务器的行为,如虚拟主机设置、请求过滤、缓存控制等。这样可以根据具体需求进行细粒度的调整,提高了服务器的适应性和性能。

  4. 易于管理和监控:Apache提供了丰富的管理工具和监控指标,使得管理员能够轻松地管理和监控Web服务器。通过这些工具,可以实时查看服务器状态、连接数、资源使用情况等信息,以便及时做出调整和优化。

  5. 强大的Ecology和生态系统:由于Apache的广泛应用和长期发展,它拥有庞大的生态系统和活跃的社区支持。用户可以轻松地获取到各种文档资料、教程和解决方案,并与其他开源软件(如MySQL、PHP等)进行集成,形成完整的Web开发环境。

特征NGINXAPACHE
简单NGINX 的开发和创新很复杂,因为它具有复杂的架构来同时处理多个连接。Apache 很容易开发,因为它的每个进程一个连接的模型。
操作系统支持NGINX 在类 Unix 系统上运行,但对 Windows 的支持有限。Apache 兼容所有类 Unix 系统,如 Linux、BSD 等,并且完全支持 Windows。
基本架构Nginx 遵循事件驱动/单线程方法来处理客户端请求 Nginx 在一个线程中处理多个请求Apache 遵循进程驱动/多线程方法来处理客户端请求。
静态内容NGINX 可以同时运行数千个静态内容连接,速度比 Apache 快 2.5 倍。在 Apache 中,为每个请求创建一个新线程 Apache 显示静态内容的速度较慢。
动态内容NGINX 不处理动态内容。Apache 在 Web 服务器本身内处理动态内容。
交通处理NGINX 可以在流量大的情况下同时有效地处理多个客户端请求。Apache 无法同时处理多个客户端请求以及繁重的 Web 流量。
内存消耗Nginx 使用有限的硬件资源来处理客户端请求并且消耗更少的内存Apache的内存消耗更多。
用法NGINX 被开发为既是 Web 服务器又是反向代理服务器。Apache 被开发为 Web 服务器。
集中配置NGINX 有一个相对简单的配置系统。 Nginx 不允许额外的配置。Apache 中的配置系统并不是那么简单。 Apache 允许通过 .htaccess 文件在每个目录的基础上进行额外配置。
请求口译Nginx 通过 URI(统一资源标识符)来解释客户端请求。Apache 传递文件系统位置来解释客户端请求。
安全Nginx 以更小的代码库提供更好的安全性。Apache 还提供了良好的安全性,但与 Nginx 相比,它的安全性较低。此外,Apache 的代码库非常高。
功能模块NGINX 的核心版本不支持动态模块,但 NGINX plus 是 NGINX 的付费版本,支持动态模块。 模块的加载和卸载很复杂。Apache 由可以关闭/打开的动态加载模块组成。 apache中模块的加载和卸载更简单
支持NGINX 由成立于 2011 年的 NGINX, Inc 公司处理。社区支持通过 IRC(Internet 中继聊天)、邮件列表和堆栈溢出来完成。Apache 服务器由来自世界各地的用户社区处理,并由 Apache 软件基金会协调。社区支持通过 IRC、邮件列表、堆栈溢出和论坛完成。

Nginx正向代理反向代理

首先,看一张关于正向代理和反向代理的图片

在这里,用通俗易懂的方式解释一下:

 

正向代理: 正向代理服务器位于客户端和服务器之间,为了从服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端需要要进行一些正向代理的设置的。

正向代理中被代理的是客户端的请求我们平时需要访问国外的浏览器是不是很慢,比如我们要看推特,看GitHub等等。我们直接用国内的服务器无法访问国外的服务器,或者是访问很慢。所以我们需要在本地搭建一个服务器来帮助我们去访问。那这种就是正向代理。(浏览器中配置代理服务器)

img

反向代理:

反向代理,客户端对代理是无感知的,客户端不需要任何配置就可以访问,客户端将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。

那什么是反向代理呢。比如:我们访问淘宝的时候,淘宝内部肯定不是只有一台服务器,它的内部有很多台服务器,那我们进行访问的时候,因为服务器中间session不共享,那我们是不是在服务器之间访问需要频繁登录,那这个时候淘宝搭建一个过渡服务器,对我们是没有任何影响的,我们是登录一次,但是访问所有,这种情况就是 反向代理。对我们来说,客户端对代理是无感知的,客户端不需要任何配置就可以访问,我们只需要把请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。(在服务器中配置代理服务器)

img

Nginx的正向代理与反向代理详解 - 雪山飞猪 - 博客园 (cnblogs.com)​编辑

集群

单台服务器不能满足需求,需要多台服务器集群,集群就可以用反向代理

seLinux

系统管理员 一般无法通过用户 群组 其他权限 的标准访问策略来生成 精细的安全策略

强制访问控制 每个进程或资源都有一个特的安全标签 selinux 安全标签 安全上下文

selinux优势

 

所有进程和文件都会被标记 selinux策略规则定义 进程如何与文件交互 以及进程如何互相交互

精细的访问控制 普通的Linux权限规则 基于用户与组 seLinux基于所有可用信息

selinux 由系统管理员进行定义 在系统范围内强制实施

selinux 不是防病毒软件 不能替代其他安全系统

selinux状态模式

(37条消息) CentOS 7.x 重新启用SELinux,系统无法启动开机提示selunix autorelabel学习是一种能力的博客-CSDN博客

enforcing 强制 在整个系统中强制载入安全策略

permissive 宽容 会像强制模式一样 载入安全策略 不会拒绝任何操作 标记对象记录日志

disabled 禁用模式

开启selinux 方式

vim /etc/selinux/config

 

重启系统

getenforce

setenforce 0

setenforce 1

ls -Z 查看文件安全上下文

 

ps auxZ | grep httpd 查看进程的安全上下文

 

ls -Zd /root 查看目录的安全上下文

 

 

安全上下文通过:分割,最后一个字段时可选的

system_u:object_r:admin_home_t:s0 : [类别]

身份字段:角色 : 类型 :灵敏度 : 【类别】

身份字段标识该数据被哪个身份拥有

seinfo -u 列出selinux所有身份

角色 标识此数据 是进程or文件or目录

object_r 数据是文件or 目录

system_r 表示数据是进程

seinfo -r 列举出所有角色

类型

类型字段是selinux中最主要的字段,进程是否可以访问文件,主要看的是安全上下问中类型是否匹配。

seinfo -t 列出selinux中所有类型

灵敏度

灵敏度 s0 s1 s2 数值越高 灵敏度越高

类别 类别字段 不是必须有的

selinux详解:

使用 SELinux Red Hat Enterprise Linux 8 | Red Hat Customer Portal

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值