首頁 > 後端開發 > php教程 > 關於Nginx的架構

關於Nginx的架構

不言
發布: 2023-03-25 13:20:01
原創
1633 人瀏覽過

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

  2. 使用

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

    • -n:總的請求數

    • -c:並發數字

    • -k :是否開啟長連線

3. 系統與Nginx效能最佳化

    ##檔案句柄
  1. ##LinuxUnix一起皆文件,文件句柄就是一個索引
    • #設定方式
    - 系统全局性修改、用户局部性修改、进程局部性修改
    登入後複製
  2. 系統全域性修改與使用者局部性修改:
設定檔:

/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

    <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"># /etc/nginx/nginx.conf # nginx建议数量跟cpu核心数保持一致 worker_processes 2; # 配置cpu亲和 worker_cpu_affinity 0000000000000001 0000000000000010 # 与上一行等价,自动对应(Nginx1.9版本以上) worker_cpu_affinity auto</pre><div class="contentsignin">登入後複製</div></div>

    查看Nginx的cpu綁定狀況:

ps -eo pid, args,psr | grep [n]ginx
5. Nginx通用設定最佳化<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;"># 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 &amp;#39;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &amp;#39; &amp;#39;$status $body_bytes_sent &quot;$http_referer&quot; &amp;#39; &amp;#39;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&amp;#39;; access_log /var/log/nginx/access.log main; # 静态资源的处理 sendfile on; #tcp_nopush on; keepalive_timeout 65; # gzip压缩(对于IE6或以下版本对于gzip压缩支持不是很好) gzip on; # IE6或以下不进行压缩(兼容) gzip_disable &quot;MSIE [1-6]\.&quot;; gzip_http_version 1.1; include /etc/nginx/conf.d/*.conf; }</pre><div class="contentsignin">登入後複製</div></div>三、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注入

關於Nginx的架構

  • 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在服务体系中的角色

  • 静态资源服务

  • 關於Nginx的架構

  • 代理服务

  • 關於Nginx的架構

  • 动静分离

  • 设计评估

    • LVS、keepalive、syslog、Fastcgi

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

    • CPU、内存、硬盘

    • 硬件

    • 系统

    • 关联服务

  • 配置注意事项

    • 合理配置

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

    • 关注日志

    相关推荐:

    nginx架构与实现

    以上是關於Nginx的架構的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:php.cn
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    作者最新文章
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板