搜索
首页后端开发php教程关于Nginx的架构

关于Nginx的架构

May 07, 2018 am 10:51 AM
nginx关于架构

Nginx-架构篇

一、Nginx常见问题

1. 相同server_name多个虚拟主机优先级访问

# 三个配置文件:

# testserver1:
server_name testserver1 www.rona1do.top;
root /opt/app/code1;

# testserver2:
server_name testserver2 www.rona1do.top;
root /opt/app/code2;

# testserver3:
server_name testserver3 www.rona1do.top;
root /opt/app/code3;
配置上述相同server_name的三个虚拟主机,会先访问testserver1,访问的优先级是按照服务器的读取顺序,即文件名的排序。

2. location匹配优先级

  • =:进行普通字符精确匹配,也就是完全匹配

  • ^~:表示普通字符匹配,使用前缀匹配

  • ~  ~ :表示执行一个正则匹配(加不区分大小写)

上述优先级自上而下优先级降低,前两个匹配是精确匹配,匹配到以后就不再往下找,正则匹配匹配到相应的字符串也会继续往下寻找是否有更精确的匹配。

3. Nginx的try_files的使用

按顺序检查文件是否存在
# 先检查对应的url地址下的文件存不存在,如果不存在找/index.php,类似于重定向
location / {
    try_file $uri /index.php;
}

4. Nginx的alias和root区别

  • root

location /request_path/image/ {
    root /local_path/image/;
}
# 请求:http://www.rona1do.top/request_path/image/cat.png
# 查询: /local_path/image/request_path_image/cat.png
  • alias

location /request_path/image/ {
    alias /local_path/image/;
}
# 请求:http://www.rona1do.top/request_path/image/cat.png
# 查询: /local_path/image/cat.png

5. 用什么样的方法传递用户的真实IP地址

  • 在有代理的情况下,remote_addr获取的是代理的ip,不是用户的ip

  • x-forwarded-for容易被篡改

通用解决办法: 可以跟第一级代理协商,设置头信息x_real_ip记录用户的ip
set x_real_ip=$remote_addr

6. Nginx中常见错误码

  • 413:request entity too large

    • 用户上传文件限制:client_max_body_size

  • 502:bad gateway

    • 后端服务无响应

  • 504:gateway time-out

    • 后端服务超时

二、Nginx性能优化

1. 性能优化考虑点

  • 当前系统结构瓶颈

    • 观察指标(top查看状态、日志等)、压力测试

  • 了解业务模式

    • 接口业务类型,系统层次化结构

  • 性能与安全

    • 配置防火墙太过于注重安全,会降低性能

