美文网首页
Nginx、PHP 相关优化

Nginx、PHP 相关优化

作者: 无味wy | 来源:发表于2023-04-09 15:57 被阅读0次

入手方面:OSI七层模型:物理层,数据链路层,网络层,传输层,会话层,表示层,应用层

1.硬件:
        1)nginx做负载均衡只需要cpu核心多一些
        2)nginx做静态资源存储,磁盘大一些
        3)nginx做动态资源代理,CPU
        4)ES,redis服务内存需要大一些
2.网络层:
        1)丢包、延迟
        2)带宽
3.系统:
        1)文件描述符
        2)端口复用
4.应用:tcp长连接
5.服务:服务的针对性优化

系统性能优化

⽂件句柄,Linux⼀切皆⽂件,⽂件句柄可以理解为就是⼀个索引,⽂件句柄会随着我们进程的调⽤频繁增加,系统默认⽂件句柄是有限制的,不能让⼀个进程⽆限的调⽤,所以我们需要限制每个进程和每个服务使⽤多⼤的⽂件句柄,⽂件句柄也是必须要调整的优化参数。

1.查看文件句柄数

#1.查看文件句柄数设置
[root@lb01 ~]# ulimit -n
65535

#2.查看打开的文件句柄数
[root@web01 ~]# lsof | wc -l
12490

#3.查看指定服务的打开文件句柄数
[root@web01 ~]# lsof -p 13592 | wc -l

2.设置文件句柄数

1)系统全局的设置
[root@web01 ~]# vim /etc/security/limits.conf
* - nofile 65535
* soft nofile 65535
* hard nofile 65535

*       #所有用户
-       #当超过设置的文件句柄数时,什么都不干
soft    #当超过设置的文件句柄数时,仅提示
hard    #当超过设置的文件句柄数时,直接限制

2)用户局部设置
[root@web01 ~]# vim /etc/security/limits.conf
root - nofile 65535
root soft nofile 65535
root hard nofile 65535

3)针对服务设置
[root@lb01 ~]# vim /etc/nginx/nginx.conf 
user  www;
worker_processes  1;
worker_rlimit_nofile 65535;

4)系统通用优化
[root@lb01 ~]# vim /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
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

#调整内核参数:让time_wait状态端⼝可以重新使⽤
[root@web01 ~]# sysctl -a #查看所有内核参数
[root@web01 ~]# sysctl -p #查看我们⼿动配置的内核参数

[root@web01 ~]# vim /etc/sysctl.conf
#重⽤time_wait状态端⼝
[root@web01 ~]# sysctl -p
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 1

代理服务优化
通常nginx作为代理服务,负责转发⽤户的请求,那么在转发的过程中建议开启HTTP⻓连接,⽤于减少握⼿次数,降低服务器损耗

1.配置用户访问负载均衡的长连接

[root@lb01 ~]# vim /etc/nginx/nginx.conf
... ...
http {
    ... ...
    keepalive_timeout  65;
    ... ...
}

2.配置负载均衡代理到web的长连接

[root@lb01 ~]# vim /etc/nginx/conf.d/keep.com.conf
upstream web {
    server 172.16.1.7:8080;
    keepalive 8;                #配置开启长连接
}

server {
    listen 80;
    server_name keep.com;

    location / {
        proxy_pass http://web;
        proxy_http_version 1.1;         #指定http协议为1.1版本
        proxy_set_header Connection "";  #清除“connection”头字段
        include proxy_params;
    }
}

3.配置web代理到php保持长连接

[root@web01 ~]# vim /etc/nginx/conf.d/wp.com.conf 
upstream php_server {
    server 127.0.0.1:9000;
}

server {
    listen 80;
    server_name wp.com;

    location / {
        root /code/wordpress;
        index index.php;
    }

    location ~* \.php$ {
        fastcgi_pass php_server;
        fastcgi_param SCRIPT_FILENAME /code/wordpress/$fastcgi_script_name;
        fastcgi_param HTTPS on;
        fastcgi_keep_conn on;  #开启⻓连接
        fastcgi_connect_timeout 60s;    #⻓连接超时时间
        include fastcgi_params;
    }
}

4.代理优化配置

[root@lb01 ~]# cat /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 8k;
proxy_buffers 8 8k;
proxy_next_upstream http_500 http_502 http_503 http_504;

静态资源优化
Nginx作为静态资源Web服务器,⽤于静态资源处理,传输⾮常的⾼效静态资源指的是⾮WEB服务器端运⾏处理⽽⽣成的⽂件
1.静态资源

