找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 427|回复: 9

[L/WNAMP] LNMP优化一条龙--归档

[复制链接]
发表于 2023-4-13 21:50 | 显示全部楼层 |阅读模式

系统优化之:Debian11开启bbr

Debian11已把bbr编进内核中,如果版本低需要先升级Linux的内核,

编辑 /etc/sysctl.conf 文件,添加以下内容

net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

或直接用命令修改

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf

保存并生效

sysctl -p

查看是否开启成功

sysctl net.ipv4.tcp_available_congestion_control
#出现类似内容则开启成功net.ipv4.tcp_available_congestion_control = reno cubic bbr

或使用以下命令查看是否成功

lsmod | grep bbr
#或成功则会出现类似的内容 tcp_bbr  20480  1

 

 楼主| 发表于 2024-2-12 17:59 | 显示全部楼层

系统优化之:文件

1、open files数量优化
ulimit -a查看系统参数,其中open files (-n) 1024,表示系统同时最多能打开的文件数。linux下的所有设备都可以认为是文件,包括网络连接,如果同时超过1024个连接,那么nginx的日志就会报“24: Too many open files”

修改/etc/profile,增加以下参数临时生效
ulimit -n 65535

ulimit -SHn 65535

编辑文件:/etc/security/limits.conf(永久生效,但要重启服务器)

# End of file
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535



2、disable selinux
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
 

3、系统中开启HugePage
ssysctl vm.nr_hugepages=512
分配512个预留的大页内存
$ cat /proc/meminfo  | grep Huge
AnonHugePages:    106496 kB
HugePages_Total:     512
HugePages_Free:      504
HugePages_Rsvd:       27
HugePages_Surp:        0
Hugepagesize:       2048 kB
 