2. ab接口压力测试工具

  1. 安装

  • yum install httpd-tools

  • 使用

    • ab -n 2000 -c 2 http://127.0.0.1/

    • -n:总的请求数

    • -c:并发数

    • -k:是否开启长连接

    3. 系统与Nginx性能优化

    1. 文件句柄

    • LinuxUnix一起皆文件,文件句柄就是一个索引

  • 设置方式

    - 系统全局性修改、用户局部性修改、进程局部性修改
  • 系统全局性修改 和 用户局部性修改:
    配置文件:/etc/security/limits.conf
    # root:root用户
    root soft nofile 65535
    # hard 强制限制、soft 超过会发送提醒(邮件等),不限制
    root hard nofile 65535
    # *:所有用户
    *     soft nofile 65535
    *     hard nofile 65535
    进程局部性修改
    配置文件:/etc/nginx/nginx.conf
    # 针对nginx进程进行设置
    worker_rlimit_nofile 35535;

    4. CPU的亲和

    CPU亲和:将进程/线程与cpu绑定,最直观的好处就是提高了cpu cache的命中率,从而减少内存访问损耗,提高程序的速度。
    • 物理CPU数量:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l

    • CPU核心:cat /proc/cpuinfo | grep "cpu cores" | uniq

    • 核心和进程使用率:先按top,再按1

    # /etc/nginx/nginx.conf
    
    # nginx建议数量跟cpu核心数保持一致
    worker_processes 2;
    # 配置cpu亲和
    worker_cpu_affinity 0000000000000001 0000000000000010
    # 与上一行等价,自动对应(Nginx1.9版本以上)
    worker_cpu_affinity auto

    查看Nginx的cpu绑定情况:
    ps -eo pid,args,psr | grep [n]ginx

    5. Nginx通用配置优化

    # nginx服务使用nginx用户(最好不要使用root用户)
    user nginx;
    # cpu亲和(最好跟核心数保持一致)
    worker_processes 2;
    worker_cpu_affinity auto;
    
    # error的日志级别设置为warn
    error_log  /var/log/nginx/error.log warn; 
    pid        /var/run/nginx.pid;
    
    # 文件句柄对于进程间的限制(建议1w以上)
    worker_rlimit_nofile 35535;
    
    # 事件驱动器
    events {
        use epoll;
        # 限制每一个worker_processes进程可以处理多少个连接
        worker_connections  10240;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        
        #字符集(服务端响应发送的报文字符集)
        charset utf-8;
        
        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;
    
        keepalive_timeout  65;
    
        # gzip压缩(对于IE6或以下版本对于gzip压缩支持不是很好)
        gzip  on;
        # IE6或以下不进行压缩(兼容)
        gzip_disable "MSIE [1-6]\.";
        gzip_http_version 1.1;
        
        include /etc/nginx/conf.d/*.conf;
    }

    三、Nginx安全

    1. 常见的恶意行为

    • 爬虫行为和恶意抓取、资源盗用

      • 基础防盗链功能,不让恶意用户能轻易的爬取网站对外数据

      • secure_link_module,对数据安全性提高加密验证和实效性,适合如核心重要数据

      • acces_module,对后台、部分用户服务的数据提供IP防控

    2. 常见的攻击手段

    • 后台密码撞库,通过猜测密码字典不断对后台系统尝试性登录,获取后台登录密码

      • 后台登录密码复杂度

      • access_module,对后台提供IP防控

      • 预警机制(一个IP在一段时间内重复不断请求等)

    3. 文件上传漏洞

    利用一些可以上传的接口将恶意代码植入到服务器中,再通过url去访问以执行代码
    • 例:http://www.rona1do.top/upload...(Nginx将1.jpg作为php代码执行)

    # 文件上传漏洞解决办法
    location ^~ /upload {
        root /opt/app/images;
        if ($request_file ~* (.*)\.php){
            return 403;
        }
    }

    4. SQL注入

    利用未过滤/未审核用户输入的攻击方法,让应用运行本不应该运行的SQL代码
    • Nginx+LUA配置WAF防火墙防止SQL注入

    图片描述

    • ngx_lua_waf 下载地址

    使用waf步骤:

    1. git clone https://github.com/loveshell/ngx_lua_waf.git

    2. cd ngx_lua_waf

    3. mv ngx_lua_waf /etc/nginx/waf

    4. vim /etc/nginx/waf/conf.lua,修改RulePath为对应路径(/etc/nginx/waf/wafconf)

    5. vim /etc/nginx/waf/wafconf/post,加入一行,\sor\s+,放sql注入的正则

    6. 集成waf:

    # /etc/nginx/nginx.conf
    lua_package_path "/etc/nginx/waf/?.lua";
    lua_shared_dict limit 10m;
    init_by_lua_file /etc/nginx/waf/init.lua;
    access_by_lua_file /etc/nginx/waf/waf.lua
    1. reload Nginx

    5. 复杂的访问攻击中CC攻击

    • waf/conf.lua配置文件中打开防cc攻击配置项

      • CCDeny="on"

      • CCrate="100/60" #每60秒100次请求

    四、Nginx总结

    1. 定义Nginx在服务体系中的角色

    • 静态资源服务

    • 图片描述

    • 代理服务

    • 图片描述

    • 动静分离

  • 设计评估

    • LVS、keepalive、syslog、Fastcgi

    • 用户权限、日志目录存放

    • CPU、内存、硬盘

    • 硬件

    • 系统

    • 关联服务

  • 配置注意事项

    • 合理配置

    • 了解原理(HTTP、操作系统...)

    • 关注日志

    相关推荐:

    nginx架构与实现

    以上是关于Nginx的架构的详细内容。更多信息请关注PHP中文网其他相关文章!

    声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    如何计算PHP多维数组的元素总数?如何计算PHP多维数组的元素总数?May 15, 2025 pm 09:00 PM

    计算PHP多维数组的元素总数可以使用递归或迭代方法。1.递归方法通过遍历数组并递归处理嵌套数组来计数。2.迭代方法使用栈来模拟递归,避免深度问题。3.array_walk_recursive函数也能实现,但需手动计数。

    PHP中do-while循环有什么特点?PHP中do-while循环有什么特点?May 15, 2025 pm 08:57 PM

    在PHP中,do-while循环的特点是保证循环体至少执行一次,然后再根据条件决定是否继续循环。1)它在条件检查之前执行循环体,适合需要确保操作至少执行一次的场景,如用户输入验证和菜单系统。2)然而,do-while循环的语法可能导致新手困惑,且可能增加不必要的性能开销。

    PHP中如何哈希字符串?PHP中如何哈希字符串?May 15, 2025 pm 08:54 PM

    在PHP中高效地哈希字符串可以使用以下方法:1.使用md5函数进行快速哈希,但不适合密码存储。2.使用sha256函数提高安全性。3.使用password_hash函数处理密码,提供最高安全性和便捷性。

    PHP中如何实现数组滑动窗口?PHP中如何实现数组滑动窗口?May 15, 2025 pm 08:51 PM

    在PHP中实现数组滑动窗口可以通过函数slidingWindow和slidingWindowAverage来完成。1.使用slidingWindow函数可以将数组分割成固定大小的子数组。2.使用slidingWindowAverage函数可以在每个窗口内计算平均值。3.对于实时数据流,可以使用ReactPHP进行异步处理和异常值检测。

    PHP中__clone方法怎么用?PHP中__clone方法怎么用?May 15, 2025 pm 08:48 PM

    PHP中的__clone方法用于在对象克隆时进行自定义操作。使用clone关键字克隆对象时,如果对象有__clone方法,会自动调用该方法,允许在克隆过程中进行定制化处理,如重置引用类型属性以确保克隆对象的独立性。

    PHP中goto语句如何使用?PHP中goto语句如何使用?May 15, 2025 pm 08:45 PM

    在PHP中,goto语句用于无条件跳转到程序中的特定标签。1)它可以简化复杂嵌套循环或条件语句的处理,但2)使用goto可能导致代码难以理解和维护,3)建议优先使用结构化控制语句。整体而言,goto应谨慎使用,并遵循最佳实践以确保代码的可读性和可维护性。

    PHP中如何实现数据统计?PHP中如何实现数据统计?May 15, 2025 pm 08:42 PM

    在PHP中,数据统计可以通过使用内置函数、自定义函数和第三方库来实现。1)使用内置函数如array_sum()和count()进行基本统计。2)编写自定义函数计算中位数等复杂统计。3)利用PHP-ML库进行高级统计分析。通过这些方法,可以高效地进行数据统计。

    PHP中如何使用匿名函数?PHP中如何使用匿名函数?May 15, 2025 pm 08:39 PM

    是的,PHP中的匿名函数是指没有名字的函数。它们可以作为参数传递给其他函数,并作为函数的返回值,使代码更加灵活和高效。使用匿名函数时需要注意作用域和性能问题。

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    Video Face Swap

    Video Face Swap

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    热工具

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

    mPDF

    mPDF

    mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

    Atom编辑器mac版下载

    Atom编辑器mac版下载

    最流行的的开源编辑器

    螳螂BT

    螳螂BT

    Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

    ZendStudio 13.5.1 Mac

    ZendStudio 13.5.1 Mac

    功能强大的PHP集成开发环境