#类型
图片文件: gif、png、jpg、jpeg
视频文件: mp4、avi、rmvb
其他文件: txt、xml、pdf
样式文件: css、js、html 
浏览器渲染:HTML、CSS、JS

2.静态资源缓存

1)配置缓存过期时间
#语法
#作⽤:添加Cache-Control Expires头
Syntax:  expires [modified] time;
         expires epoch | max | off;
Default: expires off;
Context: http, server, location, if in location

#配置
[root@web01 ~]# vim /etc/nginx/conf.d/cache.com.conf
server {
    listen 80;
    server_name cache.com;

    location ~* \.(png|jpg|gif)$ {
        root /code/cache;
        expires 7d;  #本地缓存过期时间7天
    }
}

2)如果配置不走缓存
1.开启无痕模式
2.开启浏览器上面的 Disable_cache
3.配置nginx关闭缓存
[root@web01 ~]# vim /etc/nginx/conf.d/cache.com.conf
server {
    listen 80;
    server_name cache.com;

    location ~* \.(png|jpg|gif)$ {
        root /code/cache;
        etag off;
        add_header Cache-Control no-store;
        add_header Pragma no-cache;
    }
}

静态资源压缩

1)静态资源压缩配置语法
#gzip传输压缩,传输前压缩,传输后解压
Syntax: gzip on | off;
Default:    gzip off;
Context:    http, server, location, if in location

#指定压缩文件的类型
Syntax: gzip_types mime-type ...;
Default:    gzip_types text/html;
Context:    http, server, location

#指定压缩的级别,压缩比例
Syntax: gzip_comp_level level;
Default:    gzip_comp_level 3;   #共1-9个级别,一般我们设置3-5
Context:    http, server, location

#gzip压缩协议版本,压缩使⽤在http哪个协议,主流选择1.1版本
Syntax: gzip_http_version 1.0 | 1.1;
Default:    gzip_http_version 1.1;
Context:    http, server, location

2)压缩配置实例
[root@web01 ~]# vim /etc/nginx/conf.d/lgzip.com.conf 
server {
    listen 80;
    server_name gzip.com;

    location ~* \.(png|jpg|gif)$ {
        root /code/cache;
        gzip on;
        gzip_types image/jpeg image/gif image/png;
        gzip_comp_level 9;
        gzip_http_version 1.1;
    }

    location ~* \.txt$ {
        root /code/cache;
        gzip on;
        gzip_types text/plain;
        gzip_comp_level 5;
    }
}

CPU亲和
CPU亲和(affinity)减少进程之间不断频繁切换,减少性能损耗,其实现原理是建CPU核⼼和Nginx⼯作进程绑 定⽅式,把每个worker进程固定到对应的cpu上执⾏,减少切换CPU的cache miss,获得更好的性能
1.查看cpu状态

1)方式1
#nginx worker进程数量,⼀定要与核⼼数保持⼀致

worker_processes    4;
worker_cpu_affinity 0001 0010 0100 1000;
worker_processes    16;
worker_cpu_affinity 0000000000000001 0000000000000010 0000000000000100 0000000000001000 ...;

2)方式2
worker_processes    2;
worker_cpu_affinity 0101 1010;

3)方式3 ---最佳绑定⽅式,修改nginx启动的work进程为⾃动。
worker_processes auto;
worker_cpu_affinity auto;

4).配置CPU亲和后
[root@web01 ~]# ps -eo pid,args,psr | grep [n]ginx
  7629 nginx: master process /usr/   3
  7630 nginx: worker process         0
  7631 nginx: worker process         1
  7632 nginx: worker process         2
  7633 nginx: worker process         3

nginx通用优化配置文件

[root@web01 ~]# cat etc/nginx/nginx.conf 
user www;                                   #nginx启动用户
worker_processes auto;                       #nginx工作进程数
worker_cpu_affinity auto;                     #开启CPU亲和
error_log /var/log/nginx/error.log warn;      #错误日志,存放路径,记录日志的级别
pid /run/nginx.pid;                         #指定pid文件位置
worker_rlimit_nofile 35535;                  #指定nginx服务的最大打开文件数

events {
    use epoll;                              #使用epoll网络模型
    worker_connections 10240;                #worker工作进程的最大连接数
}

