Nginx架构

Nginx架构


常见的问题

多个server_name中虚拟主机读取的优先级

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

示例配置文件:

server {
    listen       80;
    server_name  testserver1 www.diwuqingrou.cn;
    location / {
        root    /usr/share/nginx/html/name1;
        index  index.html index.htm;
    }
    error_page   500 502 503 504 404  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       80;
    server_name  testserver2 www.diwuqingrou.cn;
    location / {
        root   /usr/share/nginx/html/name2;
        index  index.html index.htm;
    }
    error_page   500 502 503 504 404  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
server {
    listen       80;
    server_name  testserver3 www.diwuqingrou.cn;
    location / {
        root   /usr/share/nginx/html/name3;
        index  index.html index.htm;
    }
    error_page   500 502 503 504 404  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Nginx会使用最先读取到的那个配置文件,这里会访问server1,若是删除server1则会访问server2.

location匹配优先级

  • = 进行普通字符精确匹配,也就是完全匹配(lv1)
  • ^~ 表示普通字符匹配,使用前缀匹配 (lv2)
  • ~ \ ~* 表示执行一个正则匹配() (lv3)
server {
    listen       80;
    server_name  localhost ;
    root   /usr/share/nginx/html;
    #匹配 =,精确匹配
    location = /user1/ {
        rewrite ^(.*)$ /user1/index.html break;
    }
    #匹配一个正则
    location ~ /user.* {
        rewrite ^(.*)$ /user2/index.html break;
    }
    #匹配开头
    location ^~ /user {
        rewrite ^(.*)$ /user3/index.html break;
    }
    
    error_page   500 502 503 504 404  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

当我们访问/user1时,优先匹配 user1,注释user1,再访问时,则会匹配到user3,注释user3,最后才会匹配到user2.

try_files 的使用

按顺序检查文件是否存在

server {
    listen       80;
    server_name  localhost;
    location / {
        root /usr/share/nginx/html;
        try_files $uri  $uri/ @java_page;
    }
    
    location @java_page{
        proxy_pass http://127.0.0.1:8080/;
    }
    error_page   500 502 503 504 404  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

首先判断/usr/share/nginx/html u r i / u s r / s h a r e / n g i n x / h t m l uri 是否存在,若不存在,则判断/usr/share/nginx/html uri/存不存在,若都不存在则访问http://127.0.0.1:8080/。

alias和root的区别

 location /images/png/ {
        root /usr/share/nginx/html;
 }

若请求http://localhost/images/png/web.png,则实际上请求的是/usr/share/nginx/html/images/png/web.png。

 location /images/png/ {
        alias /usr/share/nginx/html;
 }

若请求http://localhost/images/png/web.png,则实际上请求的是/usr/share/nginx/html/web.png。

传递用户的真实IP

当用户请求后端经过多层代理时,在第一层代理设置参数set x_real_ip=$remote_addr,然后在后端服务这里获取这个 $x_real_ip,这样就能获取到经过多层代理后的用户IP。

Nginx常见的错误码

  • 413 request entity too large (用户上传文件限制)
  • 502 bad gateway(后端服务无响应)
  • 504 gateway time-out(后端服务执行超时)

Nginx的性能优化

  1. 性能优化考虑点

    • 当前系统结构瓶颈

      观察指标,压力测试

    • 了解业务模式

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

    • 性能与安全

  2. 压力测试工具apache bench

  3. 系统与Nginx性能优化

    • 网络
    • 系统
    • 服务
    • 程序
    • 数据库,底层服务

具体的设置:

  1. 文件句柄
    1. 修改系统的nofile,即修改配置文件
    2. 修改nginx进程的,设置worker_rlimit_nofile
  2. CPU亲和
    1. 设置worker_processes
    2. 设置worker_cpu_affinity

user  nginx;
worker_processes  16;
#worker_cpu_affinity 0000000000000010 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000;
#worker_cpu_affinity 1010101010101010 0101010101010101;
worker_cpu_affinity auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

worker_rlimit_nofile 35535;

events {
    use epoll;
    worker_connections  10240;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #######
    #Charset
    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" "$request_uri"';

    access_log  /var/log/nginx/access.log  main;
    
    #######
    #Core modlue
    sendfile        on;
    #tcp_nopush     on;
    #tcp_nodeny     on;
    keepalive_timeout  65;
    
    ########
    #Gzip module
    gzip  on;
    gzip_disable "MSIE [1-6]\.";  
    gzip_http_version 1.1; 
    
    ########
    #Virtal Server
    include /etc/nginx/conf.d/*.conf;
}

Nginx的安全控制

常见的恶意行为

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

  • 可以使用基础的防盗链
  • secure_link_module
  • access_module

常见的应用层攻击手段

  • 暴力破解
  • SQL注入
  • 文件上传
  • XSS

Nginx防攻击策略

Nginx+LUA的安全waf防火墙

发布了55 篇原创文章 · 获赞 6 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/liver_life/article/details/99223932