4、最大进程数/线程数( 有些系统可能会没有此文件)
/etc/security/limits.d/20-nproc.conf(没有此文件有90-nproc.conf文件也可以,有些系统都没有两个文件,跳过,继续看下面操作也一样

这里的4096也要改。
注:如果程序运行在docker,相关docker参数也得改。

linux系统可生成最大线程数可以用这个命令查询:
cat /proc/sys/kernel/threads-max
进程最大线程数查询方式
ps -eLf | grep 项目名 | wc -l 查看单个项目线程数,启动失败的这个项目线程数一般在600左右
cat /proc/sys/vm/max_map_count
65530

用户最大进程数查询方式:
ulimit -a
其中max user processes就是表示用户的最大进程数,我的这个值很大,进程数也没有超过它。如果超过的话,可以修改最大进程数的配置
vi /etc/security/limits.d/90-nproc.conf
* soft nproc 1024
root soft nproc unlimited
上面可以看除了root用户外的所有用户均限制为1024,因此通过可以注释此行或者将值改大,保存后修改立刻生效
#* soft nproc 1024
root soft nproc unlimited
整个系统已用的线程或进程数
cat /proc/sys/kernel/pid_max
该值是32678(32位Linux系统可创建的最大pid数是32678),查询当前整个系统已用的线程或进程数:pstree -p | wc -l。

注:此参数请专业运维操作,不要自己乱改。


 

 楼主| 发表于 2024-2-12 18:00 | 显示全部楼层

系统优化之:网络

下面贴一个完整的内核优化设置:vim /etc/sysctl.conf

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024    65000
 楼主| 发表于 2024-2-12 18:01 | 显示全部楼层

nginx优化之:线程池

使用线程池功能,首先需要在配置文件中添加如下配置项:

location / {
    root /html;
    thread_pool default threads=32 max_queue=65535;
    aio threads=default;
}

上面定义了一个名为“default”,包含32个线程,任务队列最多支持65535个请求的线程池。如果任务队列过载,Nginx将输出如下错误日志并拒绝请求:

thread pool "default" queue overflow: N tasks waiting

如果出现上面的错误,说明线程池的负载很高,这是可以通过添加线程数来解决这个问题。当达到机器的最高处理能力之后,增加线程数并不能改善这个问题 。

可在编译时使用如下选项可以启用线程池功能

  1. --with-threads

  2. --with-file-aio

启用线程池功能,让请求排队等待处理,并且可以充分利用 CPU 提高处理效率,开启线程池需要 AIO 的支持,启用异步文件 IO (AIO) 一般用于大文件传输的场景。

 楼主| 发表于 2024-2-12 18:09 | 显示全部楼层

nginx优化之:配置文件参数

下面是一个简单的nginx配置文件:

user  www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log  /www/log/nginx_error.log  crit;
pid        /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;

events
{
 accept_mutex on;
 multi_accept on;#多路复用
  use epoll;
  worker_connections 204800;
}

http
{
  include       mime.types;
  default_type  application/octet-stream;
  charset  utf-8;

  server_names_hash_bucket_size 128;
  client_header_buffer_size 4k;
  large_client_header_buffers 4 4k;
  client_max_body_size 8m;
 client_body_tmp /tmp/nginx_client_body_tmp
  server_tokens off;#隐藏nginx版本号
  sendfile on;
  tcp_nopush on; 
 tcp_nodelay on;
  keepalive_timeout 60;

  fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2  keys_zone=TEST:10m  inactive=5m;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 16k;
  fastcgi_buffers 16 16k;
  fastcgi_busy_buffers_size 32k;
  fastcgi_temp_file_write_size 32k;
  fastcgi_cache TEST;
  fastcgi_cache_valid 200 302 1h;
  fastcgi_cache_valid 301 1d;
  fastcgi_cache_valid any 1m;
  fastcgi_cache_min_uses 1;
  fastcgi_cache_use_stale error timeout invalid_header http_500;
 
  open_file_cache max=204800 inactive=20s;
  open_file_cache_min_uses 1;
  open_file_cache_valid 30s;
 
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;

  server
  {
    listen       8080  reuseport;
    server_name  biji.sebcxy.com;
    index index.php index.htm;
    root  /www/html/;
    
   //keepalive优化,请参考:http://biji.sebcxy.com/forum.php?mod=viewthread&tid=145&highlight=%E4%BC%98%E5%8C%96
    //Nginx默认使用DHE算法来产生密匙,该加密算法效率很低。可以通过如下命令,删掉了kEDH算法。ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;

    location /status
    {
        stub_status on;
    }

    location ~ .*\.php?$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fcgi.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
      expires  30d;
    }

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
   #在使用日志分析工具如ELK对访问日志做统计的时候,就需要将日志格式定义为json格式,以便于取相应字段的key做统计,完整的定义如下:
    log_format logstash_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",'
        '"agent":"$http_user_agent",'
        '"status":"$status"}';
    #log_format 两种格式只选一种即可,或者不配置使用默认的也可以
    #access_log  /www/log/access.log  access;
   access_log off;//关掉访问日志
   error_log  /www/log/errorlog.log;
  }
}
 楼主| 发表于 2024-2-12 18:21 | 显示全部楼层

PHP优化之:php.ini文件

 

# 错误显示
display_errors = Off
display_startup_errors = Off
 

# 文件上传设置,这里配置的时候,也要注意nginx的文件上传配置client_max_body_size
post_max_size = 200M
upload_max_filesize = 200M
 

# 设置时间
date.timezone = Asia/ShangHai


# 设置错误日志的路径
error_log = /var/log/php-fpm/error.log
 