http {
    include         mime.types;                #nginx能识别的文件类型
    default_type      application/octet-stream;   #nginx不识别的文件类型默认下载
    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"';  #指定日志格式    
                     
     #定义json格式⽇志
    log_format access_json '{"@timestamp":"$time_iso8601",'
                           '"host":"$server_addr",'
                           '"clientip":"$remote_addr",'
                           '"size":$body_bytes_sent,'
                           '"responsetime":$request_time,'
                           '"upstreamtime":"$upstream_response_time",'
                           '"upstreamhost":"$upstream_addr",'
                           '"http_host":"$host",'
                           '"url":"$uri",'
                           '"domain":"$host",'
                           '"xff":"$http_x_forwarded_for",'
                           '"referer":"$http_referer",'
                           '"status":"$status"}';

    access_log  /var/log/nginx/access.log  access_json; #指定访问日志路径,调用json日志的格式
    server_tokens off;                            #隐藏版本号
    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 4;                              #压缩的级别
    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;               #包含的配置文件
}

nginx优化总结

1、CPU亲和、worker进程数、调整nginx进程打开的文件句柄数
2、使用Epool网络模型、调整每个worker进程的最大连接数
3、文件的高效读取sendfile、nopush
4、文件的传输实时性、nodealy
5、开启tcp长连接,以及长连接超时时间keepalive_timeout
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.配置PHP页面

[root@web01 ~]# vim /etc/nginx/conf.d/php.conf
server {
    listen 80;
    server_name linux.phpserver.com;
    root /code/phpserver;
    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@web01 ~]# mkdir /code/phpserver
[root@web01 ~]# vim /code/phpserver/index.php 
<?php
    phpinfo();

2.php.ini配置文件优化

#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
#; Error handling and logging ;
#;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
expose_php = Off                        # 关闭php版本信息
display_error = Off                     # 屏幕不显示错误日志(开发环境可以开启 on)
error_reporting = E_ALL                 # 记录PHP的每个错误
log_errors = On                         # 开启错误日志
error_log = /var/log/php_error.log      # 错误日志写入的位置(程序处理代码时的错误)
date.timezone = Asia/Shanghai           # 调整时区,默认PRC

#;;;;;;;;;;;;;;;;
#; File Uploads ;
#;;;;;;;;;;;;;;;;
file_uploads = On           # 允许文件上传
upload_max_filesize = 300M  # 允许上传文件的最大大小
post_max_size = 300M        # 允许客户端单个POST请求发送的最大数据
max_file_uploads = 20       # 允许同时上传的文件的最大数量
memory_limit = 128M         # 每个脚本执行最大内存

php-fpm服务配置

1)php-fpm.conf配置优化
[root@web02 ~]# vim /etc/php-fpm.conf
[global]
;pid = /var/log/php-fpm/php-fpm.pid         #pid文件存放的位置
;error_log = /var/log/php-fpm/php-fpm.log   #错误日志存放的位置(启动时的日志)
;log_level = error                      #日志级别, alert, error, warning, notice, debug
rlimit_files = 65535                    #php-fpm进程能打开的文件句柄数
;events.mechanism = epoll               #使用epoll事件模型处理请求
include=/etc/php-fpm.d/*.conf


2)包含配置文件优化 /etc/php-fpm.d/*.conf
[root@web02 ~]# vim /etc/php-fpm.d/www.conf
[www]                          #池名称
user = www                     #进程运行的用户
group = www                    #进程运行的组
;listen = /dev/shm/php-fpm.sock #监听在本地socket文件
listen = 127.0.0.1:9000         #监听在本地tcp的9000端口
;listen.allowed_clients = 127.0.0.1 #允许访问FastCGI进程的IP,any不限制 
pm = dynamic                    #管理方式(dynamic为动态,static为静态)
pm.max_children = 512           #最大启动的php-fpm进程数(静态管理,配置dynamic时失效)
pm.start_servers = 32           #动态方式下的起始php-fpm进程数量。
pm.min_spare_servers = 32       #动态方式下的最小php-fpm进程数量。
pm.max_spare_servers = 64       #动态方式下的最大php-fpm进程数量。
pm.max_requests = 1500          #达到这个请求数,子进程会重启,如果是0那就一直接受请求
pm.process_idle_timeout = 15s;  #没有请求时多久释放一个进程
pm.status_path = /php_status    #开启php的状态页面

php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/phpfpm_error.log
php_admin_flag[log_errors] = on
request_slowlog_timeout = 5s    #php脚本执行超过5s的文件
slowlog = /var/log/php_slow.log #记录至该文件中

相关文章

网友评论

      本文标题:Nginx、PHP 相关优化

      本文链接:https://www.haomeiwen.com/subject/popbddtx.html