Nginx 性能优化

一,概述


1.

1)了解是什么架构

数据库是否主从,拆库;四层还是七层负载均衡;web是nginx还是tomacat等;php还是python还是tomacat;是否有nfs,是否 有radis


2) 了解业务模式

比如有抢购,每个web有7个服务,2台web服务器备用,只需要在备用的服务器上加上高峰期用的服务进程就可以


3) 系统层次的结构

比如在每一个环节配置负载均衡


4) 性能和安全

比如设计防火墙会对性能产生影响,注意权衡


2,从哪些方面入手

osi七层模型

1,硬件:nginx代理(cpu) nginx做静态自由元存储(磁盘) PHP动态资源(cpu 内存)    买什么服务器前考虑好它的用处

2,网络:带宽   是否有丢包(crc和缓冲溢出导致丢包)延迟 

3,系统:文件描述符

4,应用:服务与服务之间的连接(长连接,短连接)

5,服务:静态资源优化(开缓存)


二,压力测试工具


1)下载工具

[root@web03 wordpress]# yum install -y httpd-tools


2)配置hosts

[root@web03 ~]# cat /etc/hosts

...
10.0.0.9 linux.proxy.com


3)测试nginx访问静态资源

[root@web03 ~]# cat /etc/nginx/conf.d/linux.try.com.conf

server {

    listen 80;

    server_name linux.try.com;

    location / {

        root /code/try;

        try_files $uri $uri/ @java;

}

    location @java {

        proxy_pass http://10.0.0.9:8080;

  }

}


[root@web03 ~]# mkdir /code/try

[root@web03 ~]# echo "ab_test_nginx" > /code/try/index.html


本地配置hosts

[root@web03 ~]# cat /etc/hosts 
......
10.0.0.9 linux.try.com

访问:

[root@web03 ~]# ab -n 10000 -c 200 http://linux.try.com/

...

Time taken for tests:  0.871 seconds

...

处理的时间是0.871秒


4)测试tomcat访问静态资源

[root@web03 ~]# rm -rf /code/try/


访问


[root@web03 ~]# ab -n 10000 -c 200 http://linux.try.com/

...

Time taken for tests: 7.665 seconds


5) 测试httpd处理静态请求的时间

[root@web03 ~]# yum install -y httpd

[root@web03 ~]# echo "ab_test_httpd" > /var/www/html/index.html

[root@web03 ~]# systemctl stop nginx

[root@web03 ~]# systemctl start httpd


访问


[root@web03 ~]# ab -n 10000 -c 200 http://10.0.0.9/

...

Time taken for tests: 1.938 seconds

....


 ##

由此得出,处理静态资源时,nginx要优于其他web服务,其中必tomcat快很多,比httpd服务快一点点




三, 系统性能优化


1,查看文件句柄上数

查看设置的文件句柄数

[root@web03 ~]# ulimit -n

65535


查看一个进程的文件句柄数

[root@web03 ~]# ps -ef | grep nginx

root      21143      1  0 19:17 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf

...

[root@web03 ~]# lsof -p 21143 | wc -l

32


查看服务器一共打开的文件句柄数

[root@web03 ~]# lsof | wc -l

6917


2,设置文件句柄数

[root@web03 ~]# vim /etc/security/limits.conf (翻到最下面)

....

* - nofile 65535


#1.系统全局的文件句柄数

*     -       nofile      65535      

*     soft   nofile     65535

*    hard   nofile     65535


* 代表所有用户

soft  如果达到设置的文件句柄数 ,只提示

hard  如果达到设置的文件句柄数 ,直接限制

nofile  指定打开文件描述符的数量


#2.用户局部限制的文件句柄数

www - nofile 65535

www soft nofile 65535

www hard nofile 65535


#3. 配置服务本身的限制描述符

[root@web03 ~]# vim /etc/nginx/nginx.conf

user www;

worker_processes  1;

worker_rlimit_nofile 65535;

....


3.内核参数优化

查看内核参数

[root@web03 ~]# sysctl -a


查看配置过的内核参数

[root@web03 ~]# sysctl -p


配置过的内核参数在以下文件

[root@web03 ~]# vim /etc/sysctl.conf

net.ipv4.tcp_fin_timeout = 2

net.ipv4.tcp_tw_reuse = 1           time_wait端口复用

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_keepalive_time = 600

net.ipv4.ip_local_port_range = 4000    65000

net.ipv4.tcp_max_syn_backlog = 16384

net.ipv4.tcp_max_tw_buckets = 36000

