环境搭建和各种软件安装
Linux 环境搭建
PHP
yum 安装
centOS 8 - PHP 8
sudo dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
sudo dnf -y install yum-utils
sudo dnf module reset php
sudo dnf module install php:remi-8.0 -y
sudo dnf install php -y
安装其他扩展: sudo yum install php-xxx
常用扩展
bcmath
bz2
calendar
Core
ctype
curl
date
dom
exif
fileinfo
filter
ftp
gettext
hash
iconv
igbinary
json
libxml
mbstring
msgpack
mysql
mysqli
mysqlnd
openssl
pcntl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
readline
redis
Reflection
session
SimpleXML
sockets
sodium
SPL
sqlite3
standard
tokenizer
xml
xmlreader
xmlwriter
xsl
Zend OPcache
zip
zlib
centos 7
sudo yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum -y install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
sudo yum -y install yum-utils
sudo yum-config-manager --disable 'remi-php*'
sudo yum-config-manager --enable remi-php80
sudo yum -y install php php-{cli,fpm,mysqlnd,zip,devel,gd,mbstring,curl,xml,pear,bcmath,json}
参考文档:
CentOS 8 - PHP 7.4
暂时先记着,这种方法不是很懂,建议源码安装
# 添加源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-8.rpm
# 启用remi模块安装
dnf -y install dnf-utils
# 查找
yum search php74*
# 安装
yum install php74-php
# 通过grep查找扩展
yum search php74* | grep swoole
# 安装扩展
yum install php74-php-pecl-swoole4
# 链接文件
ln -s /opt/remi/php74/root/usr/bin/php /usr/bin/php
Centos 7 -- php 7.4
https://www.cnblogs.com/lizexiong/p/16930833.html
CentOS 7 -- PHP 7.0、7.1
# 安装epel-release
yum -y install epel-release
# 获取PHP7的yum源
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
# 安装php7.1
yum -y install php71w
# 安装扩展,以下列出的基本满足大部分情况,后续可以再继续yum安装
yum install php71w.x86_64 php71w-bcmath.x86_64 php71w-cli.x86_64 php71w-common.x86_64 php71w-dba.x86_64 php71w-devel.x86_64 php71w-embedded.x86_64 php71w-enchant.x86_64 php71w-fpm.x86_64 php71w-gd.x86_64 php71w-imap.x86_64 php71w-ldap.x86_64 php71w-mbstring.x86_64 php71w-mcrypt.x86_64 php71w-mysqlnd.x86_64 php71w-odbc.x86_64 php71w-opcache.x86_64 php71w-pdo.x86_64 php71w-pdo_dblib.x86_64 php71w-pear.noarch php71w-pecl-apcu.x86_64 php71w-pecl-apcu-devel.x86_64 php71w-pecl-imagick.x86_64 php71w-pecl-imagick-devel.x86_64 php71w-pecl-mongodb.x86_64 php71w-pecl-redis.x86_64 php71w-pecl-xdebug.x86_64 php71w-pgsql.x86_64 php71w-xml.x86_64 php71w-xmlrpc.x86_64 nginx php71w-intl -y php71w-mysqlnd.x86_64
# 验证版本
php -v
备注:将以上所有的php71w换成php70w,就是安装php7.0
CentOS 7 -- PHP 5.4 --> 5.6
因为一般yum官网安装的是php 5.4 所以会有升级到5.6这个版本的需要
一、查看当前版本 php -v
二、列出所有安装的PHP软件包 rpm -qa|grep php
三、卸载所有安装的PHP软件包--卸载一律从下往上卸载,如果你是yum安装的,可以用yum一键卸载 yum remove php-commo
四、升级升级yum仓库
rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
五、安装php5.6和扩展
yum install -y php56w php56w-opcache php56w-xml php56w-mcrypt php56w-gd php56w-devel php56w-mysql php56w-intl php56w-mbstring
六、如果你服务器上面想要运行nginx的话,还需要安装php-fpm 5.6
# 添加 EPEL源
yum install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# 安装nginx
yum -y install nginx
# 安装 php-fpm 5.6
yum --enablerepo=remi --enablerepo=remi-php56 install php php-fpm
# 或者
yum --enablerepo=remi install php php-fpm
# 启动php-fpm
systemctl start php-fpm 或 systemctl start php-fpm
# 重启nginx
systemctl restart nginx
七、查看PHP版本 php -v
其他系统一键安装
都差不多
Ubuntu:
apt install php8.1-cli
apt install php8.1-zip php8.1-curl php8.1-bcmath
源码安装PHP7.4
CentOS 不同版本基本思路都是一样的,介绍一种即可
备注:可能会源码安装多个版本的PHP,所以我将源码包放在 /usr/local/php_package
下,安装在 /usr/local/php7.x
下,通过软链去选择版本,更好的办法是修改 php-fpm 端口
# 先更新软件包
yum -y update
apt-get upgrade
# 去官网下载你需要的版本
wget https://www.php.net/distributions/php-7.4.7.tar.gz
# 如果提示证书问题
wget --no-check-certificate https://www.php.net/distributions/php-7.4.7.tar.gz
# 安装编译所需要的扩展,如果你安装的 PHP 版本过高,可能很多扩展需要升级,原则就是:编译报什么错,就装什么
yum install libxml2-devel libxml2 sqlite-devel sqlite openssl-devel openssl libcurl-devel libcurl libc-client-devel libsodium libsodium-devel libzip libzip-devel
# 解压
tar -zxvf php-7.4.7.tar.gz
# 进入安装目录
cd php-7.4.7/
./configure --prefix=/usr/local/php7.4 \
--with-config-file-scan-dir=/usr/local/php7.4/etc \
--with-mhash \
--with-pdo-mysql \
--with-mysqli \
--with-openssl \
--enable-calendar \
--with-imap \
--with-kerberos \
--with-imap-ssl \
--with-zlib \
--enable-shared \
--enable-bcmath \
--enable-shmop \
--enable-sysvsem \
--enable-sysvshm \
--enable-mbstring \
--enable-ftp \
--enable-pcntl \
--enable-sockets \
--with-xmlrpc \
--enable-soap \
--with-gettext \
--with-curl \
--enable-fpm \
--with-pear \
--enable-fast-install \
--disable-fileinfo \
--with-sodium \
--with-zip
部分配置简单描述
配置项 |
说明 |
./configure --prefix=/usr/local/php7.4 |
安装目录 |
--with-config-file-scan-dir=/usr/local/php7.4/etc |
设置扫描配置文件的路径 |
--with-mhash |
包括mhash支持 |
--with-pdo-mysql |
PDO:MySQL支持,缺省路径代表将使用MySQL本机驱动程序 |
--with-mysqli |
包括MySQLi支持,缺省路径代表将使用MySQL本机驱动程序 |
--with-pdo-pgsql |
PDO:PostgreSQL支持。DIR是PostgreSQL基本安装目录或pg_config的路径 |
--without-pdo-sqlite |
PDO:sqlite 3支持。 |
--with-pgsql |
包括PostgreSQL支持。DIR是PostgreSQL基本安装目录或pg_config的路径 |
--with-openssl |
包括OpenSSL支持(需要OpenSSL>=1.0.1) |
--enable-calendar |
启用日历转换支持 |
--with-imap |
包括IMAP支持。DIR是c-client安装前缀 |
--with-kerberos |
IMAP:包括Kerberos支持 |
--with-imap-ssl |
IMAP:包括SSL支持 |
--with-zlib |
包括ZLIB支持(需要ZLIB>=1.2.0.4) |
|
--enable-shared |
生成共享库,默认设置为“是” |
--enable-bcmath |
启用bc样式的精度数学函数 |
--enable-shmop |
启用shmop支持 |
--enable-sysvsem |
启用sysvsem支持 |
--enable-sysvshm |
启用sysvshm共享内存支持 |
--enable-mbstring |
启用多字节字符串支持 |
--enable-ftp |
启用FTP支持 |
--enable-pcntl |
启用pcntl支持(仅限CLI/CGI) |
--enable-sockets |
启用sockets支持 |
--with-xmlrpc |
包括XMLRPC-EPI支持 |
--enable-soap |
启用SOAP支持 |
--with-gettext |
包括GNU gettext支持 |
--with-curl |
启用 curl 支持 |
--enable-fpm |
启用 fpm SAPI 可执行文件 |
--with-fpm-user |
指定 fpm 用户 |
--with-fpm-group |
指定 fpm 用户组 |
--with-pear |
pecl |
--with-gdbm |
DBA:GDBM支持 |
--enable-fast-install |
优化快速安装,默认值 yes |
--disable-fileinfo |
禁用fileinfo支持 |
--with-sodium |
包含 sodium 支持 |
配置常见错误,简单解决就是:缺啥装啥
如果已经安装了,可是还是提示未找到包,就需要做个软链,比如这个 ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.so
遇到缺少的库,一般这么解决 sudo apt-get install lib******-dev
、(*****
一般是库名), 不知道名字的,lib + **
+ 按两下 tab 键,找到后缀是 - dev 的安装
- configure: error: Package requirements (libxml-2.0 >= 2.7.6) were not met:
解决:
# Centos 系统
yum install libxml2-devel libxml2
# Ubuntu 系统
apt-get install libxml2 libxml2-dev
apt-get install libxml++2.6-dev
# 编译安装,注意版本
wget http://xmlsoft.org/sources/libxml2-2.9.10.tar.gz
tar -zxvf libxml2-2.9.10.tar.gz
cd libxml2-2.9.10
./configure --prefix=/usr/local/libxml2
make && make install
# 如果出现安装libxml2后还是报这个错,试试编译的时候,手动加上
--with-libxml-dir=/usr/local/libxml2
-
configure: error: Package requirements (sqlite3 > 3.7.4) were not met:
解决:yum install sqlite-devel sqlite
-
configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information
解决:apt-get install libc-client-dev
-
configure: error: Package requirements (openssl >= 1.0.1) were not met:
解决:yum install openssl-devel openssl
-
configure: error: DBA: Could not find necessary header file(s).
解决:因为启用了这个,本机找不到,这个是一个小型数据库,一般不会用,不启用这就行
-
configure: error: utf8_mime2text() has new signature, but U8T_CANONICAL is missing. This should not happen. Check config.log for additional information.
解决:yum install -y libc-client-devel
-
No package 'libpng' found
解决:yum install libpng-devel
-
configure: error: Cannot find imap library (libc-client.a). Please check your c-client installation.
解决:
yum install libc-client-devel
ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.so
- configure: error: Package requirements (oniguruma) were not met:Package 'oniguruma', required by 'virtual:world', not found
解决:网络上一堆都是扯淡,自己根本没尝试过,就到处复制,哎,这个大环境啊,下面是我的解决办法(去GitHub看最新包)
# 先安装 apt-get install libonig-dev,如果不行就下面手动安装
wget https://github.com/kkos/oniguruma/releases/download/v6.9.5_rev1/onig-6.9.5_rev1.tar.gz
tar -zxvf onig-6.9.5_rev1.tar.gz
cd onig-6.9.5/
./configure --prefix=/usr --libdir=/lib64
make
make install
-
configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path
解决:要不你自己装这个数据库,要不就不要配置这个参数,就这样
-
configure: error: Package requirements (libsodium >= 1.0.8) were not met:
解决:yum install libsodium libsodium-devel
-
configure: error: Package requirements (libzip >= 0.11) were not met:
解决:yum -y install libzip libzip-devel
如果上面没解决,那就
cd
yum remove libzip
wget https://libzip.org/download/libzip-1.2.0.tar.gz
tar -zxvf libzip-1.2.0.tar.gz
cd libzip-1.2.0
./configure
make && make install
export PKG_CONFIG_PATH="/usr/local/lib/pkgconfig/"
历经千辛万苦,我终于配置成功了,妈呀,真的不容易啊

编译 && 安装
make 如果出现如下错误:
make: *** [sapi/cli/php] Error 1
解决办法:
wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
tar -zxvf libiconv-1.16.tar.gz
cd libiconv-1.16
./configure --prefix=/usr/local
make
make install
ln -s /usr/local/lib/libiconv.so.2 /usr/lib64/
#### 如果上面安装了 libiconv 可是 make 还是报错 ####
make clean
make && make install
ln -s /usr/local/lib/libiconv.so.2 /usr/lib64/
make ZEND_EXTRA_LIBS='-liconv'
make 成功后信息如下所示:
我这里有个提示,说 phar
未安装,这个可以在编译前去掉,然后在PHP安装完成后再安装这个
Generating phar.php
Generating phar.phar
PEAR package PHP_Archive not installed: generated phar will require PHP's phar extension be enabled.
clicommand.inc
pharcommand.inc
invertedregexiterator.inc
directorytreeiterator.inc
directorygraphiterator.inc
phar.inc
Build complete.
Don't forget to run 'make test'.
make install 成功后信息如下:
[root@rogxbw php-7.4.21]# make install
Installing shared extensions: /usr/local/php7.4/lib/php/extensions/no-debug-non-zts-20190902/
Installing PHP CLI binary: /usr/local/php7.4/bin/
Installing PHP CLI man page: /usr/local/php7.4/php/man/man1/
Installing PHP FPM binary: /usr/local/php7.4/sbin/
Installing PHP FPM defconfig: /usr/local/php7.4/etc/
Installing PHP FPM man page: /usr/local/php7.4/php/man/man8/
Installing PHP FPM status page: /usr/local/php7.4/php/php/fpm/
Installing phpdbg binary: /usr/local/php7.4/bin/
Installing phpdbg man page: /usr/local/php7.4/php/man/man1/
Installing PHP CGI binary: /usr/local/php7.4/bin/
Installing PHP CGI man page: /usr/local/php7.4/php/man/man1/
Installing build environment: /usr/local/php7.4/lib/php/build/
Installing header files: /usr/local/php7.4/include/php/
Installing helper programs: /usr/local/php7.4/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php7.4/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/php7.4/lib/php/
[PEAR] Archive_Tar - installed: 1.4.9
[PEAR] Console_Getopt - installed: 1.4.3
[PEAR] Structures_Graph- installed: 1.1.1
[PEAR] XML_Util - installed: 1.4.5
warning: pear/PEAR dependency package "pear/Archive_Tar" installed version 1.4.9 is not the recommended version 1.4.4
[PEAR] PEAR - installed: 1.10.12
Wrote PEAR system config file at: /usr/local/php7.4/etc/pear.conf
You may want to add: /usr/local/php7.4/lib/php to your php.ini include_path
/usr/local/php_package/php-7.4.21/build/shtool install -c ext/phar/phar.phar /usr/local/php7.4/bin/phar.phar
ln -s -f phar.phar /usr/local/php7.4/bin/phar
Installing PDO headers: /usr/local/php7.4/include/php/ext/pdo/
安装成功,源码文件不要删,后面有空的

