入手方面: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 #记录至该文件中
网友评论