net.ipv4.route.gc_timeout = 100

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.core.somaxconn = 16384

net.core.netdev_max_backlog = 16384

net.ipv4.tcp_max_orphans = 16384

net.ipv4.ip_forward = 1                                           开启内核转发


4,影响性能的指标

1)网络


2)系统

硬件

系统的复制内存


3)服务

连接优化 -- 长连接;请求优化

针对业务去设置


4)程序    --      php-fpm.d/php.ini

5)数据库




四, 代理服务优化


服务器 --->     LB   ->   web   --> php 每一步都打开长连接


1,浏览器到 LB 

[root@lb01 ~]# vim /etc/nginx/nginx.conf

....

keepalive_timeout 65;


keepalive_timeout 65     只要不为0,都可以



2,LB到web

[root@lb01 conf.d]# vim linux.wp.com.conf

server {

   upstream wp_web {

    server 172.16.1.7;

    server 172.16.1.9;

    keepalive 32;         

}

listen 443 ssl;

    server_name linux.wp.com;

    ssl_certificate /etc/nginx/ssl_key/server.crt;

    ssl_certificate_key /etc/nginx/ssl_key/server.key;

    location / {

        proxy_pass http://wp_web;

        proxy_http_version 1.1;

        proxy_connect_timeout 60s;  如果下面proxy_params包含可不配置

        include /etc/nginx/proxy_params;

        fastcgi_param HTTPS on;

    }

}

server {

    listen 80;

    server_name linux.wp.com;

    #rewrite (.*) https://$server_name$1;

    return 302 https://$server_name$request_uri;


nginx优化如下

[root@lb01 code]# vim /etc/nginx/proxy_params

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 60s;

proxy_read_timeout 60s;

proxy_send_timeout 60s;

proxy_buffering on;

proxy_buffer_size 128k;

proxy_buffers 8 128k;

proxy_http_version 1.1;


注意:长连接配置不要和/etc/nginx/proxy_params重复,会报错


3,配置web服务代理到PHP保持长连接

[root@web03 ~]# vim /etc/nginx/conf.d/wordpress.conf

upstream php {

    server 127.0.0.1:9000;

    keepalive 16;

}

server {

    listen 80;

    server_name linux.wp.com;

    root /code/wordpress;

    location / {

    index index.php;

  }

    location ~* \.php$ {

    fastcgi_pass php;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    fastcgi_keep_conn on;

    #fastcgi_connect_time 60s;

    include fastcgi_params;

    if (!-e $request_filename) {

      rewrite (.*) /1.jpg;

}

}

}


4,配置python长连接

location ~* \.py$ {

uwsgi_pass php;

uwsgi_socket_keepalive on;#开启后端长连接

uwsgi_send_timeout 60s;#长连接超时时间

}




五、静态资源优化


1,静态资源缓存

[root@lb01 ~]# vim /etc/nginx/mime.types


1)浏览器是否走缓存到流程

1)浏览器请求服务器,会先查看浏览器的expires和ccache-control(值一样)检查缓存时间是否过期,如果没有,走缓存;

2)如果没有设置expires和cache-control,浏览器会读取浏览器会去读取if-none-match,与服务器删过的etag对比,如果值一致,走缓存

3)如果etag值不一致,浏览器会去读取if_modified_since,与服务器上的last_modified对比,如果一致走缓存


2)缓存时间设置

[root@web01 ~]# vim /etc/nginx/conf.d/linux.huancun.com.conf

server {

    listen 80;

    server_name linux.huancun.com;

    location ~* \.(jpg|png) {

          root /code/huancun;

          expires 7d;

}

}


[root@web01 ~]# mkdir -p /code/huancun

[root@web01 ~]# cd /code/huancun/

[root@web01 huancun]# ll

-rw-r--r-- 1 root root 13467 2020-09-15 03:25 1.jpg

[root@web01 huancun]# systemctl restart nginx


配置hosts访问


3)设置不走缓存

1)使用浏览器无痕模式

2)选中浏览器的disable cache


如下配置

[root@web01 huancun]# vim /etc/nginx/conf.d/linux.huancun.com.conf

server {

    listen 80;

    server_name linux.huancun.com;

    location ~* \.(jpg|png) {

          root /code/huancun;

          add_header Cache-Control no-store;

          add_header Pragma no-cache;

}

}


[root@web01 huancun]# systemctl restart nginx


访问


2.静态资源读取优化

[root@web01 ~]# vim /etc/nginx/nginx.conf



1)文件高效读取配置语法

sendfile on;