# 软链
ln -s /usr/local/php7.4/bin/php /usr/bin/php
ln -s /usr/local/php7.4/bin/phar /usr/bin/phar
ln -s /usr/local/php7.4/bin/php-cgi /usr/bin/php-cgi
ln -s /usr/local/php7.4/bin/php-config /usr/bin/php-config
# 配置文件,先看下安装目录下这三个配置文件有没(有的默认都是带了 default 后缀),默认是有的,没有就从安装包中复制过去
/usr/local/php7.4/etc/php.ini
/usr/local/php7.4/etc/php-fpm.conf
/usr/local/php7.4/etc/php-fpm.d/www.conf
若没有:
cp /usr/local/php_package/php-7.4.7/php.ini-production /usr/local/php7.4/etc/php.ini
配置文件是否需要修改
- 配置文件需要修改的话,就改,不改就默认,这些不用说了吧
# 修改 php-fpm 配置
vim /usr/local/php7.4/etc/php-fpm.conf
;Default Value: none
; 开启后可以平滑重启php-fpm
pid = run/php-fpm.pid
; 设置错误日志的路径,可以默认值
; Note: the default prefix is /usr/local/php7.4/var
; Default Value: log/php-fpm.log, 即/usr/local/php7.4/var/log/php-fpm.log
error_log = log/php-fpm.log
; Log等级,可以默认值
; Possible Values: alert, error, warning, notice, debug
; Default Value: notice
log_level = notice
; 后台运行,默认yes,可以默认值
; Default Value: yes
;daemonize = yes
; 引入www.conf文件中的配置,可以默认值
include=/usr/local/php7.4/etc/php-fpm.d/*.conf
# 修改 www.conf 配置
vim /usr/local/php7.4/etc/php-fpm.d/www.conf
;修改用户和用户组
user = nginx
group = nginx
######开启慢日志。可以默认值
slowlog = log/$pool.log.slow
request_slowlog_timeout = 10s
启动 php-fpm
/usr/local/php7.4/sbin/php-fpm -t # php-fpm检测配置文件是否正确
/usr/local/php7.4/sbin/php-fpm # php-fpm启动
kill -INT `cat /usr/local/php7.4/var/run/php-fpm.pid` # php-fpm关闭
kill -USR2 `cat /usr/local/php7.4/var/run/php-fpm.pid` #php-fpm平滑重启
测试 php 文件是否解析,经测试,OK,能输出 phpinfo
安装完成后,添加扩展
# 需要先安装 autoconf
yum -y install autoconf
# 进入到源码的扩展包(比如我要安装 GD 库)中,
cd /usr/local/php_package/php-7.4.7/ext/gd
# 执行 phpize,需要强调,如果你本机安装有多个 PHP 版本,请输入你要安装的 PHP 版本的扩展的 phpize 路径,如下所示
/usr/local/php7.4/bin/phpize
# 执行完成后应该如下所示:
Configuring for:
PHP Api Version: 20190902
Zend Module Api No: 20190902
Zend Extension Api No: 320190902
# 执行完 phpize 后,会在当前目录生成 configure 文件,然后执行
./configure --with-php-config=/usr/local/php7.4/bin/php-config
make
make install
# 安装完成后,如下所示,会告诉你装在哪里
Installing shared extensions: /usr/local/php7.4/lib/php/extensions/no-debug-non-zts-20190902/
Installing header files: /usr/local/php7.4/include/php/
# 修改 php.ini 启用扩展
vim /usr/local/php7.4/etc/php.ini
# 添加如下信息:
extension=gd.so
extension=fileinfo.so
extension=zip.so
# 重启 php-fpm
kill -USR2 `cat /usr/local/php7.4/var/run/php-fpm.pid`
# 查看是否添加了扩展 php -m
添加 pecl
后续需要通过 pecl 安装扩展时,提示没有找到 pecl 命令。
编译安装 pecl,在编译时就最好直接编译
./configure --prefix=/usr/local/php7.4 --with-pear --with-config-file-path=/usr/local/php7.4/etc
make && make install

安装 Redis 扩展
跟上面步骤一样,只是需要手动下载扩展包,点击去官网
安装 swoole 扩展
注意版本:https://pecl.php.net/package-changelog.php?package=swoole
PHP7.4.7 安装 4.4.2
php8.0.2 安装
官网地址:https://pecl.php.net/package/swoole
composer
composer 安装
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
# 全局安装
sudo mv composer.phar /usr/local/bin/composer
全部配置其他镜像
项目配置其他镜像
取消配置
安装依赖包
composer require xxxxx/xxxx
只安装测试
composer require xxxxx/xxxx --dev
卸载安装包
composer remove xxxxx/xxxx
调试
composer -vvv require xxxxxxxx/xxxxxx
其他问题
-
升级到最新:composer self-update
-
执行诊断命令:composer diagnose
-
清除缓存:composer clear
-
若项目之前已通过其他源安装,则需要更新 composer.lock 文件,执行命令:composer update --lock
-
超内存 php -d memory_limit=-1 /usr/local/bin/composer require 你的包名
Nginx
一键自动安装
CentOS 7.6
# yum 安装
yum update
yum install -y nginx
# apt-get 安装
apt-get update
apt-get install nginx
# 配置文件路径
/etc/nginx/nginx.conf
/etc/nginx/conf.d/*.conf
# 启动
systemctl start nginx
# 停止
systemctl stop nginx
# 重启
systemctl restart nginx
# 加载配置文件而不需要重启 nginx
service nginx reload
# 开机启动
systemctl enable nginx
# 各种配置,看单独的模块介绍,不再说明
配置PHP时注意
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
# 如果 conf.d 里面有一个 php-fpm.conf 文件,里面内容如下时,需要将 127.0.0.1:9000 替换成 php-fpm
# PHP-FPM FastCGI server
# network or unix domain socket configuration
upstream php-fpm {
server unix:/run/php-fpm/www.sock;
}
# 替换后的参数配置如下
location ~ \.php(.*)$ {
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
简单配置
server {
listen 80;
server_name laravel6.com;
root /data/www/laravel_6/public;
location / {
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}
location ~ \.php(.*)$ {
fastcgi_pass php-fpm;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
一些报错
出现 403 404 等,查 nginx 日志,有这么一条 is forbidden (13: Permission denied)
一、查看文件或文件夹权限,试着给 777
二、nginx 配置文件缺少指引文件 index index.php index.html index.htm;
三、坑爹的这个 selinux
,临时关闭一下 setenforce 0
关闭后如果正常,就是他的问题了
# 彻底关闭方法
vim /etc/selinux/config
# 修改 SELINUX=enforcing 改为 SELINUX=disabled
#修改后
SELINUX=enable
源码安装
# 安装必要扩展
yum install gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 解压
tar -zxvf nginx-1.18.0.tar.gz
# 进入
cd nginx-1.18.0
# 配置,其实默认执行 ./configure 即可,除非你要自定义
./configure \
--user=nginx \
--group=nginx \
--prefix=/usr/local/nginx-1.18.0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module
# 编译 && 安装,默认安装位置 /usr/local/nginx
make
make && install
一些基本命令
# 查看版本
/usr/local/nginx/sbin/nginx -v
# 启动
/usr/local/nginx/sbin/nginx
# 重新载入配置文件
/usr/local/nginx/sbin/nginx -s reload
# 快速关闭 Nginx
/usr/local/nginx/sbin/nginx -s stop
# 关闭 Nginx
/usr/local/nginx/sbin/nginx -s quit
配置 systemctl
启动
vim /usr/lib/systemd/system/nginx.service
输入以下内容后保存:
[Unit]
Description=nginx
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPost=/bin/sleep 0.1
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
后续启动可以用:systemctl start nginx
设置开机启动: systemctl enable nginx
附录:Nginx 编译所有配置
- 可以通过
./configure --help
查看
参数 |
描述 |
--prefix=PATH |
设置安装前缀 |
--sbin-path=PATH |
设置nginx二进制路径名 |
--modules-path=PATH |
设置模块路径 |
--conf-path=PATH |
nginx.conf配置文件路径 |
--error-log-path=PATH |
设置错误日志路径名 |
--pid-path=PATH |
nginx.pid公司路径名 |
--lock-path=PATH |
引擎锁路径名 |
--user=USER |
为工作进程设置非特权用户 |
--group=GROUP |
为工作进程设置非特权组 |
--build=NAME |
设置生成名称 |
--builddir=DIR |
设置生成目录 |
--with-select_module |
启用选择模块 |
--without-select_module |
禁用选择模块 |
--with-poll_module |
启用轮询模块 |
--without-poll_module |
禁用轮询模块 |
--with-threads |
启用线程池支持 |
--with-file-aio |
启用文件AIO支持 |
--with-http_ssl_module |
启用ngx_http_ssl_模块 |
--with-http_v2_module |
启用ngx_http_v2_模块 |
--with-http_realip_module |
启用ngx_http_realip_模块 |
--with-http_addition_module |
启用ngx_http_addition_模块 |
--with-http_xslt_module |
启用ngx_http_xslt_模块 |
--with-http_xslt_module=dynamic |
启用动态ngx_http_xslt_模块 |
--with-http_image_filter_module |
启用ngx_http_image_filter_模块 |
--with-http_image_filter_module=dynamic |
启用动态ngx_http_image_filter_模块 |
--with-http_geoip_module |
启用ngx_http_geoip_模块 |
--with-http_geoip_module=dynamic |
启用动态ngx_http_geoip_模块 |
--with-http_sub_module |
启用ngx_http_子模块 |
--with-http_dav_module |
启用ngx_http_dav_模块 |
--with-http_flv_module |
启用ngx_http_flv_模块 |
--with-http_mp4_module |
启用ngx_http_mp4_模块 |
--with-http_gunzip_module |
启用ngx_http_gunzip_模块 |
--with-http_gzip_static_module |
启用ngx_http_gzip_static_模块 |
--with-http_auth_request_module |
启用ngx_http_auth_request_模块 |
--with-http_random_index_module |
启用ngx_http_random_index_模块 |
--with-http_secure_link_module |
启用ngx_http_secure_link_模块 |
--with-http_degradation_module |
启用ngx_http_降级模块 |
--with-http_slice_module |
启用ngx_http_slice_模块 |
--with-http_stub_status_module |
启用ngx_http_stub_status_模块 |
--without-http_charset_module |
禁用ngx_http_charset_模块 |
--without-http_gzip_module |
禁用ngx_http_gzip_模块 |
--without-http_ssi_module |
禁用ngx_http_ssi_模块 |
--without-http_userid_module |
禁用ngx_http_userid_模块 |
--without-http_access_module |
禁用ngx_http_访问模块 |
--without-http_auth_basic_module |
禁用ngx_http_auth_basic_模块 |
--without-http_mirror_module |
禁用ngx_http_mirror_模块 |
--without-http_autoindex_module |
禁用ngx_http_autoindex_模块 |
--without-http_geo_module |
禁用ngx_http_geo_模块 |
--without-http_map_module |
禁用ngx_http_map_模块 |
--without-http_split_clients_module |
禁用ngx_http_split_clients_模块 |
--without-http_referer_module |
禁用ngx_http_referer_模块 |
--without-http_rewrite_module |
禁用ngx_http_rewrite_模块 |
--without-http_proxy_module |
禁用ngx_http_proxy_模块 |
--without-http_fastcgi_module |
禁用ngx_http_fastcgi_模块 |
--without-http_uwsgi_module |
禁用ngx_http_uwsgi_模块 |
--without-http_scgi_module |
禁用ngx_http_scgi_模块 |
--without-http_grpc_module |
禁用ngx_http_grpc_模块 |
--without-http_memcached_module |
禁用ngx_http_memcached_模块 |
--without-http_limit_conn_module |
禁用ngx_http_limit_conn_模块 |
--without-http_limit_req_module |
禁用ngx_http_limit_req_模块 |
--without-http_empty_gif_module |
禁用ngx-http-empty-gif-u模块 |
--without-http_browser_module |
禁用ngx_http_browser_模块 |
--without-http_upstream_hash_module |
禁用ngx_http_upstream_hash_模块 |
--without-http_upstream_ip_hash_module |
禁用ngx_http_upstream_ip_hash_模块 |
--without-http_upstream_least_conn_module |
禁用ngx_http_upstream_least_conn_模块 |
--without-http_upstream_random_module |
禁用ngx_http_upstream_random_模块 |
--without-http_upstream_keepalive_module |
禁用ngx_http_upstream_keepalive_模块 |
--without-http_upstream_zone_module |
禁用ngx_http_upstream_zone_模块 |
--with-http_perl_module |
启用ngx_http_perl_模块 |
--with-http_perl_module=dynamic |
启用动态ngx_http_perl_模块 |
--with-perl_modules_path=PATH |
设置Perl模块路径 |
--with-perl=PATH |
设置perl二进制路径名 |
--http-log-path=PATH |
设置http访问日志路径名 |
--http-client-body-temp-path=PATH |
设置存储http客户端请求正文临时文件的路径 |
--http-proxy-temp-path=PATH |
设置存储http代理临时文件的路径 |
--http-fastcgi-temp-path=PATH |
设置存储http fastcgi临时文件的路径 |
--http-uwsgi-temp-path=PATH |
设置存储http uwsgi临时文件的路径 |
--http-scgi-temp-path=PATH |
设置存储http scgi临时文件的路径 |
--without-http |
禁用HTTP服务器 |
--without-http-cache |
禁用HTTP缓存 |
--with-mail |
启用POP3/IMAP4/SMTP代理模块 |
--with-mail=dynamic |
启用动态POP3/IMAP4/SMTP代理模块 |
--with-mail_ssl_module |
启用ngx_mail_ssl_模块 |
--without-mail_pop3_module |
禁用ngx_mail_pop3_模块 |
--without-mail_imap_module |
禁用ngx_mail_imap_模块 |
--without-mail_smtp_module |
禁用ngx_mail_smtp_模块 |
--with-stream |
启用TCP/UDP代理模块 |
--with-stream=dynamic |
启用动态TCP/UDP代理模块 |
--with-stream_ssl_module |
启用ngx_stream_ssl_模块 |
--with-stream_realip_module |
启用ngx_stream_realip_模块 |
--with-stream_geoip_module |
启用ngx_stream_geoip_模块 |
--with-stream_geoip_module=dynamic |
启用动态ngx_stream_geoip_模块 |
--with-stream_ssl_preread_module |
启用ngx_stream_ssl_preread_模块 |
--without-stream_limit_conn_module |
禁用ngx_stream_limit_conn_模块 |
--without-stream_access_module |
禁用ngx_stream_access_模块 |
--without-stream_geo_module |
禁用ngx_stream_geo_模块 |
--without-stream_map_module |
禁用ngx_stream_map_模块 |
--without-stream_split_clients_module |
禁用ngx_stream_split_clients_模块 |
--without-stream_return_module |
禁用ngx_stream_return_模块 |
--without-stream_upstream_hash_module |
禁用ngx_stream_upstream_hash_模块 |
--without-stream_upstream_least_conn_module |
禁用ngx_stream_upstream_least_conn_模块 |
--without-stream_upstream_random_module |
禁用ngx_stream_upstream_random_模块 |
--without-stream_upstream_zone_module |
禁用ngx_stream_upstream_zone_模块 |
--with-google_perftools_module |
启用ngx_google_perftools_模块 |
--with-cpp_test_module |
启用ngx-cpp-u测试模块 |
--add-module=PATH |
启用外部模块 |
--add-dynamic-module=PATH |
启用动态外部模块 |
--with-compat |
动态模块兼容性 |
--with-cc=PATH |
设置C编译器路径名 |
--with-cpp=PATH |
设置C预处理器路径名 |
--with-cc-opt=OPTIONS |
设置其他C编译器选项 |
--with-ld-opt=OPTIONS |
设置其他链接器选项 |
--with-cpu-opt=CPU |
为指定的CPU生成,有效值:pentium、pentiumpro、pentium3、pentium4、athlon、opteron、sparc32、sparc64、ppc64 |
--without-pcre |
禁用PCRE库使用 |
--with-pcre |
强制使用PCRE库 |
--with-pcre=DIR |
设置PCRE库源的路径 |
--with-pcre-opt=OPTIONS |
为PCRE设置其他生成选项 |
--with-pcre-jit |
使用JIT编译支持构建PCRE |
--with-zlib=DIR |
设置zlib库源的路径 |
--with-zlib-opt=OPTIONS |
为zlib设置其他生成选项 |
--with-zlib-asm=CPU |
使用为指定CPU优化的zlib汇编程序源,有效值:pentium、pentiumpro |
--with-libatomic |
强制使用libatomic_ops库 |
--with-libatomic=DIR |
设置libatomic_ops库源的路径 |
--with-openssl=DIR |
设置OpenSSL库源的路径 |
--with-openssl-opt=OPTIONS |
为OpenSSL设置其他生成选项 |
--with-debug |
启用调试日志记录 |
MySQL
yum 安装
CentOS 7 MySQL 5.7
默认yum源安装的5.4,这里介绍安装MySQL5.7(指全新安装)
一、查看系统是否安装了MySQL,CentOS7默认会安装mariadb,需要卸载
# 几种查询方法
rpm -qa | grep mysql
rpm -qa | grep mariadb
yum list installed | grep mysql
二、如果已安装则卸载
# 几种卸载方法
rpm -e --nodeps XXXXXXXXX(上面列出的详细包名)
yum -y remove xxxxxxxxxx
三、下载 mysql57-community-release-el7-8.noarch.rpm 的 YUM 源:
wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
四、安装 mysql57-community-release-el7-8.noarch.rpm:
rpm -ivh mysql57-community-release-el7-8.noarch.rpm
# 安装完后,得到如下两个包:
mysql-community.repo
mysql-community-source.repo
五、安装 MySQL yum -y install mysql-server
六、获取安装的随机密码
# 启动MySQL服务
service mysqld start
# 获取默认的登录密码
grep "password" /var/log/mysqld.log
# 复制末尾的密码:SiqHi!9_kxIc
A temporary password is generated for root@localhost: SiqHi!9_kxIc
注:MySQL 8.0 yum 安装后,默认是空密码,修改密码语句为:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
七、登录MySQL服务器 mysql -uroot -pSiqHi!9_kxIc
八、修改登录密码 SET PASSWORD = PASSWORD('new password');
九、刷新权限 flush privileges;
十、修改字符集为utf-8或者是utf8mb4
#############utf8###########
vim /etc/my.cnf
# 在 [mysqld] 前添加如下代码:
[client]
default-character-set=utf8
# 在 [mysqld] 后添加如下代码:
character_set_server=utf8
###########utf8mb4###############
vim /etc/my.cnf 添加如下代码
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
如图所示:

登录MySQL服务器查看是否修改成功 show variables like '%character%';

十一、忘记密码的操作
# 停止服务
service mysqld stop 或 systemctl stop mysqld
# 输入如下命令
mysqld_safe --user=root --skip-grant-tables --skip-networking &
# 登录MySQL
mysql -u root
# 登录成功后
use mysql;
update user set password=password("new_password") where user="root";
flush privileges;
十二、配置文件
# 主配置文件
vim /etc/my.cnf
# 存放数据库文件的目录
cd /var/lib/mysql
# 日志记录文件
vim /var/log/ mysqld.log
# socket文件
/var/run/mysqld/mysqld.pid
CentOS 8 MySQL 8.0
-
去官网查看和下载 yum 包 :点击去官网
如果你的是 Linux 8 的系统,直接用这个地址 wget https://repo.mysql.com//mysql80-community-release-el8-1.noarch.rpm
-
安装 yum 包 rpm -ivh mysql80-community-release-el8-1.noarch.rpm
-
更新 yum yum update
-
安装 yum install mysql-server
-
设置权限 chown mysql:mysql -R /var/lib/mysql
-
初始化 mysqld --initialize --user=mysql
-
启动 systemctl start mysqld
很遗憾,启动失败,报错如下:
Job for mysqld.service failed because the control process exited with error code.
See "systemctl status mysqld.service" and "journalctl -xe" for details.
查看 MySQL 状态 systemctl status mysqld
信息如下:
● mysqld.service - MySQL 8.0 database server
Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-07-07 15:57:04 CST; 15s ago
Process: 13691 ExecStopPost=/usr/libexec/mysql-wait-stop (code=exited, status=0/SUCCESS)
Process: 13687 ExecStart=/usr/libexec/mysqld --basedir=/usr (code=exited, status=1/FAILURE)
Process: 13650 ExecStartPre=/usr/libexec/mysql-prepare-db-dir mysqld.service (code=exited, status=0/SUCCESS)
Process: 13626 ExecStartPre=/usr/libexec/mysql-check-socket (code=exited, status=0/SUCCESS)
Main PID: 13687 (code=exited, status=1/FAILURE)
Status: "Server startup in progress"
Error: 2 (No such file or directory)
Jul 07 15:57:04 iZuf6dou23krpyawdedba1Z systemd[1]: Starting MySQL 8.0 database server...
Jul 07 15:57:04 iZuf6dou23krpyawdedba1Z systemd[1]: mysqld.service: Main process exited, code=exited, status=1/FAILURE
Jul 07 15:57:04 iZuf6dou23krpyawdedba1Z systemd[1]: mysqld.service: Failed with result 'exit-code'.
Jul 07 15:57:04 iZuf6dou23krpyawdedba1Z systemd[1]: Failed to start MySQL 8.0 database server.
2020-07-07T08:23:35.729468Z 0 [System] [MY-010116] [Server] /usr/libexec/mysqld (mysqld 8.0.17) starting as process 14057
2020-07-07T08:23:35.737394Z 1 [ERROR] [MY-012271] [InnoDB] The innodb_system data file 'ibdata1' must be writable
2020-07-07T08:23:35.737413Z 1 [ERROR] [MY-012278] [InnoDB] The innodb_system data file 'ibdata1' must be writable
2020-07-07T08:23:35.737430Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2020-07-07T08:23:35.737528Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-07-07T08:23:35.737602Z 0 [ERROR] [MY-010119] [Server] Aborting
2020-07-07T08:23:35.737914Z 0 [System] [MY-010910] [Server] /usr/libexec/mysqld: Shutdown complete (mysqld 8.0.17) Source distribution.
-
日志一看,这就很清晰了,权限,无法写入数据的问题(/var/lib/mysql
),问题分析:最开始初始化的时候没有带上 --user=mysql
导致默认是以当前用户 root
身份来运行的,最开始的时候,我们把这个文件夹的用户和用户组都给 mysql
了,进入该目录,能看到很多文件的所有者都是 root
,可是MySQL启动是以 mysql
用户启动的,无法写入文件
-
再次启动 systemctl start mysqld
完美启动成功,nice
-
获取随机密码:grep "password" /var/log/mysql/mysqld.log
-
登陆MySQL,进行一些配置
# 登录mysql
mysql -uroot -p
# Enter password: (输入查询到的临时密码)
# 第一步:必须先修改密码,修改密码为我的邮箱,也可以通过该邮箱联系到我
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sxy@shuxiaoyuan.com';
# 刷新权限
flush privileges;
# 退出,重新登陆
目录结构
目录 |
说明 |
/var/lib/mysql |
mysql数据文件存放路径,可自定义 |
/etc/my.cnf |
mysql配置文件路径 |
/usr/lib64/mysql |
mysql库文件路径 |
/usr/bin/mysql* |
mysql二进制可执行文件路径 |
/etc/rc.d/init.d/mysqld |
mysql服务管理脚本地址 |
/var/log/mysqld.log |
mysql日志文件路径 |
Ubuntu 一键安装
apt update
apt install mysql-server
# 安装成功后,root密码为空,直接回车即可
mysql -u root -p
# 启用远程访问,将 bind-address = 127.0.0.1 给注释掉
vim /etc/mysql/mysql.conf.d
# 重启MySQL即可
源码安装
一、下载,先去官网瞅瞅:https://dev.mysql.com/downloads/mysql
官方安装手册(如果可以,尽量去看官方文档,懒得看,就看我这个吧):https://dev.mysql.com/doc/refman/5.7/en/installing-source-distribution.html
我这里选择的版本是:

下载源码:wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.30.tar.gz
- 安装 gcc 等编译工具
yum install -y cmake make gcc gcc-c++ openssl openssl-devel ncurses ncurses-devel bison bison-devel
二、解压 tar -zxvf mysql-boost-5.7.30.tar.gz
三、开始安装
# 安装 MySQL boost 依赖,如果你下载的是不带 Boots 的版本需要安装下 Boots,编译时需要带上这个路径
curl -o boost_1_59_0.tar.gz https://jaist.dl.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
tar -xzvf boost_1_59_0.tar.gz -C /usr/local/
cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.30 \
-DMYSQL_DATADIR=/usr/local/mysql-5.7.30/data \
-DSYSCONFDIR=/usr/local/mysql-5.7.30/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=ON \
-DWITH_MYISAM_STORAGE_ENGINE=ON \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DENABLED_LOCAL_INFILE=ON \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_UNIX_ADDR=/usr/local/mysql-5.7.30/tmp/mysql.sock \
-DWITH_INNODB_MEMCACHED=ON \
-DWITH_BOOST=./boost/boost_1_59_0
-
cmake成功后如下图所示:

-
开始编译:make
,这个过程会比较长(本机耗时:72min),可以去喝杯茶,上个厕所,打个游戏

-
若编译失败,解决问题后可清理重新编译(成功就不用运行了)
make clean
rm CMakeCache.txt
-
编译成功,开始安装:make install
,这个很快,默认安装位置 /usr/local/mysql

四、安装完成后配置
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
cd /usr/local/mysql-5.7.30
mkdir data etc tmp logs
# 打开配置文件
vi /etc/profile
# 在文件末尾加入下面代码,:wq保存退出(无权限可:q!强制退出,换root账户重来)
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
# 使环境变量即时生效
source /etc/profile
# 复制配置文件到系统服务配置
cp support-files/mysql.server /etc/init.d/mysql
# 重新加载系统服务配置
systemctl daemon-reload
# 启动mysql服务
systemctl start mysql
# 下面列出其余systemctl命令
# 查看mysql服务状态
systemctl status mysql
# 停止mysql服务
systemctl stop mysql
# 重新启动mysql服务
systemctl restart mysql
# 配置mysql开机自动启动
systemctl enable mysql
# 配置mysql开机不自动启动
systemctl disable mysql
# 查询生成的临时密码
grep "password" /usr/local/mysql/logs/error.log
# 登录mysql
mysql -uroot -p
# Enter password: (输入查询到的临时密码)
# 修改密码为我的邮箱,可以通过联系到我
ALTER USER 'root'@'localhost' IDENTIFIED BY 'sxy@shuxiaoyuan.com';
# 授予权限,所有权限(all),所有库(*.*),root用户,任何主机(%),具体可查看MySQL账号权限管理章节
grant all privileges on *.* to 'root'@'%' identified by 'sxy@shuxiaoyuan.com' with grant option;
# 刷新权限
flush privileges;
# 退出,重新登陆
# 查看防火墙状态
systemctl status firewalld
# 查看3306端口状态
firewall-cmd --zone=public --query-port=3306/tcp
# 打开3306端口,--permanent 永久生效(无此参数重启后失效)
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 下面列出相关命令给喜欢折腾的朋友(教程已完结后面不用依次执行了)
# 开启防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 删除3306端口
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
附录一:cmake 参数解释
- cmake参数解释,仅解释常用配置,详细可官方文档查询,我这是阅遍后总结的
参数 |
说明 |
.. |
源码目录为上级目录 |
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql |
指定MySQL安装目录 |
-DMYSQL_DATADIR=/usr/local/mysql/data |
指定MySQL数据目录 |
-DSYSCONFDIR=/usr/local/mysql/etc |
指定my.cnf选项文件目录 |
-DWITH_INNOBASE_STORAGE_ENGINE=ON |
Innodb引擎 |
-DWITH_MYISAM_STORAGE_ENGINE=ON |
MyISAM引擎 |
-DDEFAULT_CHARSET=utf8 |
服务器字符集,默认latin1 |
-DDEFAULT_COLLATION=utf8_general_ci |
服务器排序规则,默认latin1_swedish_ci |
-DENABLED_LOCAL_INFILE=ON |
是否为加载数据启用本地,默认为OFF |
-DMYSQL_TCP_PORT=3306 |
服务器监听端口,默认为3306 |
-DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock |
Unix套接字文件路径,默认/tmp/mysql.sock |
-DWITH_INNODB_MEMCACHED=ON |
是否生成memcached共享库,默认OFF |
-DWITH_BOOST=../boost/boost_1_59_0 |
Boost库源代码的位置,指向下载的源码包里,相对/绝对路径皆可 |
附录二:my.cnf 配置文件
[client] #客户端设置
port=3306 #服务器监听端口,默认为3306
socket=/usr/local/mysql-5.7.30/tmp/mysql.sock #Unix套接字文件路径,默认/tmp/mysql.sock
[mysqld] #服务端设置
## 一般配置选项
port=3306 #服务器监听端口,默认为3306
basedir=/usr/local/mysql-5.7.30 #MySQL安装根目录
datadir=/usr/local/mysql-5.7.30/data #MySQL数据文件目录
socket=/usr/local/mysql-5.7.30/tmp/mysql.sock #Unix套接字文件路径,默认/tmp/mysql.sock
pid-file=/usr/local/mysql-5.7.30/tmp/mysql.pid #服务进程pid文件路径
character_set_server=utf8 #默认字符集
default_storage_engine=InnoDB #默认InnoDB存储引擎
user=mysql
## 连接配置选项
max_connections=200 #最大并发连接数
table_open_cache=400 #表打开缓存大小,默认2000
open_files_limit=1000 #打开文件数限制,默认5000
max_connect_errors=200 #最大连接失败数,默认100
back_log=100 #请求连接队列数
connect_timeout=20 #连接超时时间,默认10秒
interactive_timeout=1200 #交互式超时时间,默认28800秒
wait_timeout=600 #非交互超时时间,默认28800秒
net_read_timeout=30 #读取超时时间,默认30秒
net_write_timeout=60 #写入超时时间,默认60秒
max_allowed_packet=8M #最大传输数据字节,默认4M
thread_cache_size=10 #线程缓冲区(池)大小
thread_stack=256K #线程栈大小,32位平台196608、64位平台262144
## 临时内存配置选项
tmpdir=/tmp #临时目录路径
tmp_table_size=64M #临时表大小,默认16M
max_heap_table_size=64M #最大内存表大小,默认16M
sort_buffer_size=1M #排序缓冲区大小,默认256K
join_buffer_size=1M #join缓冲区大小,默认256K
## Innodb配置选项
#innodb_thread_concurrency=0 #InnoDB线程并发数
innodb_io_capacity=200 #IO容量,可用于InnoDB后台任务的每秒I/O操作数(IOPS),
innodb_io_capacity_max=400 #IO最大容量,InnoDB在这种情况下由后台任务执行的最大IOPS数
innodb_lock_wait_timeout=50 #InnoDB引擎锁等待超时时间,默认50(单位:秒)
innodb_buffer_pool_size=512M #InnoDB缓冲池大小,默认128M
innodb_buffer_pool_instances=4 #InnoDB缓冲池划分区域数
innodb_max_dirty_pages_pct=75 #缓冲池最大允许脏页比例,默认为75
innodb_flush_method=O_DIRECT #日志刷新方法,默认为fdatasync
innodb_flush_log_at_trx_commit=2 #事务日志刷新方式,默认为0
transaction_isolation=REPEATABLE-READ #事务隔离级别,默认REPEATABLE-READ
innodb_data_home_dir=/usr/local/mysql-5.7.30/data #表空间文件路径,默认保存在MySQL的datadir中
innodb_data_file_path=ibdata1:128M:autoextend #表空间文件大小
innodb_file_per_table=ON #每表独立表空间
innodb_log_group_home_dir=/usr/local/mysql-5.7.30/data #redoLog文件目录,默认保存在MySQL的datadir中
innodb_log_files_in_group=2 #日志组中的日志文件数,默认为2
innodb_log_file_size=128M #日志文件大小,默认为48MB
innodb_log_buffer_size=32M #日志缓冲区大小,默认为16MB
## MyISAM配置选项
key_buffer_size=32M #索引缓冲区大小,默认8M
read_buffer_size=4M #顺序读缓区冲大小,默认128K
read_rnd_buffer_size=4M #随机读缓冲区大小,默认256K
bulk_insert_buffer_size=8M #块插入缓冲区大小,默认8M
myisam_sort_buffer_size=8M #MyISAM排序缓冲大小,默认8M
#myisam_max_sort_file_size=1G #MyISAM排序最大临时大小
myisam_repair_threads=1 #MyISAM修复线程
skip-external-locking #跳过外部锁定,启用文件锁会影响性能
## 日志配置选项
log_output=FILE #日志输出目标,TABLE(输出到表)、FILE(输出到文件)、NONE(不输出),可选择一个或多个以逗>号分隔
log_error=/usr/local/mysql-5.7.30/logs/error.log #错误日志存放路径
log_error_verbosity=1 #错误日志过滤,允许的值为1(仅错误),2(错误和警告),3(错误、警告和注释),默认值为3。
log_timestamps=SYSTEM #错误日志消息格式,日志中显示时间戳的时区,UTC(默认值)和 SYSTEM(本地系统时区)
general_log=OFF #开启查询日志,一般选择不开启,因为查询日志记录很详细,会增大磁盘IO开销,影响性能
general_log_file=/usr/local/mysql-5.7.30/logs/general.log #通用查询日志存放路径
## 慢查询日志配置选项
slow_query_log=ON #开启慢查询日志
slow_query_log_file=/usr/local/mysql-5.7.30/logs/slowq.log #慢查询日志存放路径
long_query_time=2 #慢查询时间,默认10(单位:秒)
min_examined_row_limit=100 #最小检查行限制,检索的行数必须达到此值才可被记为慢查询
log_slow_admin_statements=ON #记录慢查询管理语句
log_queries_not_using_indexes=ON #记录查询未使用索引语句
log_throttle_queries_not_using_indexes=5 #记录未使用索引速率限制,默认为0不限制
log_slow_slave_statements=ON #记录从库复制的慢查询,作为从库时生效,从库复制中如果有慢查询也将被记录
## 复制配置选项
server-id=1 #MySQL服务唯一标识
log-bin=mysql-bin #开启二进制日志,默认位置是datadir数据目录
log-bin-index=mysql-bin.index #binlog索引文件
binlog_format=MIXED #binlog日志格式,分三种:STATEMENT、ROW或MIXED,MySQL 5.7.7之前默认为STATEMENT,之后默认为ROW
binlog_cache_size=1M #binlog缓存大小,默认32KB
max_binlog_cache_size=1G #binlog最大缓存大小,推荐最大值为4GB
max_binlog_size=256M #binlog最大文件大小,最小值为4096字节,最大值和默认值为1GB
expire_logs_days=7 #binlog过期天数,默认为0不自动删除
log_slave_updates=ON #binlog级联复制
sync_binlog=1 #binlog同步频率,0为禁用同步(最佳性能,但可能丢失事务),为1开启同步(影响性能,但最安全不会丢失任何事务),为N操作N次事务后同步1次
relay_log=relay-bin #relaylog文件路径,默认位置是datadir数据目录
relay_log_index=relay-log.index #relaylog索引文件
max_relay_log_size=256M #relaylog最大文件大小
relay_log_purge=ON #中继日志自动清除,默认值为1(ON)
relay_log_recovery=ON #中继日志自动恢复
auto_increment_offset=1 #自增值偏移量
auto_increment_increment=1 #自增值自增量
slave_net_timeout=60 #从机连接超时时间
replicate-wild-ignore-table=mysql.% #复制时忽略的数据库表,告诉从线程不要复制到与给定通配符模式匹配的表
skip-slave-start #跳过Slave启动,Slave复制进程不随MySQL启动而启动
## 其他配置选项
#memlock=ON #开启内存锁,此选项生效需系统支持mlockall()调用,将mysqld进程锁定在内存中,防止遇到操作系统导致mysqld交换到磁盘的问题
[mysqldump] #mysqldump数据库备份工具
quick #强制mysqldump从服务器查询取得记录直接输出,而不是取得所有记录后将它们缓存到内存中
max_allowed_packet=100M #最大传输数据字节,使用mysqldump工具备份数据库时,某表过大会导致备份失败,需要增大该值(大>于表大小即可)
[myisamchk] #使用myisamchk实用程序可以用来获得有关你的数据库表的统计信息或检查、修复、优化他们
key_buffer_size=32M #索引缓冲区大小
myisam_sort_buffer_size=8M #排序缓冲区大小
read_buffer_size=4M #读取缓区冲大小
write_buffer_size=4M #写入缓冲区大小
附录三:参考链接
-
参考安装链接 https://blog.csdn.net/qq_32656561/article/details/103593869
-
MySQL yum 包下载:https://dev.mysql.com/downloads/repo/yum/
-
https://blog.csdn.net/jwx90312/article/details/105862466
Swoole
GitHub地址
1.直接使用Swoole官方的二进制包 (初学者 + 开发环境)
下载地址
2.使用PHP官方的PECL工具安装 (初学者)
pecl install swoole
在安装过程中会提示你是否安装其他的扩展等,具体如下
// 是否启用 PHP Sockets 支持,如果你需要用 PHP 编写 Sockets 服务,可以启用此项。
enable sockets supports? [no] : no
// 是否启用 OpenSSL 加密支持
enable openssl support? [no] : no
// 是否启用 HTTP2 支持
// 了解 HTTP2 新特性 https://zh.wikipedia.org/wiki/HTTP/2
enable http2 support? [no] : no
// 官方说安装这个, 只是为了支持mysql->escape方法
enable mysqlnd support? [no] : no
3.从源码编译安装 (推荐)
cd swoole-src && \
phpize && \
./configure && \
make && sudo make install
安装成功截图

安装成功,添加扩展
vim /etc/php.ini
# 加入下面一行
extension=swoole.so
重启 php-fpm 和 nginx
查看是否有该扩展了 php -m
报错
报错1
没有c++库
error: C++ preprocessor "/lib/cpp" fails sanity check
解决办法:yum install glibc-headers
和 yum install gcc-c++
报错2
没有openssl/ssl此类文件或目录
error: openssl/ssl.h: No such file or directory
解决办法 yum install openssl-devel
报错3
error: Enable http2 support,require nghttp2 library
解决办法
wget https://github.com/nghttp2/nghttp2/releases/download/v1.34.0/nghttp2-1.34.0.tar.bz2
tar -xjf nghttp2-1.34.0.tar.bz2
报错4
PHP Warning: Module 'swoole' already loaded in Unknown on line 0
解决办法:
在修改配置时extension=swoole.so别放在最后,最好放在extension=sockets.so后面
Redis
yum 安装
直接安装 yum install -y redis
启动:systemctl start redis
停止:systemctl stop redis
重启:systemctl restart redis
加入开机启动:systemctl enable redis
连接redis redis-cli
如果安装版本过低,可以更新 yum 源,然后再安装
# 更新 yum 源
yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# 安装 redis
yum --enablerepo=remi install redis
# 修改部分配置
vim /etc/redis.conf
# 启动 redis
systemctl start redis
# 测试链接 redis
redis-cli
源码安装
因为 Redis 6 说开启了多线程,这里源码安装的就是 Redis6
# 下载
wget http://download.redis.io/releases/redis-6.0.5.tar.gz
# 移动位置,我一般是安装在 /usr/local/ 下
mkdir /usr/local/redis
mv redis-6.0.5.tar.gz /usr/local/redis/
# 解压
tar xzf redis-6.0.5.tar.gz
cd redis-6.0.5
# 编译和安装
make
make install PREFIX=/usr/local/redis/redis6
# 配置启动等
# 创建一个存放日志和数据的文件夹
mkdir /usr/local/redis/redis6/data
mkdir /usr/local/redis/redis6/log
# 复制配置文件
cp /usr/local/redis/redis-6.0.5/redis.conf /usr/local/redis/redis6/bin/
# 编辑配置文件
vim /usr/local/redis/redis6/bin/redis.conf
# 修改1.修改成如下所示
# daemonize no 改为yes,开启后台运行,默认是前台运行
daemonize yes
# 修改2.把这一行注释,监听所有IP
# bind 127.0.0.1
# 修改3.requirpass,保护模式开启的时候要配置密码或者bind ip,保护模式建议开启
requirepass 123456
# 修改4.protected-mode yes 如果改为no,则是关闭保护模式,这种模式下不能配置系统服务,建议还是开启
protected-mode yes
# 修改5.修改本参数,指定数据目录,默认是 ./
dir /usr/local/redis/redis6/data
# 修改6.修改本参数,指定日志目录
logfile "/usr/local/redis/redis6/log/redis.log"
# 配置文件修改结束
# 编辑启动脚本
vim /lib/systemd/system/redis.service
# 输入以下命令,此行不需要输入
[Unit]
Description=Redis
After=network.target
[Service]
Type=forking
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis/redis6/bin/redis-server /usr/local/redis/redis6/bin/redis.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 输入完毕,此行不需要输入
使用systemctl命令
# 重载服务
systemctl daemon-reload
# 开机自启
systemctl enable redis
# 启动
systemctl start redis
# 重启
systemctl restart redis
# 停止
systemctl stop redis
# 查看状态
systemctl status redis
# 关闭开机启动
systemctl disable redis
设置密码并允许其他IP连接
vim /etc/redis.conf
# 找到 bind 127.0.0.1,加上你的白名单IP,设置成 0.0.0.0 或者屏蔽都表示默认允许所有IP连接
# bind 127.0.0.1
# 找到 port 6379 这个为redis端口,根据需要修改
port 6379
# 修改以下配置为 yes,以守护进程的方式运行,就是关闭了远程连接窗口,redis依然运行
daemonize yes
# 修改 protected-mode 模式为no
protected-mode no
# 设置密码,默认是注释了的
requirepass password
线上禁用危险命令
编辑配置文件,找到 SECURITY 关键字,在此处添加需要禁用或者重命名的命令
一般危险的操作命令如下:
Docker
Docker安装
参考此文档吧:点击此处
可以直接安装 yum -y install docker-ce
如果安装版本较低,就先卸载然后按照如下步骤安装
一、先卸载旧版本的docker
yum remove docker docker-common docker-selinux docker-engine
或者 npm -qa | grep docker
找出安装包后卸载
二、安装需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
三、设置Docker yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
四、查看所有仓库中所有docker版本
yum list docker-ce --showduplicates | sort -r
五、安装docker
yum install -y docker-ce
六、如果要安装特定版本 yum install docker-ce-18.06.1.ce
七、设置开机启动 systemctl enable docker
八、启动docker systemctl start docker
九、查看状态 systemctl status docker
简单例子来了解docker使用方法
# 下载一个Python应用
docker pull training/webapp
# 在docker中运行这个应用
docker run -d -P training/webapp python app.py
- -d:让容器在后台运行。
- -P:将容器内部使用的网络端口映射到我们使用的主机上。可以是IP+端口形式,也可以直接是端口
查看 WEB 应用容器
- 使用
docker ps
来查看我们正在运行的容器:

可以直接在浏览器输入 http://ip:端口
来访问我们的项目,这里输出了一个 Hello world!
网络端口的快捷方式
- 快速查看网络端口:
docker port CONTAINER ID
或者 docker port NAMES
例如: docker port ac4a42521910
或 docker port docker port xenodochial_banzai
查看 WEB 应用程序日志
docker logs [ID或者名字] 可以查看容器内部的标准输出。
-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。

查看WEB应用程序容器的进程
使用 docker top 来查看容器内部运行的进程
[root@iZuf67ycxvw0ovvqhgmiv0Z ~]# docker top ac4a42521910
UID PID PPID C STIME TTY TIME CMD
root 2589 2572 0 21:00 ? 00:00:00 python app.py
检查 WEB 应用程序
使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息。
[root@iZuf67ycxvw0ovvqhgmiv0Z ~]# docker inspect ac4a42521910
[
{
"Id": "ac4a42521910a57f3c341383b06178c9a980bce13e8506054709238acccaf756",
"Created": "2019-07-27T13:00:41.906264114Z",
"Path": "python",
"Args": [
"app.py"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 2589,
"ExitCode": 0,
"Error": "",
"StartedAt": "2019-07-27T13:00:43.058897945Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
.........................
停止 WEB 应用容器
docker stop ac4a42521910
重启WEB应用容器
docker restart ac4a42521910
docker ps -l 查询最后一次创建的容器:
移除WEB应用容器
docker rm ac4a42521910
删除前必须先停止
docker安装PHP环境
CentOS 安装 Docker
略
docker 搭建 PHP 开发环境
拉取相应镜像
docker pull nginx:1.25.0
docker pull mysql:8.0.33
docker pull redis:7
docker pull php:7.4-fpm
创建网络
docker network create -d bridge my-net
# 查看网络
docker network inspect my-net
准备映射目录
cd
mkdir -p docker/mysql docker/redis docker/nginx/conf.d docker/nginx/logs
Nginx
准备配置文件
# 主配置文件
vim ~/docker/nginx/nginx.conf
# 写入如下内容
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
# 虚拟站点文件
启动 nginx
容器
docker run -dp 80:80 -p 443:443 --name nginx --network my-net --mount type=bind,source=/root/docker/nginx/logs,target=/var/log/nginx --mount type=bind,source=/root/docker/nginx/nginx.conf,target=/etc/nginx/nginx.conf --mount type=bind,source=/root/docker/nginx/conf.d,target=/etc/nginx/conf.d --mount type=bind,source=/root/docker/nginx/cert,target=/etc/nginx/cert --mount type=bind,source=/www,target=/www nginx:1.25.0
redis
准备配置文件
vim /root/docker/redis/redis.conf
# 写入如下内容,这里只配置了端口和密码,全的配置请自行添加
port 6379
requirepass 123456
启动 redis
容器
docker run --name redis7 -dp 6379:6379 --network my-net --mount type=bind,source=/root/docker/redis,target=/data --mount type=bind,source=/root/docker/redis/redis.conf,target=/data/redis.conf redis:7 redis-server /data/redis.conf
测试连接:OK
MySQL
# 设置密码 123456,记得换掉
docker run --name mysql -it -dp 3306:3306 --network my-net -e MYSQL_ROOT_PASSWORD=123456 --mount type=bind,source=/root/docker/mysql,target=/var/lib/mysql mysql:8.0.33
PHP
docker run -d --name php74 --network my-net --mount type=bind,source=/www,target=/www php:7.4-fpm
dockerfile
php
编写 dockerfile 文件,下面是注释版
采用 git 拉取代码方式
# 以官方的 php:7.4-fpm 为基础镜像
FROM php:7.4-fpm
# 执行命令
RUN set -eux \
# 更新源
&& apt-get update \
# 安装 git,如不需要可以不用安装
# 注意:安装这个很耗时,一般不需要安装,可以采用复制,将整个代码复制到镜像中去
&& apt-get install -y git \
# 安装 php zip 扩展所需要的依赖
&& apt-get install -y zlib1g-dev \
&& apt-get install -y libzip-dev \
# 安装 php gd 扩展所需要的依赖
&& apt-get install -y libpng-dev \
# 安装 PHP 扩展,pdo_mysql、zip、bcmath、gd、redis
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install zip \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install gd \
# Redis 扩展需要这样安装
&& pecl install -o -f redis \
# 创建 php.ini 文件
&& cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini \
# 将 Redis 扩展写入 php.ini 文件中
&& echo "extension=redis.so" >> /usr/local/etc/php/php.ini \
&& cd \
# 安装 composer,非必须,可以直接将提前准备好的 composer 复制进镜像
&& php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" \
&& php composer-setup.php \
# 设置 composer 环境变量
&& mv composer.phar /usr/local/bin/composer \
&& mkdir /www \
&& cd /www \
# 拉取代码,可以采用将宿主机的整个代码copy到镜像中
&& git clone https://用户名:密码@gitee.com/shuxiaoyuan/code_hooks.git \
# 执行 composer
&& composer install \
如果git账号密码有特殊字符,转义如下

采用 COPY 代码方式
FROM php:7.4-fpm
WORKDIR /www
# 将当前目录下的所有文件复制到镜像的 /www/code_hooks 目录中
COPY . /www/code_hooks
RUN set -eux \
&& apt-get update \
&& apt-get install -y zlib1g-dev \
&& apt-get install -y libzip-dev \
&& apt-get install -y libpng-dev \
&& docker-php-ext-install pdo_mysql \
&& docker-php-ext-install zip \
&& docker-php-ext-install bcmath \
&& docker-php-ext-install gd \
&& pecl install -o -f redis \
&& rm -rf /tmp/pear \
&& docker-php-ext-enable redis\
&& cp /usr/local/etc/php/php.ini-production /usr/local/etc/php/php.ini \
&& php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');" \
&& php composer-setup.php \
&& mv composer.phar /usr/local/bin/composer
构建镜像
# -f 指定 dockerfile 文件位置, -t 指定镜像名和版本号,别忘了最后面有一个 .
docker build -f .\php74-fpm-1 -t shuxiaoyuan/php74:v1.3 .
安装免费证书
CentoS 8 安装
安装 Enable EPEL
官网地址:https://certbot.eff.org/
# yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
# ARCH=$( /bin/arch )
# subscription-manager repos --enable "codeready-builder-for-rhel-8-${ARCH}-rpms"
# dnf config-manager --set-enabled PowerTools
安装 Certbot
dnf install certbot python3-certbot-nginx
运行 Certbot,并且自动配置证书
certbot --nginx
运行后效果如下图所示:

只需要获取证书,然后自己安装
certbot certonly --nginx
自动续签
这个证书只有三个月有效期,所有要自动续签,自动续签也很简单,添加定时任务即可
echo "0 0,12 * * * root python3 -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
CentoS 7 安装
安装 Enable EPEL
# 启用软件源
yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum-config-manager repos --enable "rhel-*-optional-rpms" --enable "rhel-*-extras-rpms" --enable "rhel-ha-for-rhel-*-server-rpms"
# 安装 Certbot for Nginx
yum install certbot python2-certbot-nginx
运行 Certbot,并且自动配置证书,到这里就 GG 了,哈哈哈
certbot --nginx

因为年代久远的问题,Python 包很多不可用了,最好是卸载后重新安装最新的,不介绍
备用办法:采用脚本安装
运行后如下所示:
会自动将 http 重定向到 HTTPS ,如果不想,自己取消即可
Complete!
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): sxy@shuxiaoyuan.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: dev-test.shuxiaoyuan.com
2: yapi.shuxiaoyuan.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1,2
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for dev-test.shuxiaoyuan.com
http-01 challenge for yapi.shuxiaoyuan.com
Waiting for verification...
Cleaning up challenges
Deploying Certificate to VirtualHost /etc/nginx/conf.d/dev-test.shuxiaoyuan.com.conf
Deploying Certificate to VirtualHost /etc/nginx/conf.d/YApi.shuxiaoyuan.com.conf
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/dev-test.shuxiaoyuan.com.conf
Redirecting all traffic on port 80 to ssl in /etc/nginx/conf.d/YApi.shuxiaoyuan.com.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://dev-test.shuxiaoyuan.com
and https://yapi.shuxiaoyuan.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Subscribe to the EFF mailing list (email: sxy@shuxiaoyuan.com).
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/dev-test.shuxiaoyuan.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/dev-test.shuxiaoyuan.com/privkey.pem
Your cert will expire on 2020-10-19. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again with the "certonly" option. To non-interactively renew *all*
of your certificates, run "certbot-auto renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Yapi 搭建
Supervisor
yum安装(推荐)
yum install epel-release
yum install -y supervisor
systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务
systemctl status supervisord # 查看supervisord服务状态
ps -ef|grep supervisord # 查看是否存在supervisord进程
supervisorctl status 查看状态
配置
Supervisor 主配置文件在 /etc/supervisord.conf
,文件最后引入了 files = supervisord.d/*.ini
,所以我们在该目录添加我们的配置文件
注:所有的配置项都在主配置文件里面,可以参考主配置文件里面的这段 [program:theprogramname]
一个简单的启动 laravel-swoole 的配置文件如下
[program:laravel_dev_swoole] ; 程序名称
directory=/www/laravel_dev/current ; 进入该目录
command=php /www/laravel_dev/current/artisan swoole:http restart ; 执行命令
process_name=%(program_name)s_%(process_num)02d ; 默认 %(program_name)s,numprocs > 1 时需要如上所示
numprocs=1 ; 启动的进程数,默认为1
autostart=true ; 是否自启动,默认为true
startretries=3 ; 最大重启次数
autorestart=true ; 是否自动重启,默认为true
user=shuxiaoyuan ; 运行的用户
; 重定向输出的日志
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
environment=GO_ENV=debug,NODE_ENV=debug
stdout_logfile=/home/deployer/laravel_dev/swoole.log ; stdout 日志文件,注意:不会自动创建目录,会自动创建文件
注:在 Laravel 中,command=php artisan queue:work --queue=default,wechat --sleep=3 --tries=3 --timeout=110 --daemon,--timeout 应该永远都要比 config/queue.php- retry_after 短至少几秒钟的时间。这样就能保证任务进程总能在失败重试前就被杀死了。如果你的 --timeout 选项大于 retry_after 配置选项,你的任务可能被执行两次
完整配置参数
[program:theprogramname]
# the program (relative uses PATH, can take args)
command=/bin/cat
# 默认保持
process_name=%(program_name)s
# 进程数
numprocs=1
# 执行任务之前先 cd 到该目录
directory=/tmp
# 进程的umask(默认为None)
umask=022
# 相对开始优先级(默认999)
priority=999
# 是否自启动,默认为true
autostart=true
# 是否自动重启,默认为true
autorestart=true
# 必须保持运行的秒数(默认值1)
startsecs=10
# 最大启动失败次数
startretries=3
# 'expected' exit codes for process (default 0,2)
exitcodes=0,2
# 用于终止进程的信号(默认为TERM)
stopsignal=QUIT
#等待b4 SIGKILL的最大秒数(默认为10)
stopwaitsecs=10
# 运行的用户
user=chrism
# 将proc stderr重定向到stdout(默认为false)
redirect_stderr=true
# stdout日志路径,无则为无;默认自动
stdout_logfile=/a/path
# max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_maxbytes=1MB
# 标准输出日志文件备份(默认为10)
stdout_logfile_backups=10
# 'capturemode'中的字节数(默认为0)
stdout_capture_maxbytes=1MB
# 在标准输出写入时发出事件(默认为false)
stdout_events_enabled=false
# stderr日志路径,无则为无;默认自动
stderr_logfile=/a/path
# 最大日志文件字节b4轮换(默认50MB)
stderr_logfile_maxbytes=1MB
# stderr日志文件备份(默认为10)
stderr_logfile_backups=10
# 'capturemode'中的字节数(默认为0)
stderr_capture_maxbytes=1MB
# 在stderr写入时发出事件(默认为false)
stderr_events_enabled=false
# 流程环境添加(def没有添加)
environment=A=1,B=2
# 覆盖serverurl计算(childutils)
serverurl=AUTO
附录一:配置文件详解
[unix_http_server]
file=/tmp/supervisor.sock ; socket文件的路径,supervisorctl用XML_RPC和supervisord通信就是通过它进行
的。如果不设置的话,supervisorctl也就不能用了
不设置的话,默认为none。 非必须设置
;chmod=0700 ; 这个简单,就是修改上面的那个socket文件的权限为0700
不设置的话,默认为0700。 非必须设置
;chown=nobody:nogroup ; 这个一样,修改上面的那个socket文件的属组为user.group
不设置的话,默认为启动supervisord进程的用户及属组。非必须设置
;username=user ; 使用supervisorctl连接的时候,认证的用户
不设置的话,默认为不需要用户。 非必须设置
;password=123 ; 和上面的用户名对应的密码,可以直接使用明码,也可以使用SHA加密
如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
默认不设置。。。非必须设置
;[inet_http_server] ; 侦听在TCP上的socket,Web Server和远程的supervisorctl都要用到他
不设置的话,默认为不开启。非必须设置
;port=127.0.0.1:9001 ; 这个是侦听的IP和端口,侦听所有IP用 :9001或*:9001。
这个必须设置,只要上面的[inet_http_server]开启了,就必须设置它
;username=user ; 这个和上面的uinx_http_server一个样。非必须设置
;password=123 ; 这个也一个样。非必须设置
[supervisord] ;这个主要是定义supervisord这个服务端进程的一些参数的
这个必须设置,不设置,supervisor就不用干活了
logfile=/tmp/supervisord.log ; 这个是supervisord这个主进程的日志路径,注意和子进程的日志不搭嘎。
默认路径$CWD/supervisord.log,$CWD是当前目录。。非必须设置
logfile_maxbytes=50MB ; 这个是上面那个日志文件的最大的大小,当超过50M的时候,会生成一个新的日
志文件。当设置为0时,表示不限制文件大小
默认值是50M,非必须设置。
logfile_backups=10 ; 日志文件保持的数量,supervisor在启动程序时,会自动创建10个buckup文件,用于log rotate
当设置为0时,表示不限制文件的数量。
默认情况下为10。。。非必须设置
loglevel=info ; 日志级别,有critical, error, warn, info, debug, trace, or blather等
默认为info。。。非必须设置项
pidfile=/tmp/supervisord.pid ; supervisord的pid文件路径。
默认为$CWD/supervisord.pid。。。非必须设置
nodaemon=false ; 如果是true,supervisord进程将在前台运行
默认为false,也就是后台以守护进程运行。。。非必须设置
minfds=1024 ; 这个是最少系统空闲的文件描述符,低于这个值supervisor将不会启动。
系统的文件描述符在这里设置cat /proc/sys/fs/file-max
默认情况下为1024。。。非必须设置
minprocs=200 ; 最小可用的进程描述符,低于这个值supervisor也将不会正常启动。
ulimit -u这个命令,可以查看linux下面用户的最大进程数
默认为200。。。非必须设置
;umask=022 ; 进程创建文件的掩码
默认为022。。非必须设置项
;user=chrism ; 这个参数可以设置一个非root用户,当我们以root用户启动supervisord之后。
我这里面设置的这个用户,也可以对supervisord进行管理
默认情况是不设置。。。非必须设置项
;identifier=supervisor ; 这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个
supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个
supervisor设置不同的标识符了
默认是supervisord。。。非必需设置
;directory=/tmp ; 这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动
supervisord进程之前,会先切换到这个目录
默认不设置。。。非必须设置
;nocleanup=true ; 这个参数当为false的时候,会在supervisord进程启动的时候,把以前子进程
产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当
然不想日志被清除了。所以可以设置为true
默认是false,有调试需求的同学可以设置为true。。。非必须设置
;childlogdir=/tmp ; 当子进程日志路径为AUTO的时候,子进程日志文件的存放路径。
默认路径是这个东西,执行下面的这个命令看看就OK了,处理的东西就默认路径
python -c "import tempfile;print tempfile.gettempdir()"
非必须设置
;environment=KEY="value" ; 这个是用来设置环境变量的,supervisord在linux中启动默认继承了linux的
环境变量,在这里可以设置supervisord进程特有的其他环境变量。
supervisord启动子进程时,子进程会拷贝父进程的内存空间内容。 所以设置的
这些环境变量也会被子进程继承。
小例子:environment=name="haha",age="hehe"
默认为不设置。。。非必须设置
;strip_ansi=false ; 这个选项如果设置为true,会清除子进程日志中的所有ANSI 序列。什么是ANSI
序列呢?就是我们的\n,\t这些东西。
默认为false。。。非必须设置
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor] ;这个选项是给XML_RPC用的,当然你如果想使用supervisord或者web server 这
个选项必须要开启的
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl] ;这个主要是针对supervisorctl的一些配置
serverurl=unix:///tmp/supervisor.sock ; 这个是supervisorctl本地连接supervisord的时候,本地UNIX socket
路径,注意这个是和前面的[unix_http_server]对应的
默认值就是unix:///tmp/supervisor.sock。。非必须设置
;serverurl=http://127.0.0.1:9001 ; 这个是supervisorctl远程连接supervisord的时候,用到的TCP socket路径
注意这个和前面的[inet_http_server]对应
默认就是http://127.0.0.1:9001。。。非必须项
;username=chris ; 用户名
默认空。。非必须设置
;password=123 ; 密码
默认空。。非必须设置
;prompt=mysupervisor ; 输入用户名密码时候的提示符
默认supervisor。。非必须设置
;history_file=~/.sc_history ; 这个参数和shell中的history类似,我们可以用上下键来查找前面执行过的命令
默认是no file的。。所以我们想要有这种功能,必须指定一个文件。。。非
必须设置
; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.
;[program:theprogramname] ;这个就是咱们要管理的子进程了,":"后面的是名字,最好别乱写和实际进程
有点关联最好。这样的program我们可以设置一个或多个,一个program就是
要被管理的一个进程
;command=/bin/cat ; 这个就是我们的要启动进程的命令路径了,可以带参数
例子:/home/test.py -a 'hehe'
有一点需要注意的是,我们的command只能是那种在终端运行的进程,不能是
守护进程。这个想想也知道了,比如说command=service httpd start。
httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令
这已经不是严格意义的子进程了。
这个是个必须设置的项
;process_name=%(program_name)s ; 这个是进程名,如果我们下面的numprocs参数为1的话,就不用管这个参数
了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字,
但是如果numprocs为多个的话,那就不能这么干了。想想也知道,不可能每个
进程都用同一个进程名吧。
;numprocs=1 ; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置
默认为1 。。非必须设置
;directory=/tmp ; 进程运行前,会前切换到这个目录
默认不设置。。。非必须设置
;umask=022 ; 进程掩码,默认none,非必须
;priority=999 ; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭
默认值为999 。。非必须设置
;autostart=true ; 如果是true的话,子进程将在supervisord启动后被自动启动
默认就是true 。。非必须设置
;autorestart=unexpected ; 这个是设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected
和true。如果为false的时候,无论什么情况下,都不会被重新启动,
如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退
出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无
条件的重启
;startsecs=1 ; 这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启
动成功了
默认值为1 。。非必须设置
;startretries=3 ; 当进程启动失败后,最大尝试启动的次数。。当超过3次后,supervisor将把
此进程的状态置为FAIL
默认值为3 。。非必须设置
;exitcodes=0,2 ; 注意和上面的的autorestart=unexpected对应。。exitcodes里面的定义的
退出码是expected的。
;stopsignal=QUIT ; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号
默认为TERM 。。当用设定的信号去干掉进程,退出码会被认为是expected
非必须设置
;stopwaitsecs=10 ; 这个是当我们向子进程发送stopsignal信号后,到系统返回信息
给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该
子进程发送一个强制kill的信号。
默认为10秒。。非必须设置
;stopasgroup=false ; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有
子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程
有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的
整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。
需要注意的是,该选项发送的是stop信号
默认为false。。非必须设置。。
;killasgroup=false ; 这个和上面的stopasgroup类似,不过发送的是kill信号
;user=chrism ; 如果supervisord是root启动,我们在这里设置这个非root用户,可以用来
管理该program
默认不设置。。。非必须设置项
;redirect_stderr=true ; 如果为true,则stderr的日志会被写入stdout日志文件中
默认为false,非必须设置
;stdout_logfile=/a/path ; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项。
设置为none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方
生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被
清空。当 redirect_stderr=true的时候,sterr也会写进这个日志文件
;stdout_logfile_maxbytes=1MB ; 日志文件最大大小,和[supervisord]中定义的一样。默认为50
;stdout_logfile_backups=10 ; 和[supervisord]定义的一样。默认10
;stdout_capture_maxbytes=1MB ; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout
发送信息,而supervisor可以根据信息,发送相应的event。
默认为0,为0的时候表达关闭管道。。。非必须项
;stdout_events_enabled=false ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将
触发supervisord发送PROCESS_LOG_STDOUT类型的event
默认为false。。。非必须设置
;stderr_logfile=/a/path ; 这个东西是设置stderr写的日志路径,当redirect_stderr=true。这个就不用
设置了,设置了也是白搭。因为它会被写入stdout_logfile的同一个文件中
默认为AUTO,也就是随便找个地存,supervisord重启被清空。。非必须设置
;stderr_logfile_maxbytes=1MB ; 这个出现好几次了,就不重复了
;stderr_logfile_backups=10 ; 这个也是
;stderr_capture_maxbytes=1MB ; 这个一样,和stdout_capture一样。 默认为0,关闭状态
;stderr_events_enabled=false ; 这个也是一样,默认为false
;environment=A="1",B="2" ; 这个是该子进程的环境变量,和别的子进程是不共享的
;serverurl=AUTO ;
; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.
;[eventlistener:theeventlistenername] ;这个东西其实和program的地位是一样的,也是suopervisor启动的子进
程,不过它干的活是订阅supervisord发送的event。他的名字就叫
listener了。我们可以在listener里面做一系列处理,比如报警等等
楼主这两天干的活,就是弄的这玩意
;command=/bin/eventlistener ; 这个和上面的program一样,表示listener的可执行文件的路径
;process_name=%(program_name)s ; 这个也一样,进程名,当下面的numprocs为多个的时候,才需要。否则默认就
OK了
;numprocs=1 ; 相同的listener启动的个数
;events=EVENT ; event事件的类型,也就是说,只有写在这个地方的事件类型。才会被发送
;buffer_size=10 ; 这个是event队列缓存大小,单位不太清楚,楼主猜测应该是个吧。当buffer
超过10的时候,最旧的event将会被清除,并把新的event放进去。
默认值为10。。非必须选项
;directory=/tmp ; 进程执行前,会切换到这个目录下执行
默认为不切换。。。非必须
;umask=022 ; 淹没,默认为none,不说了
;priority=-1 ; 启动优先级,默认-1,也不扯了
;autostart=true ; 是否随supervisord启动一起启动,默认true
;autorestart=unexpected ; 是否自动重启,和program一个样,分true,false,unexpected等,注意
unexpected和exitcodes的关系
;startsecs=1 ; 也是一样,进程启动后跑了几秒钟,才被认定为成功启动,默认1
;startretries=3 ; 失败最大尝试次数,默认3
;exitcodes=0,2 ; 期望或者说预料中的进程退出码,
;stopsignal=QUIT ; 干掉进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程
那么会被认为是正常维护,退出码也被认为是expected中的
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false ; send stop signal to the UNIX process group (default false)
;killasgroup=false ; SIGKILL the UNIX process group (def false)
;user=chrism ;设置普通用户,可以用来管理该listener进程。
默认为空。。非必须设置
;redirect_stderr=true ; 为true的话,stderr的log会并入stdout的log里面
默认为false。。。非必须设置
;stdout_logfile=/a/path ; 这个不说了,好几遍了
;stdout_logfile_maxbytes=1MB ; 这个也是
;stdout_logfile_backups=10 ; 这个也是
;stdout_events_enabled=false ; 这个其实是错的,listener是不能发送event
;stderr_logfile=/a/path ; 这个也是
;stderr_logfile_maxbytes=1MB ; 这个也是
;stderr_logfile_backups ; 这个不说了
;stderr_events_enabled=false ; 这个也是错的,listener不能发送event
;environment=A="1",B="2" ; 这个是该子进程的环境变量
默认为空。。。非必须设置
;serverurl=AUTO ; override serverurl computation (childutils)
; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.
;[group:thegroupname] ;这个东西就是给programs分组,划分到组里面的program。我们就不用一个一个去操作了
我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,就相当于原来
的配置从supervisor的配置文件里消失了。。。supervisor只会对组进行管理,而不再
会对组里面的单个program进行管理了
;programs=progname1,progname2 ; 组成员,用逗号分开
这个是个必须的设置项
;priority=999 ; 优先级,相对于组和组之间说的
默认999。。非必须选项
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
;[include] ;这个东西挺有用的,当我们要管理的进程很多的时候,写在一个文件里面
就有点大了。我们可以把配置信息写到多个文件中,然后include过来
;files = relative/directory/*.ini
OK,上面提到的非必须设置项,一般来说,都是有默认值的,可以根据自己的需要去设置。。。如果不设置的,supervisor也能用起来.
GitLab
安装依赖
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
下载 rpm 安装包
下载版本可以去历史版本中查找,本地安装的比较旧,是为了和公司版本保持一致,需要注意你系统版本,下载中有如下所示 el/7
# 8.7.5
wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-8.7.5-ce.0.el7.x86_64.rpm/download.rpm
# 13.1.0
wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-13.1.0-ce.0.el7.x86_64.rpm/download.rpm
安装
yum install gitlab-ce-8.7.5-ce.0.el7.x86_64

修改配置等
# 修改 URL 地址
vim /etc/gitlab/gitlab.rb
将 external_url 修改成你的地址
运行 gitlab-ctl reconfigure
让它跑完,要一会的,如下图所示:

运行 gitlab-ctl restart
如下图所示:

附录
centOS
防火墙
查看防火墙状态 systemctl status firewalld.service
开启 systemctl start firewalld.service
关闭 systemctl stop firewalld.service
禁止自启动 systemctl disable firewalld.service
开机自启动 systemctl enable firewalld.service
selinux 关闭
临时关闭 setenforce 0
# 彻底关闭方法
vim /etc/selinux/config
# 修改 SELINUX=enforcing 改为 SELINUX=disabled
#修改后
SELINUX=enable
图形化界面和命令行界面切换
init 3 切换到 dos 界面
init 5 切换到图形界面模式
# 开机以某个默认方式启动
# 一、先删除默认的链接
rm /etc/systemd/system/default.target
# 二、创建新的连接
# multi-user.target 为 dos 界面,graphical.target 为图形化界面
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
# 三、重启
reboot
Ubuntu
之前一直是用 centOS,现在换成 Ubuntu,记录下常见的命令和软件安装
php
# 安装 php8.1 及其扩展
sudo apt install php8.1-cli php8.1-common php8.1-zip php8.1-mbstring php8.1-gd php8.1-mysql php8.1-redis php8.1-bcmath php8.1-curl php8.1-pdo-mysql php8.1-simplexml php8.1-xml
# 安装 pecl
sudo apt install php php-pear php-dev libmcrypt-dev
# 安装 xlswriter 扩展
sudo apt install zlib1g-dev
sudo pecl install xlswriter
# 修改 php.ini
sudo vim /etc/php/8.1/cli/php.ini
extension=xlswriter.so
# 安装 mcrypt 扩展
sudo apt-get -y install gcc make autoconf libc-dev pkg-config
sudo apt-get -y install libmcrypt-dev
sudo pecl install mcrypt
# 修改 php.ini
sudo vim /etc/php/8.1/cli/php.ini
extension=mcrypt.so
nginx
# 安装
sudo apt-get install nginx
# 启动,停止等
service nginx start | stop | restart
# 查看是否在运行
ps -e | grep nginx
# 文件路径
/usr/sbin/nginx:主程序
/etc/nginx:存放配置文件
/usr/share/nginx:存放静态文件
/var/log/nginx:存放日志
关闭防火墙
# 查看状态,active 开启状态,inactive 关闭状态
sudo ufw enable
# 关闭防火墙
sudo ufw disable
# 开启防火墙
sudo ufw enable
开启 ssh 登录
# 是否安装了 ssh-server 服务
dpkg -l | grep ssh
# 如果没有找到 openssh-server,则安装
sudo apt-get install openssh-server
# 查看服务是否启动
ps -e | grep ssh
# 如果没有,则启动
sudo /etc/init.d/ssh start
或
sudo service ssh start
# 启动报错,sshd: no hostkeys available -- exiting.
# 解决办法,生成 ssh 即可,证书路径:/etc/ssh/
sudo ssh-keygen -A
# 配置
配置文件位于 /etc/ssh/sshd_config,在这里可以定义SSH的服务端口,默认端口是22,你可以自己定义成其他端口号,然后重启SSH服务:
sudo /etc/init.d/ssh stop
sudo /etc/init.d/ssh start
Mac 环境搭建
这里主要介绍 docker 搭建
下载安装 docker
使用阿里云镜像
搭建前准备工作
# 新建一个网络,容器内的所有通讯走这个网络
docker network create -d bridge my-net
# 若无特殊说明,一般都是采用文件挂载的方式
# 如需指定版本,去 https://hub.docker.com 上面找
# 下文为了便于阅读和理解,将命令拆分成了多行,执行时请合并成一行
docker pull nginx
docker redis:6
docker mysql:8
docker php:7.4-fpm
安装 nginx
# 拉去最新的 nginx 镜像,也可以拉取指定版本
docker pull nginx
# 运行
docker run -dp 80:80 --name nginx
# 加入网络
--network my-net
# 日志文件目录
--mount type=bind,source=/Users/dwy/shuxiaoyuan/docker/nginx/logs,target=/var/log/nginx
# 主配置文件,要先搞一份配置文件,不让起不来的
--mount type=bind,source=/Users/dwy/shuxiaoyuan/docker/nginx/nginx.conf,target=/etc/nginx/nginx.conf
# conf.d 配置文件目录
--mount type=bind,source=/Users/dwy/shuxiaoyuan/docker/nginx/conf.d,target=/etc/nginx/conf.d
# 代码目录
--mount type=bind,source=/Users/dwy/shuxiaoyuan/mycode,target=/www
nginx:latest
nginx 主配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
nginx 多站点配置
# 默认站点:default.conf
server {
listen 80;
listen [::]:80;
server_name localhost;
#access_log /var/log/nginx/host.access.log main;
#location / {
# root /usr/share/nginx/html;
# index index.html index.htm;
#}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
#error_page 500 502 503 504 /50x.html;
#location = /50x.html {
# root /usr/share/nginx/html;
#}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# 站点一:test1.conf
server {
listen 80;
server_name test1-docker.com;
# 这个地方是容器内的目录地址,不要搞成宿主机的了
root /www/test1/public;
location / {
index index.php index.htm index.html;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
root /www/test1;
# 这个地方要填写容器内 php-fpm的IP地址,也可以直接使用容器名
fastcgi_pass 172.18.0.5:9000;
fastcgi_index index.php;
# 这个地方也要指到 public 目录下才行
fastcgi_param SCRIPT_FILENAME /www/test1/public/$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/test1-docker.com-access.log main;
}
# 站点二:test2.conf
server {
listen 80;
server_name test2.com;
root /www/test2/public;
location / {
index index.php index.htm index.html;
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
root /www/test2;
fastcgi_pass php74:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/test2/public/$fastcgi_script_name;
include fastcgi_params;
}
access_log /var/log/nginx/test2.com-access.log main;
}
安装 redis
# 地址:https://hub.docker.com/_/redis
docker pull redis:6
# 为了便于查看,下面将命令拆分成了多行,实际是一行
# 运行docker,取名,端口映射
docker run --name redis6 -dp 6379:6379
# 加入网络
--network my-net
# 挂载文件或目录
--mount type=bind,source=/Users/dwy/shuxiaoyuan/docker/redis/data,target=/data
--mount type=bind,source=/Users/dwy/shuxiaoyuan/docker/redis/data/redis.conf,target=/data/redis.conf
# 以redis:6为镜像,用配置文件启动
redis:6 redis-server /data/redis.conf
--appendonly yes
redis 配置文件说明
上面启动 Redis 时,用的配置文件启动的,配置文件挂载在本地的,后续可以在本地修改配置文件,然后重新启动容器即可,下面简单的写了两个配置,更详细的可以去找 Redis 的完整配置文件
port 6379
requirepass 123456
安装 mysql
# 设置密码 123456
docker run --name mysql -it -dp 3306:3306 --network my-net -e MYSQL_ROOT_PASSWORD=123456 --mount type=bind,source=/Users/dwy/shuxiaoyuan/docker/mysql,target=/var/lib/mysql mysql:latest
安装 PHP
https://hub.docker.com/_/php
# 支持的标签
https://github.com/docker-library/docs/blob/master/php/README.md#supported-tags-and-respective-dockerfile-links
# 运行,PHP无需映射端口
docker run -d --name php74 --network my-net --mount type=bind,source=/Users/dwy/shuxiaoyuan/mycode,target=/www php:7.4-fpm
后续安装扩展等
也可以用我制作的镜像,里面安装了composer和大部分扩展
docker pull shuxiaoyuan/php74:v1.3
点击这里
HomeBrew
安装 HomeBrew
如果你试过:git代理,VPN,删文件等还是没解决,那就用国内镜像
采用国内镜像
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
安装如下图所示

======================== 分割线 ========================

参考链接
https://gitee.com/cunkai/HomebrewCN/
Mac_wget_HomeBrew
Mac_Nginx_源码安装
Mac_Redis_源码安装
Redis 安装
#去官网下载对应版本安装包
# 解压:
tar zxvf redis-redis-5.0.7.tar.gz
# 移动:
mv redis-redis-5.0.7 /usr/local/
# 切换路径:
cd /usr/local/redis-5.0.7/
# 编译测试
sudo make test
# 编译安装
sudo make install
出现以下表示安装成功了

前台运行 redis-server
运行后是前台启动,如果需要后台守护进程启动,需要修改配置文件

配置
配置等:后台运行,守护进程,密码设置等等
如果不安装守护进程的话,Redis就必须一直在前台运行,如果关掉了窗口就导致Redis服务停掉了。这样肯定是不行的,所以接下来必须要安装守护进程
配置:在Redis目录下创建 bin、etc、db三个目录
将Redis/src目录下的几个文件(mkreleasehdr.sh,redis-benchmark, redis-check-rdb, redis-cli, redis-server)拷贝到bin目录下
cd /usr/local/redis-5.0.7/bin
cp ../src/redis-benchmark .
。。。。。。自己复制。。。。。。
将Redis.conf 拷贝到 etc目录下,修改配置文件
vim /usr/local/redis-5.0.7/etc/redis.conf
# 修改为守护模式
daemonize yes
# 设置进程锁文件
pidfile /usr/local/redis-5.0.7/redis.pid
# 端口
port 6379
# 设置密码
requirepass Shu.xiaoyuan@163.com
# 客户端超时时间
timeout 300
# 日志级别
loglevel debug
# 日志文件位置
logfile /usr/local/redis-5.0.7/log-redis.log
# 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
##指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
#save <seconds> <changes>
#Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
#指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,
#可以关闭该#选项,但会导致数据库文件变的巨大
rdbcompression yes
#指定本地数据库文件名
dbfilename dump.rdb
#指定本地数据库路径
dir /usr/local/redis-5.0.7/db/
#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能
#会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有
#的数据会在一段时间内只存在于内存中
appendonly no
#指定更新日志条件,共有3个可选值:
#no:表示等操作系统进行数据缓存同步到磁盘(快)
#always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
#everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec
- 带配置文件启动Redis服务 redis-server /usr/local/redis-5.0.7/etc
- 查询当前Redis的进程
ps aux | grep redis
- 正确的关闭Redis:给Redis发送shutdown命令,redis-cli shutdown,如果无效,就进去Redis的安装目录
查看日志:tail -f log-redis.log
Mac_MySQL
MySQL 5.7.28
MySQL直接去官网下载即可,官网地址:点击去官网下载
Mac_Apache_自带
Apache 默认会安装
Mac 自带 Apache,查看版本 httpd -v
-
配置文件位置:/etc/apache2/httpd.conf
可以在配置文件末加一行 Include /private/etc/apache2/other/*.conf
引入其他配置文件
-
默认网站根目录:/Library/WebServer/Documents
-
启动等命令 apachectl start stop restart
-
优化 URL,开启 Apache 的 mod_rewrite
模块
-
启用多站点
-
开启 Apache 的 mod_vhost_alias
模块
-
开启 mod_log_config
模块
-
开启 Include /private/etc/apache2/extra/httpd-vhosts.conf
# 编辑主配置文件: httpd.conf
在 228行为:
<Directory />
AllowOverride none
Require all denied ## 这一行,拒绝所有链接了
</Directory>
改为如下形式:
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
# 在一下配置文件中,添加你的虚拟站点
/private/etc/apache2/extra/httpd-vhosts.conf
Mac_php_Homebrew
PHP 采用 Homebrew 安装
brew tap homebrew/core
brew tap josegonzalez/php

- 安装 PHP 7.3
brew install php@7.3

# 加入 PATH 环境变量中
sudo vim ~/.bash_profile
export PATH="$(brew --prefix php@7.2)/bin:$PATH"
source ~/.bash_profile
-
配置文件(php.ini,php-fpm.conf等)位置 /usr/local/etc/php/7.3
-
安装位置 /usr/local/Cellar/php@7.3/7.3.20
-
启动,在安装完成后会有提示,最后几行 brew services start | stop | restart php@7.3
-
查看版本 php -v
-
查看扩展 php -m
安装 Redis 扩展
如果直接采用 brew 安装 Redis 不成功,就自己去编译安装即可,编译安装步骤,其他扩展也可同理安装
- 去官网下载 Redis 扩展,点击去官网
- 解压,进入解压后文件夹
- 执行
phpize
,如果你有多个PHP版本,执行 phpize
时带上完整路径,本机 phpize
位置 /usr/local/Cellar/php@7.3/7.3.20/bin/phpize
- 执行
./configure
一般会自动寻找PHP安装位置,如果需要手动指定位置 ../configure --with-php-config=/usr/local/php7.4/bin/php-config
-
make && make install
安装后会告诉你路径的,本机 Installing shared extensions: /usr/local/Cellar/php@7.3/7.3.20/pecl/20180731/
- 编辑 php.ini 文件
- 添加Redis扩展即可
- 重启 PHP
- 查看扩展是否开启
php -m | grep redis
Mac_Nginx_HomeBrew
Nginx 采用 Homebrew 安装
- 使用 Homebrew 安装 Nginx,安装如下所示
dev:Homebrew shuxiaoyuan$ brew install nginx
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/openssl%401.1-1.1.1g.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/pcre-8.44.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Downloading https://mirrors.ustc.edu.cn/homebrew-bottles/bottles/nginx-1.19.1.mojave.bottle.tar.gz
######################################################################## 100.0%
==> Installing dependencies for nginx: openssl@1.1 and pcre
==> Installing nginx dependency: openssl@1.1
==> Pouring openssl@1.1-1.1.1g.mojave.bottle.tar.gz
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
/usr/local/etc/openssl@1.1/certs
and run
/usr/local/opt/openssl@1.1/bin/c_rehash
openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.
If you need to have openssl@1.1 first in your PATH run:
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> /Users/shuxiaoyuan/.bash_profile
For compilers to find openssl@1.1 you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
==> Summary
/usr/local/Cellar/openssl@1.1/1.1.1g: 8,059 files, 18MB
==> Installing nginx dependency: pcre
==> Pouring pcre-8.44.mojave.bottle.tar.gz
/usr/local/Cellar/pcre/8.44: 204 files, 5.5MB
==> Installing nginx
==> Pouring nginx-1.19.1.mojave.bottle.tar.gz
==> Caveats
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.
To have launchd start nginx now and restart at login:
brew services start nginx
Or, if you don't want/need a background service you can just run:
nginx
==> Summary
/usr/local/Cellar/nginx/1.19.1: 25 files, 2.1MB
==> Caveats
==> openssl@1.1
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
/usr/local/etc/openssl@1.1/certs
and run
/usr/local/opt/openssl@1.1/bin/c_rehash
openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because macOS provides LibreSSL.
If you need to have openssl@1.1 first in your PATH run:
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> /Users/shuxiaoyuan/.bash_profile
For compilers to find openssl@1.1 you may need to set:
export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"
==> nginx
Docroot is: /usr/local/var/www
The default port has been set in /usr/local/etc/nginx/nginx.conf to 8080 so that
nginx can run without sudo.
nginx will load all files in /usr/local/etc/nginx/servers/.
To have launchd start nginx now and restart at login:
brew services start nginx
Or, if you don't want/need a background service you can just run:
nginx
- 一些命令,差不多,启动默认是 8080 端口,安装完成后都会告诉你,具体看上面的
# 检查配置文件
nginx -t
# 重新加载配置文件
nginx -s reload
# 启动,停止,重启
brew services start nginx
brew services stop nginx
brew services restart nginx
# 配置文件位置
/usr/local/etc/nginx/nginx.conf
Windows 环境搭建
Windows 下就用集成环境就好了
xp.cn
谷歌浏览器崩溃:https://zhuanlan.zhihu.com/p/133243870
wsl
安装在其他盘
wsl 避免安装在 C 盘,导致占用空间多大的问题
https://docs.microsoft.com/en-us/windows/wsl/install-manual 在这里下载安装包,扩展名改成zip,解压放在其他盘,打开 ubuntu.exe 安装
安装 centOS
安装 Chocolatey
NuGet(读作New Get)是用于微软.NET开发平台的软件包管理器,是一个Visual Studio的扩展。Chocolatey 是基于 NuGet 的一个软件包管理器,就像 Linux 中的 yum 或 apt 一样,在 Windows10 中也可以用命令行安装程序了。
右键单击开始菜单,选择 Windows PowerShell(管理员),打开一个具有管理员权限的 PowerShell 窗口,输入命令并回车:
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
完成后,输入命令:choco ,如果能正确显示版本号,说明安装成功。
安装 lxrunoffline
LxRunOffline 是非常实用的 WSL 管理软件,可以备份、创建、恢复、导出 WSL 子系统,也可以安装适配 WSL 的任何 Linux 发行版,可以将 WSL 子系统安装到任意目录中。
choco install lxrunoffline -y
安装时需要从 github 拉取相应文件,自行梯子
安装完成后重新以管理员身份打开 PowerShell 执行后续的操作

下载 centOS 镜像
下载地址:https://github.com/mishamosher/CentOS-WSL/releases/tag/8-stream-20210603
下载后解压,解压文件中有一个 rootfs.tar.gz 文件,就是基于这个文件进行安装
安装 centOS
lxrunoffline install -n CentOS -d D:/CentOS8 -f D:\CentOS8\rootfs.tar.gz
# 参数解释
-d : 安装 centOS 的目录
-f : rootfs.tar.gz 文件存放路径
转换成 wsl2
wsl --set-version CentOS 2

使用 terminal 进入系统

wsl使用
切换默认用户为 root
C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps\ubuntu2204.exe config --default-user root
关闭 wsl
wsl --shutdown
Ubuntu24.04
默认会安装php8.3
安装 PHP7.4
sudo apt update
sudo apt upgrade -y
sudo apt install software-properties-common -y
# 添加 PHP 存储库
LC_ALL=C.UTF-8 sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
# 安装
sudo apt install php8.3 -y
sudo apt install php8.2 -y
sudo apt install php7.4 -y
# 安装扩展
sudo apt install phpX.X-extension_name
# 示例安装 Redis 扩展
sudo apt install php7.4-redis
LxRunOffline 使用教程
使用 LxRunOffline 转移 WSL 安装目录
查看系统中已安装的 WSL lxrunoffline l
输入命令对 WSL 的目录进行移动 lxrunoffline m -n <WSL名称> -d <路径>
最后查看路径,进行确认 lxrunoffline di -n <WSL名称>
使用 LxRunOffline 备份和恢复 WSL
查看系统中已安装的 WSL wsl -l
Vmware
php安装imagick扩展
多个php版本使用composer问题
前言
一般电脑上会有一个默认的 php 版本和 composer,这是设置了环境变量的,我们的思想是在不动系统任何的环境变量情况下实现多版本的切换。
下载 composer.phar
文件
去 composer官网 下载一个 composer.phar
文件

移动 composer.phar
文件
将下载下来的 composer.phar
文件 随便放在一个目录,最好还是放在和 php
同级目录

测试 composer
运行时需要带上全路径的 php.exe
和 composer.phar

实际项目使用

Windows上Docker
创建网络
docker network create -d bridge my-net
拉取镜像
docker pull nginx
docker pull mysql:8
docker pull redis:6
docker pull shuxiaoyuan/php:8.0.28.v2
docker pull shuxiaoyuan/php74:v1.5
运行镜像
nginx
docker run -d -p 80:80 -p 443:443 --name nginx --mount type=bind,source=D:\MyCode,target=/www --mount type=bind,source=D:\MyCode\Docker\mount\Nginx\logs,target=/var/log/nginx --mount type=bind,source=D:\MyCode\Docker\mount\Nginx\conf\nginx.conf,target=/etc/nginx/nginx.conf --mount type=bind,source=D:\MyCode\Docker\mount\Nginx\conf\conf.d,target=/etc/nginx/conf.d --network my-net nginx:latest
MySQL
docker run --name mysql -it -d -p 33060:3306 --network my-net -e MYSQL_ROOT_PASSWORD=123456 --mount type=bind,source=D:\MyCode\Docker\mount\MySQL,target=/var/lib/mysql mysql:latest
Redis
docker run --name redis6 -d -p 63790:6379 --network my-net --mount type=bind,source=D:\MyCode\Docker\mount\Redis\6\data,target=/data --mount type=bind,source=D:\MyCode\Docker\mount\Redis\6\config\redis.conf,target=/etc/redis/redis.conf redis:6 redis-server /etc/redis/redis.conf --appendonly yes
PHP7.4
docker run --name php74 -d --mount type=bind,source=D:\MyCode,target=/www --network my-net shuxiaoyuan/php74:v1.5
php8.0
docker run --name php80 -d --mount type=bind,source=D:\MyCode,target=/www --network my-net shuxiaoyuan/php:8.0.28.v2
Docker安装使用
下载 docker 桌面端
官网地址:https://www.docker.com/
IIS部署Laravel
OneDrive-API
注册应用:
https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
API接口登录
文档:https://learn.microsoft.com/zh-cn/onedrive/developer/rest-api/getting-started/graph-oauth?view=odsp-graph-online
开启多租户
报错如下的话,开启这个多租户
AADSTS50194: Application '23ae37f3-548d-44dc-9ad1-f7c4cd75636b'(test) is not configured as a multi-tenant application. Usage of the /common endpoint is not supported for such applications created after '10/15/2018'. Use a tenant-specific endpoint or configure the application to be multi-tenant.

构造URL,令牌流
报错: AADSTS700051: response_type 'token' is not enabled for the application.
需要开启令牌

重定向URL必须和上图配置的一样才行
构造授权URL后,重定向的URL为如下所示
https://demo-dev.shuxiaoyuan.com/test/onedrive/redirectUri#access_token=eyJ0xxxxtSSJ9.exxx.UxxxLJg&token_type=Bearer&expires_in=4129&scope=Files.Read.All+profile+openid+email&session_state=d5bd8ebf-865d-4e71-85bf-7128319006d8
构造URL,代码流
如果报这个错的话,给应用开启一个回调地址即可

token流必须要开启这个
