最近在弄个环境,使用PHP作为开发语言,辅助NGINX、Redis、Mysql进行架构设计,这里记录下性能提升的几个点。
PHP-FPM
php-fpm是一种多进程模型,来了一个请求就会分配一个进程去处理,处理完成之后进行销毁,通过修改www.conf提升php-fpm的处理效率。
; static - a fixed number (pm.max_children) of child processes;
; pm.max_children - the maximum number of children that can
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in 'idle'
; pm.max_spare_servers - the maximum number of children in 'idle'
; pm.max_children - the maximum number of children that
; pm.process_idle_timeout - The number of seconds after which
pm = dynamic
; The number of child processes to be created when pm is set to 'static' and the
示例
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 100
pm.max_requests = 500
NGINX
nginx主要进行负载均衡以及限流优化,配置如下。
limit_req_zone $binary_remote_addr zone=test_req:10m rate=3r/s;
upstream test {
server 127.0.0.1:8080;
}
server {
listen 80;
error_page 503 /data/503.html;
location / {
limit_req zone=test_req burst=5 nodelay;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://test;
}
}
负载均衡: 定义一个upstream,之后通过proxy_pass设置负载。
限流: 使用limit_req_zone定义一个zone=test_req,使用binary_remote_addr作为区分字段,后面10m表示存储大小,rate表示访问速率,示例中每秒3个。
之后在需要限流的请求里增加limit_req zone=test_req;应用请求即可。
MySql
MySQL主要就两点优化,一个是查询优化,这个就索引搞定。
# 修改索引
ALTER table tableName ADD INDEX indexName(columnName)
# 创建时索引
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
# 唯一索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
第二个提升点是连接数优化
默认mysql支持的连接数很小,可以通过show variables like '%max_connection%' 查看
设置连接数可以直接在mysql中热设置,也可以通过修改my.conf,增加max_connections=32000字段即可,示例:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
max_connections=32000
这里有个地方需要注意下,在设置连接数之后可能会遇到214最大限制的问题。
vi /etc/systemd/system/mariadb.service.d/limits.conf
[Service]
LimitNOFILE=65535
LimitNPROC=65535
保存,退出。
systemctl daemon-reload
systemctl restart mariadb.service
Redis
redis暂时没有出现瓶颈问题,以后需要再说。