2)高效传输(传输效率高,适合大文件,多个一起传输)

tcp_nopush on


3)长连接传输(适合小文件,来一个传一个,传输效率快)

tcp_nodelay on


3,静态资源压缩

1)静态资源压缩语法

#gzip开启传输压缩

gzip on


#gzip压缩哪些文件

gzip_types text/html           (/etc/nginx/mime.types里找)


#压缩的级别,加快传输速度,值越小越快,但是压缩本身需要时间

gzip_comp_level 5            #一般给3-5级别


#压缩时使用的协议版本

gzip_http_version 1.1;


2)压缩传输实例

[root@web01 ~]# vim /etc/nginx/conf.d/gizp.com.conf

server {

    listen 80;

    server_name linux.gzip.com;

    root   /code/gzip;


    location ~* \.(jpg|png) {

        gzip on;

        gzip_types image/jpeg image/png;

        gzip_comp_level 3;

        gzip_http_version 1.1;


        location ~* \.txt {

        gzip on;

        gzip_types text/plain;

        gzip_comp_level 1;

        gzip_http_version 1.1;

  }

}

}


[root@web01 ~]# cd /code/gzip/

[root@web01 gzip]# ll

-rw-r--r-- 1 root root 21252 2020-09-15 04:30 2.txt

-rw-r--r-- 1 root root  4487 2020-09-15 04:30 index.html


访问


对比源文件大小:

[root@web01 gzip]# ll -h

-rw-r--r-- 1 root root  21K 2020-09-15 04:30 2.jpg

-rw-r--r-- 1 root root 5.1K 2020-09-15 04:33 2.txt




六、防资源盗链



1,配置被盗链机器

[root@web01 ~]# vim /etc/nginx/conf.d/beidl.com.conf

server {

    listen 80;

    server_name linux.beidl.com;

    location / {

        root /beidl;

        index index.html;

}

}


[root@web01 beidl]# cd /code/beidl/

[root@web01 beidl]# ll

-rw-r--r-- 1 www www 21252 2020-09-15 05:01 2.jpg


[root@web01 beidl]# systemctl restart nginx


#访问网站测试http://linux.beidl.com/1.jpg

2, 配置盗链机器

[root@web01 ~]# vim /etc/nginx/conf.d/dl.com.conf

server {

    listen 80;

    server_name linux.dl.com;

    location / {

        root /code/dl;

        index index.html;

}

}


[root@web01 dl]# vim /code/dl/index.html

   

    linux.dl.com

   


[root@web01 dl]# systemctl restart nginx


配置hosts访问


3,配置防盗链

[root@web01 dl]# vim /etc/nginx/conf.d/beidl.com.conf

server {

    listen 80;

    server_name linux.beidl.com;

    location / {

        root /code/beidl;

        index index.html;


    location ~* \.(jpg|png) {

        valid_referers none blocked linux.bdl.com;

        if ($invalid_referer) {

        return 500;

        #rewrite (.*) /4.jpg;

  }

  }

}

}


再次访问


5.允许匹配多个域名访问

[root@web01 conf.d]# vim beidl.com.conf

server {

    listen 80;

    server_name linux.beidl.com;

    location / {

        root /code/beidl;

        index index.html;

    location ~* \.(jpg|png) {

        valid_referers none blocked server_names linux.bdl.com *.baidu.com ~\.jd\.;

        if ($invalid_referer) {

        return 500;

        #rewrite (.*) /4.jpg;

  }

  }

}

}

[root@web01 conf.d]# systemctl restart nginx



6.伪造refere信息访问


[root@web01 conf.d]# vim /etc/hosts

10.0.0.7 linux.beidl.com

10.0.0.7 linu.dl.com


[root@web01 conf.d]# curl -I "http://linux.beidl.com/2.jpg"

HTTP/1.1 200 OK

Server: nginx/1.18.0

Date: Mon, 14 Sep 2020 21:59:07 GMT

Content-Type: image/jpeg

Content-Length: 21252

Last-Modified: Mon, 14 Sep 2020 21:01:43 GMT

Connection: keep-alive

ETag: "5f5fda37-5304"

Accept-Ranges: bytes


伪造百度访问:(可以访问)

curl -I 大写的i

[root@web01 conf.d]# curl -e "https://www.baidu.com" -I "http://linux.beidl.com/2.jpg"

HTTP/1.1 200 OK

Server: nginx/1.18.0

Date: Mon, 14 Sep 2020 22:10:51 GMT

Content-Type: image/jpeg

Content-Length: 21252