# 开启OPcache:
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128 // OPcache 共享内存存储大小,单位 MB
opcache.interned_strings_buffer=8 // PHP 使用了一种叫做字符串驻留,默认是 4MB,建议设置为 64
opcache.max_accelerated_files=4000 // 这个选项用于控制内存中最多可以缓存多少个 PHP 文件, 这个选项必须得设置得足够大,大于你的项目中的所有 PHP 文件的总和
opcache.vilidate_timestamps=0 // 设置多少秒后重新验证脚本,如果设置为 0,需要手动在每次 PHP 代码更改后手动清除 opcache 缓存
opcache.revalidate_freq=300 // 设置缓存的过期时间(单位是秒), 为 0 的话每次都要检查
opcache.fast_shutdown=1
opcache.huge_code_pages=1   #注意操作系统也要支持
opcache.file_cache=/tmp
opcache.jit_buffer_size=64 # :php8及以上启用此参数
opcache.jit=1255  # :php8及以上启用此参数
//注:jit详细说明请参照:https://networkos.club/archives/php-jit-config.html

 楼主| 发表于 2024-2-12 18:22 | 显示全部楼层

PHP优化之:php-fpm参数

php-fpm.conf:

pid = run/php-fpm.pid
# 设置错误日志的路径
error_log = /var/log/php-fpm/error.log

events.mechanism = epoll
syslog.ident = php-fpm74
 



www.conf:

prefix = /path/to/pools/php74
# listen = 127.0.0.1:9000 
listen = /var/run/php-fpm/php-fpm74.sock
listen.backlog = 511
listen.allowed_clients = 127.0.0.1
slowlog = /var/log/php-fpm/php-slow74.log
request_slowlog_timeout = 10s
request_terminate_timeout = 60

pm = dynamic
pm.max_children = 25
# pm.start_servers不能小于pm.min_spare_servers,推荐为最大的pm.max_children的10%
pm.start_servers = 8
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 10240

# 设置主进程打开的最大文件数
rlimit_files = 65535

 

 楼主| 发表于 2024-2-12 18:23 | 显示全部楼层

MySQL优化:配置文件参数

注:请勿参考这里的具体数值,此参数为MySQL5.7小内存的参数,主要用于测试,不用于生产环境,但会用粗体标示出要调整的参数。

[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4 

[mysqld]
default-time_zone = '+8:00'

port = 3307
bind-address=127.0.0.1


# 设置mysql的安装目录
basedir=E:\php\phpStudy2016\MySQL\

# 数据目录
datadir=E:\php\phpStudy2016\MySQL\data\

#skip-networking
#skip-locking
#skip-name-resolve
#skip-grant-tables

# 内存占用调优 begin
max_connections=50
performance_schema = off
table_open_cache = 400


key_buffer_size=8M
tmp_table_size=7M


table_open_cache_instances = 1
query_cache_type=ON     #mysql8.0之后就取消查询缓存了,要特别注意
query_cache_limit= 512K
query_cache_size=10M
sort_buffer_size=256K


thread_cache_size=8
myisam_max_sort_file_size=10G
myisam_sort_buffer_size=12M

read_buffer_size=64K
read_rnd_buffer_size=256K

# 内存占用调优 end

max_allowed_packet = 100M

slow_query_log = 1
slow_launch_time = 2
slow_query_log_file = "E:/php/phpStudy2016/MySQL/slow.log"
long_query_time = 10
log_queries_not_using_indexes = 0


# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8mb4

# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB

#skip-grant-tables表示忽略密码
#sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
sql-mode="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"


#*** INNODB Specific options ***
innodb_data_home_dir="E:/php/phpStudy2016/MySQL/data/"

innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=1M
innodb_buffer_pool_size=10M
innodb_log_file_size=10M
innodb_thread_concurrency=8
#######
innodb_file_per_table=1 #高版本mysql会自动启用此参数

#事务日志存放目录
innodb_log_group_home_dir="E:/php/phpStudy2016/MySQL/data/"

 楼主| 发表于 2024-2-12 18:24 | 显示全部楼层

安全防护之:nginx防火墙

截止2024.02.12,宝塔或者aaPanel有内置免费的nginx防火墙,可以防止SQL注入/CC攻击等常见web攻击。只需点击几下,即可安装成功。
 
 楼主| 发表于 2024-2-12 18:25 | 显示全部楼层
安全防护之:DenyHosts




安全防护之:DDOS Deflate
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-4-25 18:51 , Processed in 0.034045 second(s), 14 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表