• nginx优化和防盗链


    nginx优化

    1.nginx隐藏版本号

    因为是一个高性能,轻量级的工具吗,更新版本速度很快,功能很强大但是BUG很多,很容易被攻破,所以需要隐藏版本号来减少服务器被攻击的威胁。

    隐藏版本号的第一步就是如何查看版本号

    curl -I 本机IP

    如何修改?

    方法一:

    http大模块修改

    修改方式:

    ​​​​​​​server_tokensoff

    方法二:修改源码文件,然后重写编译安装

    1. vim nginx.h

    然后编译安装: make && make install

    最后进入 vim nginx.conf

    1. vim /usr/local/nginx/conf/nginx.conf
    2. http {
    3. include mime.types;
    4. default_type application/octet-stream;
    5. server_tokens on;
    6. ......
    7. }

    重起服务即可

    nginx日志分割

    nginx没有自带的日志分隔功能,所以需要靠运维人员通过脚本实现日志分割

    1. 编写脚本:
    2. 按照时间来进行分隔,每天都生成一个新的日志
    3. 获取日期
    4. d=$(date +%Y-%m-%d)
    5. 找到nginx日志的存储位置
    6. dir="/usr/local/nginx/logs"
    7. 定义日志分隔
    8. logs_file='/usr/local/nginx/logs/accsee.log'
    9. logs_error='/usr/local/logs/error.log'
    10. 定义nginx的pid文件
    11. pid_file='/usr/local/nginx/run/nginx.pid'
    12. if [ ! -d "$dir" ]
    13. then
    14. mkdir -p $dir
    15. fi
    16. 移动日志并重命名
    17. mv ${logs_file} ${dir}/access_${d}.log
    18. #mv /usr/local/nginx/logs/access.log /use/local/nginx/logs/access_2.23-10-12.log
    19. mv ${logs_error} ${dir}/error_${d}.log
    20. 发送信号给nginx的主进程,让nginx重新生成一个新的日志文件
    21. kill -USR1 $(cat ${pid_file})
    22. USER1 生成一个新的日志 cat /usr/local/nginx/run/nginx.pid
    23. 日志清理 日志清理原则:业务日志一般保留30天,数据库日志保留2年,用户信息要加密且永久保存,而且高可用
    24. 若最近无重大事项,业务日志保留10天也可以,前提是申请批准
    25. find $dir -mtime +30 -exec rm -rf {} \;
    1. 设置权限
    2. chmod 777 /opt/nginxlog.sh
    3. 设置定时任务
    4. 0 1 * * * /opt/nginxlog.sh

    3.nginx网页压缩

    在Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。进行相关的配置修改,就能实现Nginx页面的压缩,达到节约带宽,提升用户访问速度

    1. gzip on;
    2. 开启压缩功
    3. gzip_min_length 1k;
    4. 如果文件大小是1k就不进行压缩处理
    5. gzip_comp_level 6;
    6. 压缩级别:压缩比率 1-9 1是速度快,压缩比最低,9是速度慢,压缩比最高,默认是1
    7. gzip_vary on;
    8. 前端的缓存也可以支持压缩
    9. gzip_types text/plain image/jpg test/css test/xml image/gif;
    10. 压缩类型

    4.nginx图片的缓存时间

    可以在日后访问时,不需要经常的向后台请求,加快访问速度

    一般都是针对静态页面,动态页面一般不设置缓存时间

    1. vim nginx.conf
    2. location ~* \.(gif|jpg|jepg|bmp|ico)$ {
    3. root html;
    4. expires 1d;
    5. }

    5.nginx连接超时

    HTTP有一个KeepAlive模式,它告诉web服务器在处理完一个请求后保持这个TCP连接的打开状态。若接收到来自同一客户端的其它请求,服务端会利用这个未被关闭的连接,而不需要再建立一个连接。


    KeepAlive 在一段时间内保持打开状态,它们会在这段时间内占用资源。占用过多就会影响性能。


    在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可设置相应的连接超时参数,实现控制连接访问时间。可以修改配置文件 nginx.conf,设置 keepalive_timeout超时。

    1. vim nginx.conf
    2. http {
    3. ......
    4. keepalive_timeout 65 180; //设置连接超时时间
    5. client_header_timeout 80;
    6. 客户端向服务端发送一个完整request header的超时间,如果客户端在80秒内没有发送一个完整的请求头,nginx将会返回408,request time out
    7. client_body_timeout 80;
    8. 客户端于服务器建立连接之后发送request body的超时时间
    9. 80秒内客户端没有发送任何内容,nginx 408 request time out
    10. ......
    11. }

    6.nginx的并发设置

    在高并发的场景下,需要nginx启用更多的进程来保证快速响应

    根据cpu的核心数,可以调整nginx的工作进程数

    1. 查看cpu核数
    2. cat /proc/cpuinfo | grep processor | wc -l

    1. vim nginx.conf
    2. #user nobody;
    3. worker_processes 1;
    4. 尽量不要超过8个,8个以上不会对性能提升,会适得其反,一般设置为cpu核数的一半

    修改一下进程数和连接数。

    worker_process 4;和 event里的 worker_connections 15000;里面的数字相乘就是一共进程数。

    二者乘积为最大并发数

    注意:别忘了修改limits.conf的文件限制

    绑定cpu:

    1. #user nobody;
    2. worker_processes 1;
    3. worker_cpu_affinity 0001 0010 0100 1000;
    4. 把进程绑定到CPU上,减少CPU的切换,提高效率
    5. }

    TIME_WAIT大量出现,改如何优化

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    time-wait是tcp连接状态的一种状态,不是报错,出现在四次挥手之后

    在time_wait这个状态下,tcp处于连接等待状态,等待有一个持续时间,http 1.1 会话保持

    1.确保可靠的关闭连接

    2.避免连接复用

    他在连接正常关闭之后,一段时间之后,它会自动消失,而且占用的资源很少,对服务器影响是有限的。

    如果太多,则进内核文件修改

    1. net.ipv4_tcp_syncookies = 1
    2. 表示SYN等待队列溢出时,启用cookies处理syn队列
    3. net.ipv4_tcp_tw_reuse = 1
    4. time_wait 状态可以重用,一个连接就占用一个端口,time_wait把所有端口占满了,新的连接请求也不会拒绝。
    5. net.ipv4_tcp_tw_recycle = 1
    6. 让time_wait 尽快回收
    7. net.ipv4_tcp_fin_timeout = 60
    8. 所有time_wait 最大生命周期60s

    nginx的内置变量:打印结果

    $remote_addr 客户端IP地址

    下载形式出现

    1. location / {
    2. root html;
    3. index index.html index.htm;
    4. return 200 "ip:$remote_addr";
    5. }

    \n后面可以追加多个

    $remote_port #显示客户端的端口号

    $url

    #显示请求的url

    /是nginx的家目录

    $host

    #显示请求的主机名

    $request_method 显示请求方法

    重要的变量配置


    proxy_set_header X-Forwarded-for $remote_addr #代理服务器设置这个变量,客户端的真实ip要发送给后端,否则代理服务器地址会被拉入黑名单。

    proxy_set_header X-Real-IP $remote_addr #客户端的真实ip,发送给后端,现在所有网站都会要求客户端请求时,加上真实ip。例如:微信,微博,B站,都会显示IP地址。
     

    nginx设置防盗链

    1. 准备两台服务器
    2. systemctl stop firewalld
    3. setenforce 0
    4. systemctl restart nginx
    5. test1是主站
    6. test2是副站
    7. vim nginx.conf
    8. server {
    9. listen 80;
    10. server_name www.abc.com;
    11. #charset koi8-r;
    12. charset utf-8;
    13. #access_log logs/host.access.log main;
    14. location / {
    15. root html;
    16. index index.html index.htm;
    17. }
    18. location ~* \.(jpg|gif)$ {
    19. root html;
    20. valid_referers none blocked *.abc.com abc.com;
    21. #valid_referers:设置信任的网站,即 abc.com
    22. #none:允许没有http_refer的请求访问资源,请求的url里面可以不包含refer,www.abc.com就可以直接访问 www.abc.com/aaa.jpg
    23. #blocked:请求网站时,前面可以不带协议(http)。
    24. if ( $valid_referer ) {
    25. rewrite ^/ http://www.sbc.com/error.png'
    26. }
    27. #如果连接资源是来自上面valid_referers定义的信任列表,$valid_referer变为true,执行重定向

    systemctl restart nginx

    vim index.html #写入内容

    域名访问一定要做映射!!!

    test2:

    同样得做映射

    访问即可

  • 相关阅读:
    error=13, Permission denied
    探索 SOCKS5 代理在跨境电商中的网络安全应用
    Win10系统无法登录Xbox live的四种解决方法
    设计模式之策略模式
    【夜读】影响一生的五个自律法则
    java易错题型(复习必看)
    Git的远程仓库
    高校教务系统登录页面JS分析——华东交通大学
    彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-模板与数据库EP02
    INSERT DESC UPDATE SELECT
  • 原文地址:https://blog.csdn.net/qq_51506982/article/details/133841686