Last-Modified: Mon, 14 Sep 2020 21:01:43 GMT

Connection: keep-alive

ETag: "5f5fda37-5304"

Accept-Ranges: bytes


伪造谷歌访问,返回500

[root@web01 conf.d]# curl -e "https://www.google.com" -I "http://linux.beidl.com/2.jpg"

HTTP/1.1 500 Internal Server Error

Server: nginx/1.18.0

Date: Mon, 14 Sep 2020 22:11:59 GMT

Content-Type: text/html

Content-Length: 177

Connection: close


伪造京东访问(可以访问)

[root@web01 conf.d]# curl -e "https://www.jd.com" -I "http://linux.beidl.com/2.jpg"

HTTP/1.1 200 OK

Server: nginx/1.18.0

Date: Mon, 14 Sep 2020 22:13:24 GMT

Content-Type: image/jpeg

Content-Length: 21252

Last-Modified: Mon, 14 Sep 2020 21:01:43 GMT

Connection: keep-alive

ETag: "5f5fda37-5304"

Accept-Ranges: bytes



七、允许跨域访问


--不同网站,不同协议,不同端口之间互相可以访问为跨域


1,配置被跨域:

[root@web01 conf.d]# vim /etc/nginx/conf.d/beiky.conf

server {

    listen 80;

    server_name linux.beiky.com;

    root /code/beiky;

    location / {

        index index.html;

    }

}


[root@web01 code]# mkdir -p /code/beiky

[root@web01 code]# echo "我是被跨域的网站" > /code/beiky/index.html

[root@web01 code]# chown -R www.www /code/


[root@web01 code]# systemctl restart nginx


2,配置跨域的网站

[root@web01 ~]# vim /etc/nginx/conf.d/kuayu.conf

server {

    listen 80;

    server_name linux.kuayu.com;

    root /code/kuayu;

    location / {

        index index.html;

    }

}


[root@web01 ~]# mkdir -p /code/kuayu/

[root@web01 ~]# chown -R www.www /code/

[root@web01 ~]# vim /code/kuayu/index.html

       

        测试ajax和跨域访问

       

       

               

测试跨域访问

       

[root@web01 ~]# systemctl restart nginx

配置hosts访问


3,配置允许跨域访问

[root@web01 ~]# vim /etc/nginx/conf.d/beiky.conf

server {

    listen 80;

    server_name linux.beiky.com;

    root /code/beiky;

    charset utf8;

    location / {

        index index.html;

    }

    location ~* \.html$ {

        add_header Access-Control-Allow-Origin *;

        add_header Access-Control-Allow-Methods 'GET,POST,PUT,DELETE,OPTIONS';

}

}


配置hosts 访问



八、nginx的CPU亲和



1.查看cpu状态

[root@web01 ~]# lscpu

Architecture:          x86_64

CPU op-mode(s):        32-bit, 64-bit

Byte Order:            Little Endian

CPU(s):                4

On-line CPU(s) list:  0-3

Thread(s) per core:    1

....


2,修改nginx的worker工作进程数

[root@web01 ~]# vim /etc/nginx/nginx.conf

worker_processes 4;


[root@web01 ~]# systemctl restart nginx


[root@web01 ~]# ps -eo pid,args,psr | grep [n]ginx

  7067 nginx: master process /usr/  2

  7068 nginx: worker process        2

  7069 nginx: worker process        2

  7070 nginx: worker process        0

  7071 nginx: worker process        1


3,配置nginx绑定工作进程绑定内核

[root@web01 ~]# vim /etc/nginx/nginx.conf

worker_processes auto;

worker_cpu_affinity auto;


[root@web01 ~]# systemctl restart nginx

[root@web01 ~]# ps -eo pid,args,psr | grep [n]ginx

  7101 nginx: master process /usr/  0

  7102 nginx: worker process        0

  7103 nginx: worker process        1

  7104 nginx: worker process        2

  7105 nginx: worker process        3



4,nginx通用优化配置

[root@web01 ~]# vim /etc/nginx/nginx.conf

user www;

worker_processes  auto;

worker_cpu_affinity auto;

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

pid        /var/run/nginx.pid;

