环境搭建和各种软件安装

Linux 环境搭建

主要介绍 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 install

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 config -g repo.packagist composer https://packagist.phpcomposer.com

  • 阿里镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer

项目配置其他镜像

  • 中国镜像:composer config repo.packagist composer https://packagist.phpcomposer.com

  • 阿里镜像:composer config repo.packagist composer https://mirrors.aliyun.com/composer

取消配置

  • 全局取消配置:composer config -g --unset repos.packagist

  • 项目取消配置:composer config --unset repos.packagist

安装依赖包

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字符集

登录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.
  • 重新初始化,带参 mysqld --initialize --user=mysql 还是无效

  • 还是看日志吧:vim /var/log/mysql/mysqld.log 还好不是很大,如果很大,就先清空 :&d 整个日志内容,然后再启动 systemctl start mysqld 一下,生成的部分日志如下所示:

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

三、开始安装

  • 进入解压目录 cd mysql-5.7.30
# 安装 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

四、安装完成后配置

  • 创建一个mysql用户和组
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
  • 创建相应目录
cd /usr/local/mysql-5.7.30
mkdir data etc tmp logs
  • 将目录权限授予 MySQL 用户和用户组 chown -R mysql:mysql /usr/local/mysql-5.7.30

  • 文件权限 chmod -R 750 待定

  • 创建 my.cnf 配置文件,见附录

  • 使用配置初始化数据目录 bin/mysqld --defaults-file=/usr/local/mysql-5.7.30/etc/my.cnf --initialize --user=mysql

  • 配置环境变量

# 打开配置文件
vi /etc/profile
# 在文件末尾加入下面代码,:wq保存退出(无权限可:q!强制退出,换root账户重来)
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
# 使环境变量即时生效
source /etc/profile
  • 配置 systemctl 方式启动 MySQL
# 复制配置文件到系统服务配置
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
  • 修改 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-headersyum 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 关键字,在此处添加需要禁用或者重命名的命令

一般危险的操作命令如下:

  • flushdb,清空数据库

  • flushall,清空所有记录,数据库

  • config,客户端连接后可配置服务器

  • keys,客户端连接后可查看所有存在的键

    rename-command KEYS "" # 禁用该命令 rename-command KEYS shuxiaoyuan # 重命名该命令

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 ac4a42521910docker 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 包很多不可用了,最好是卸载后重新安装最新的,不介绍

备用办法:采用脚本安装

  • 获取安装脚本 wget https://dl.eff.org/certbot-auto

  • 赋予可执行权限 sudo chmod a+x ./certbot-auto

  • 运行脚本 ./certbot-auto

运行后如下所示: 会自动将 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 搭建

Ypai

详情见单独抽取出的文档 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

brew install wget

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 模块

  • 启用多站点

  1. 开启 Apache 的 mod_vhost_alias 模块

  2. 开启 mod_log_config 模块

  3. 开启 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 brew search 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 不成功,就自己去编译安装即可,编译安装步骤,其他扩展也可同理安装

  1. 去官网下载 Redis 扩展,点击去官网
  2. 解压,进入解压后文件夹
  3. 执行 phpize ,如果你有多个PHP版本,执行 phpize 时带上完整路径,本机 phpize 位置 /usr/local/Cellar/php@7.3/7.3.20/bin/phpize
  4. 执行 ./configure 一般会自动寻找PHP安装位置,如果需要手动指定位置 ../configure --with-php-config=/usr/local/php7.4/bin/php-config
  5. make && make install 安装后会告诉你路径的,本机 Installing shared extensions: /usr/local/Cellar/php@7.3/7.3.20/pecl/20180731/
  6. 编辑 php.ini 文件
  7. 添加Redis扩展即可
  8. 重启 PHP
  9. 查看扩展是否开启 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

安装 centOS

配置

网络

共享文件夹

php安装imagick扩展
多个php版本使用composer问题

前言

一般电脑上会有一个默认的 php 版本和 composer,这是设置了环境变量的,我们的思想是在不动系统任何的环境变量情况下实现多版本的切换。

下载 composer.phar 文件

composer官网 下载一个 composer.phar 文件

移动 composer.phar 文件

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

测试 composer

运行时需要带上全路径的 php.execomposer.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

开启 IIS 的 CGI

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流必须要开启这个