NGINX + PHP-FPM 优化记录

最近做的 NGINX + PHP-FPM 优化,记录一下,留待后用。

测试环境,8 核 CPU,64G 内存。

1、PHP-FPM 配置文件

listen = 127.0.0.1:9000 修改为 listen = /tmp/php-fpm.sock
listen.backlog 取消注释,并修改值为 102400
pm = dynamic 修改为 pm = static
pm.max_children 的值修改为 200

2、启动多个 PHP-FPM 实例

复制 php-fpm.conf 配置文件

cp php-fpm.conf php-fpm.1.conf

修改复制的 php-fpm.1.conf

listen = /tmp/php-fpm.sock 修改为 listen = /tmp/php-fpm.1.sock

建议启动的 PHP-FPM 实例数量与 CPU 核心数量一致。

3、NGINX 配置文件

worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_rlimit_nofile 204800;
events {
    use epoll;
    worker_connections 204800;
}
upstream phpbackend {
    server unix:/tmp/php-fpm.sock
    server unix:/tmp/php-fpm.1.sock
}
server {
    default backlog = 102400;
    location ~ .php$ {
        fastcgi_pass   phpbackend;
        include        fastcgi_params;
    }
}

4、修改系统打开文件数

打开 /etc/security/limits.conf 文件,添加:

* soft nofile 65535
* hard nofile 65535

修改完成需要重启服务器生效!并可使用下面命令查看是否生效:

ulimit -n

wp cli 的安装使用

推荐安装方式:wget 或 curl

wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

安装后,可以查看版本等信息

php wp-cli.phar --info

为了方便使用(直接使用wp命令)

chmod +x wp-cli.phar# sudo mv wp-cli.phar /usr/local/bin/wp

版本更新(升级)

wp cli update

在 TypeScript 中引入 CSS 并使用 WebPack 打包

需要用到 style-loader 和 css-loader 两个包,首先安装它们(我直接安装在工程中):

npm i --save-dev style-loader css-loader

在你的 .ts 或 .tsx 源码中引入 CSS 样式表文件:

import './css/custom.css';

修改 webpack.config.js 配置文件,增加内容如下:

module: {
    rules: [
        {
            test: /\.css$/,
            use: ['style-loader', 'css-loader']
        }
    ],
},

OK,执行打包命令:

webpack --mode production

👌

旧版浏览器(e.g. IE < 11)中的 React

在一些旧版浏览器中,你的 ES6 React 代码会报出如下错误:

Warning: React depends on Map and Set built-in types. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills

比如,截图如下:

原因是因为 React 需要 ES6 中的 Map 和 Set 两种数据类型。

按照官方的方法,解决如下:

# npm i --save core-js

然后在你的代码中:

import 'core-js/es6/map';
import 'core-js/es6/set';

就 OK 啦 👌

下面附上官网上解决方法的截图

TypeScript + React + Webpack

首先假定你的开发电脑上已经安装了npm。

1、环境:

全局安装TypeScript(安装tsc命令)

npm i -g typescript

全局安装Webpack(安装webpack命令)

npm i -g webpack

2、工程:

新建工程目录,并切换到工程目录下

mkdir ~/myProject# cd ~/myProject

初始化工程,并使用npm下载react和react-dom

npm init# npm i --save react react-dom @types/react @types/react-dom

初始化typescript环境,并创建tsc的配置文件tsconfig.json

tsc --init

修改tsconfig.json,增加或修改的内容

compilerOptions.target = "es6"
compilerOptions.jsx = "react"
compilerOptions.outDir = "path/to/js"
compilerOptions.watch = true
files = [
    'path/to/src/a.tsx',
    'path/to/src/b.tsx'
]

创建webpack配置文件webpack.config.js,并填写内容

const path = require('path');

module.exports = {
    entry: {
        'a': 'path/to/js/a.js',
        'b': 'path/to/js/b.js'
    },
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: '[name].js'
    },
    mode: 'development',
    // mode: 'production',
};

3、开发 && 打包

实时监听文件变化,并自动打包

typescript实时编译

tsc --watch

因为之前的tsconfig.json配置文件中,配置了watch=true,所以默认加载当前目录的tsconfig.json时,会自动以监听的方式启动。一旦发现path/to/src目录下的tsx文件发生变化,会自动创建对应的path/to/js目录下的js文件。

webpack实时打包

webpack --watch

监听到path/to/js目录下的js文件内容发生变化,则自动进行打包操作,生成到dist目录下。

但是前面webpack.config.js文件中配置的mode模式为development开发模式。所以当项目最终上线时,还需要进行一次手动打包,直接指定模式为production生产模式。

生产模式会针对js和css内容进行压缩处理,去除其中的注释、空行等无用内容。

webpack --mode production

就这些了,暂时记录到这儿吧~~~

macOS 编译 PHP 过程中出现 cannot find openssl’s 的解决

在自己的本子上编译安装 PHP 的过程中,遇到了cannot find openssl’s <evp.h> 的错误,解决办法如下:

brew install openssl

一般来说,问题就这样解决了。。。。

但是,如果还没有解决,那么在 configure 的时候

./configure --with-openssl-dir=/usr/local/Cellar/openssl/1.0.2n

搞定!

安全删除 MySQL binlog 日志文件

在MySQL数据库中,我们做主从数据同步,一般都是依赖于MySQL的binlog来进行数据同步。日积月累之下,主数据库的binlog日志文件体积会越来越大,终有一天会撑爆我们的服务器硬盘。这时就需要对其进行安全删除,在删除binlog的同时,保证主从数据库关系不断开,并且不需要重启活着关闭MySQL服务。

操作命令如下:

登陆从数据库数据库服务器

# mysql -uroot -p

在从数据库上执行命令,查看当前主从状态所依赖的binlog文件

mysql> show slave status;

可以看到,当前正在使用的binlog文件名是mysql-bin.000040

登陆主数据库服务器

# mysql -uroot -p

在主数据库上执行命令,删除历史的binlog

mysql> purge master logs to 'mysql-bin.000040';

OK了,大功告成!

去看看你的磁盘空间吧。。。。