events {

    use epoll;

    worker_connections  1024;

}

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;

    server_tokens off;           隐藏nginx版本号

    client_max_body_size 200m;

    sendfile        on;

    #tcp_nopush    on;

    tcp_nodelay    on;

    keepalive_timeout  65;

    #gzip  on;

    gzip_disable "MSIE [1-6]\.";

    gzip_http_version 1.1;

    gzip_comp_level 5;

    gzip_buffers 16 8k;

    gzip_min_length 1024;

    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript image/jpeg;

    include /etc/nginx/conf.d/*.conf;

}


5,代理通用优化配置

[root@web01 ~]# vim /etc/nginx/proxy_params

proxy_set_header Host $http_host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_connect_timeout 60s;

proxy_send_timeout 60s;

proxy_read_timeout 60s;

proxy_buffering on;

proxy_buffer_size 128k;

proxy_buffers 8 128k;

proxy_next_upstream error timeout http_500 http_502 http_503 http_504;




十、PHP服务优化



配置PHP 页面

[root@web01 ~]# vim /etc/nginx/conf.d/phpserver.conf

server {

      listen 80;

      server_name linux.phpserver.com;

      root /code/phpserver;

      location / {

          index index.php;

}

      location ~* \.php$ {

          fastcgi_pass 127.0.0.1:9000;

          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

          include fastcgi_params;

}

注意⚠️:root /code/phpserver;放在server层或者每个location都配置

配置站点:

[root@web01 ~]# mkdir -p /code/phpserver

[root@web01 ~]# cd /code/phpserver/

[root@web01 phpserver]# vim index.php

    phpinfo()

?>


[root@web01 phpserver]# chown -R www.www /code/

[root@web01 phpserver]# systemctl restart nginx


配置hosts访问


1.php.ini配置文件优化

# 错误日志设置

expose_php = Off           #关闭php版本信息

display_error = Off         #屏幕不显示错误日志(开发环境可以开启on)

error_reporting = E_ALL               #记录PHP的每个错误

log_errors = On                             #开启错误日志

error_log = /var/log/php_error.log      #错误日志写入的位置(php程序启动时候的报错)

date.timezone = Asia/Shanghai        #调整时区,默认PRC


# 文件上传设置

file_uploads = On        #允许文件上传

upload_max_filesize = 300M              #允许上传文件的最大大小

post_max_size = 300M                      #允许客户端单个POST请求发送的最大数据

max_file_uploads = 20                       #允许同时上传的文件的最大数量

memory_limit = 128M                         #每个脚本执行最大内存


# 会话共享

session.save_handler = redis

session.save_path ="tcp://172.16.1.51:6379"


# php禁止危险函数执行(取决于实际情况,需要和开发沟通)

disable_functions = chown,chmod,pfsockopen,phpinfo



2,PHP开启状态页面


[root@web01 ~]# vim /etc/php-fpm.d/www.conf

;pm.status_path = /php_status


[root@web01]# vim /etc/nginx/conf.d/phpserver.conf

server {

      listen 80;

      server_name linux.phpserver.com;

      root /code/phpserver;

      location / {

          index index.php;

}

      location ~* \.php$ {

          fastcgi_pass 127.0.0.1:9000;

          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

          include fastcgi_params;

}

location /php_status {

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        include fastcgi_params;

}
}


配置hosts 访问


pool: www

process manager:      dynamic

start time:          14/Nov/2020:08:09:04 +0800

start since:          3                              #启动了多久

accepted conn:        1                         #连接数

listen queue:        0                              #等待队列

max listen queue:    0                            #最大等待队列

listen queue len:    511                            #队列长度

idle processes:      4

active processes:    1

total processes:      5

max active processes: 1

max children reached: 0

slow requests:        0





Nginx优化总结:

1、CPU亲和、worker进程数、调整nginx进程打开的文件句柄数

2、使用Epool网络模型、调整每个worker进程的最大连接数

3、文件的高效读取sendfile、nopush

4、文件的传输实时性、nodealy

5、开启tcp长连接,以及长连接超时时间keepalived

6、开启文件传输压缩gzip

7、开启静态文件expires缓存

8、隐藏nginx版本号

9、禁止通过ip地址访问,禁止恶意域名解析,只允许域名访问

10、配置防盗链、以及跨域访问

11、防DDOS、cc攻击,限制单IP并发连接,以及http请求

12、优雅限制nginx错误页面

13、nginx加密传输https优化

14、nginx proxy_cache、fastcgi_cache、uwsgi_cache 缓存,第三方工具(squid、varnish)




PHP优化总结


#优化:

1.硬件

2.网络

3.系统

4.应用

5.服务:

        1)nginx:nginx静态

                        nginx做代理

                        nginx结合lua做安全

        2)php:php.ini 日志、session、上传文件大小

                        php-fpm.d      监听地址,调整进程数

                        php状态模块

                        PHP慢查询

你可能感兴趣的:(Nginx 性能优化)