镜像下载、域名解析、时间同步请点击阿里云开源镜像站
LNMP是Linux + Nginx + MySQL + PHP 四个系统的首字母缩写,相对于 LAMP(Linux + Apache + MySQL + PHP )来说的。曾经在虚拟主机建站界风靡一时,随着新的编程语言和容器技术、微服务等发展,慢慢没落了,尤其是PHP编程语言的使用量急剧下降了。
WordPress是一款能让您建立出色网站、博客或应用程序的开源软件。它具有美观的设计,强大的功能,可以助您自由发挥心中所想。WordPress既是免费的,也是无价的。
本实践过程中的系统及环境描述
L:Linux https://mirrors.aliyun.com/centos/
N:Nginx https://nginx.org/en/download.html
M:MySQL https://dev.mysql.com/downloads/mysql/
P:PHP http://php.net/downloads.php
Wordpress https://cn.wordpress.org/latest-zh_CN.tar.gz
#部署规划:
192.168.250.47:Nginx php-fpm 运行web服务
192.168.250.48:运行MySQL数据库,Redis服务
1. 架构拓扑及主机说明
三台主机
1 1台 Linux+Nginx+PHP+WordPress (简称 LNP) 服务器 :
主机名:LNP-Server-IP47
CentOS 7.9
IP:192.168.250.47
2 1台 MySQL+Redis 服务器 :
主机名: MySQL-Redis-IP48
CentOS 8.4
IP:192.168.250.48/24
3 1台 client主机 :
WIN10-PC机
2. 准备 MySQL 数据库
CentOS系统的优化,可以查以前的文章;按照架构图修改好主机名
[root@CentOS84-IP48 ]#hostnamectl set-hostname MySQL-Redis-IP48
[root@CentOS84-IP48 ]#exit
yum 安装 mysql-server 数据库
[root@MySQL-Redis-IP48 ]#yum info mysql-server
Last metadata expiration check: 19:31:21 ago on Mon 28 Mar 2022 02:34:38 AM CST.
Available Packages
Name : mysql-server
Version : 8.0.26
[root@MySQL-Redis-IP48 ]#yum -y install mysql-server
启动服务并开启自启
[root@MySQL-Redis-IP48 ]#systemctl enable --now mysqld
进入数据库
[root@MySQL-Redis-IP48 ]#mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
创建 wordpress 库
mysql> create database wordpress;
Query OK, 1 row affected (0.00 sec)
创建wordpress的数据库账户名和密码
mysql> create user wordpress@'192.168.250.%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
数据库授权
mysql> grant all on wordpress.* to wordpress@'192.168.250.%';
Query OK, 0 rows affected (0.01 sec)
本机登录并验证数据库
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| wordpress |
+--------------------+
5 rows in set (0.01 sec)
mysql> use wordpress
Database changed
mysql> show tables;
Empty set (0.00 sec)
mysql> quit
Bye
[root@MySQL-Redis-IP48 ]#
3. 网络验证MySQL服务
通过网络在另外一台机器上登录上面建好的数据库服务器
安装数据库客户端 mysql 包
[root@CentOS84-IP172-48 ]#yum -y install mysql
网络方式登录远程数据库
[root@CentOS84-IP172-48 ]#mysql -uwordpress -p123456 -h192.168.250.48
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.26 Source distribution
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| wordpress |
+--------------------+
2 rows in set (0.00 sec)
mysql>
4. 配置 LNP 服务器
基本任务: 编译安装和部署 php 支持 redis,并准备配置和启动服务文件,启动 php-fpm; 编译安装Nginx ,并准备配置和启动服务文件,启动Nginx
4.1 部署php-fpm服务
按照架构图修改好主机名
[root@centos79 <sub>]# hostnamectl set-hostname LNP-Server-IP47
[root@centos79 </sub>]# exit
安装编译PHP需要的依赖包
[root@lnp-server-ip47 ]# yum -y install gcc openssl-devel libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel
下载 php-7.4.28.tar.xz 源码包
[root@lnp-server-ip47 src]# wget https://www.php.net/distributions/php-7.4.28.tar.xz
[root@lnp-server-ip47 src]# ll -h php-7.4.28.tar.xz
-rw-r--r-- 1 root root 10M Feb 15 21:40 php-7.4.28.tar.xz
解压源码包,进入源码包所在目录
[root@lnp-server-ip47 src]# tar xf php-7.4.28.tar.xz
[root@lnp-server-ip47 src]# ll
total 11220
drwxr-xr-x 9 1001 1001 186 Mar 28 17:06 nginx-1.20.2
-rw-r--r-- 1 root root 1062124 Nov 16 22:51 nginx-1.20.2.tar.gz
drwxrwxr-x 16 root root 4096 Feb 15 21:23 php-7.4.28
-rw-r--r-- 1 root root 10418352 Feb 15 21:40 php-7.4.28.tar.xz
准备编译参数
[root@lnp-server-ip47 src]#cd php-7.4.28/
[root@lnp-server-ip47 php-7.4.28]# ./configure --prefix=/apps/php74 --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --with-zlib --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --enable-mbstring --enable-xml --enable-sockets --enable-fpm -enable-maintainer-zts --disable-fileinfo
....................................
Thank you for using PHP. # 需要看到这个信息才算成功了
查看cpu个数,作为编译参数CPU选项输入
[root@lnp-server-ip47 nginx-1.20.2]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 8
On-line CPU(s) list: 0-7
[root@lnp-server-ip47 php-7.4.28]#
编译安装
[root@lnp-server-ip47 php-7.4.28]# make -j 8 && make install
................... #此处删除很多屏显内容,需要看到下面成功信息再进入下一步
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /apps/php74/lib/php/extensions/no-debug-zts-20190902/
Installing PHP CLI binary: /apps/php74/bin/
Installing PHP CLI man page: /apps/php74/php/man/man1/
Installing PHP FPM binary: /apps/php74/sbin/
Installing PHP FPM defconfig: /apps/php74/etc/
Installing PHP FPM man page: /apps/php74/php/man/man8/
Installing PHP FPM status page: /apps/php74/php/php/fpm/
Installing phpdbg binary: /apps/php74/bin/
Installing phpdbg man page: /apps/php74/php/man/man1/
Installing PHP CGI binary: /apps/php74/bin/
Installing PHP CGI man page: /apps/php74/php/man/man1/
Installing build environment: /apps/php74/lib/php/build/
Installing header files: /apps/php74/include/php/
Installing helper programs: /apps/php74/bin/
program: phpize
program: php-config
Installing man pages: /apps/php74/php/man/man1/
page: phpize.1
page: php-config.1
/usr/local/src/php-7.4.28/build/shtool install -c ext/phar/phar.phar /apps/php74/bin/phar.phar
ln -s -f phar.phar /apps/php74/bin/phar
Installing PDO headers: /apps/php74/include/php/ext/pdo/
##############################################################################
## 准备 php 配置文件
从配置文件模板复制,并进行修改
[root@lnp-server-ip47 php-7.4.28]# cp /usr/local/src/php-7.4.28/php.ini-production /etc/php.ini
进入当时编译参数内定义的目录 /apps/php74/ 从模板复制创建 php-fpm.conf
[root@lnp-server-ip47 php-7.4.28]# cd /apps/php74/etc
[root@lnp-server-ip47 etc]# cp php-fpm.conf.default php-fpm.conf
进入子配置文件目录,从模板 文件创建 www.conf
[root@lnp-server-ip47 etc]# cd php-fpm.d/
[root@lnp-server-ip47 php-fpm.d]# cp www.conf.default www.conf
[root@lnp-server-ip47 php-fpm.d]#
按照本实践的思路修改 www.conf
[root@lnp-server-ip47 php-fpm.d]# vim www.conf
;user = nobody
user = www
;group = nobody
group = www
;pm.status_path = /status
pm.status_path = /status
;ping.path = /ping
ping.path = /ping
;access.log = log/$pool.access.log
access.log = log/$pool.access.log
;slowlog = log/$pool.log.slow
slowlog = log/$pool.log.slow
修改后的 www.conf 文件去除 ; 注释行的所有文件内容 供比对
[root@lnp-server-ip47 php-fpm.d]# grep '^[^;]' www.conf
[www]
user = www
group = www
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.status_path = /status
ping.path = /ping
access.log = log/$pool.access.log
slowlog = log/$pool.log.slow
[root@lnp-server-ip47 php-fpm.d]#
创建 www 用户
[root@lnp-server-ip47 php-fpm.d]# useradd -r -s /sbin/nologin www
创建访问日志文件路径
[root@lnp-server-ip47 php-fpm.d]# mkdir /apps/php74/log
[root@lnp-server-ip47 php-fpm.d]#
##############################################################################
## 启动并验证 php-fpm 服务
检查配置文件语法等
[root@lnp-server-ip47 php-fpm.d]# /apps/php74/sbin/php-fpm -t
[28-Mar-2022 18:05:51] NOTICE: configuration file /apps/php74/etc/php-fpm.conf test is successful
准备启动服务文件
[root@lnp-server-ip47 php-fpm.d]# cp /usr/local/src/php-7.4.28/sapi/fpm/php-fpm.service /usr/lib/systemd/system/
启动并开机自启动 php-fpm
[root@lnp-server-ip47 php-fpm.d]# systemctl daemon-reload
[root@lnp-server-ip47 php-fpm.d]# systemctl enable --now php-fpm
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.
验证监听端口
[root@lnp-server-ip47 php-fpm.d]# ss -ltn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:9000 *:*
查看并跟踪 进程信息
[root@lnp-server-ip47 php-fpm.d]# pstree -p |grep php
|-php-fpm(20700)-+-php-fpm(20701)
| `-php-fpm(20702)
[root@lnp-server-ip47 php-fpm.d]# ps -ef |grep php
root 20700 1 0 18:06 ? 00:00:00 php-fpm: master process (/apps/php74/etc/php-fpm.conf)
www 20701 20700 0 18:06 ? 00:00:00 php-fpm: pool www
www 20702 20700 0 18:06 ? 00:00:00 php-fpm: pool www
root 20707 5036 0 18:07 pts/0 00:00:00 grep --color=auto php
[root@lnp-server-ip47 php-fpm.d]#
4.2 部署 Nginx 服务
4.2.1 编译安装 nginx
#### 编译安装 nginx
准备Nginx编译安装的依赖包
[root@lnp-server-ip47 <sub>]# yum -y install gcc pcre-devel openssl-devel zlib-devel
下载 nginx 1.20.2 源码包 一般/usr/local/src/ 作为源码文件存放目录
[root@lnp-server-ip47 </sub>]# cd /usr/local/src/
[root@lnp-server-ip47 src]# wget http://nginx.org/download/nginx-1.20.2.tar.gz
解压源码包
[root@lnp-server-ip47 src]# tar xf nginx-1.20.2.tar.gz
[root@lnp-server-ip47 src]# ll
total 1040
drwxr-xr-x 8 1001 1001 158 Nov 16 22:44 nginx-1.20.2
-rw-r--r-- 1 root root 1062124 Nov 16 22:51 nginx-1.20.2.tar.gz
[root@lnp-server-ip47 src]#
进入nginx-1.20.2 目录,准备编译参数
[root@lnp-server-ip47 src]# cd nginx-1.20.2
[root@lnp-server-ip47 nginx-1.20.2]# ./configure --prefix=/apps/nginx \
> --user=www \
> --group=www \
> --with-http_ssl_module \
> --with-http_v2_module \
> --with-http_realip_module \
> --with-http_stub_status_module \
> --with-http_gzip_static_module \
> --with-pcre \
> --with-stream \
> --with-stream_ssl_module \
> --with-stream_realip_module
[root@lnp-server-ip47 nginx-1.20.2]# make -j 8 && make install
##############################################################################
准备服务文件并启动 nginx
[root@lnp-server-ip47 nginx-1.20.2]# vim /usr/lib/systemd/system/nginx.service
[root@lnp-server-ip47 nginx-1.20.2]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/run/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
[root@lnp-server-ip47 nginx-1.20.2]#
创建目录
[root@lnp-server-ip47 nginx-1.20.2]# mkdir /apps/nginx/run/
修改配置文件
[root@lnp-server-ip47 nginx-1.20.2]# vim /apps/nginx/conf/nginx.conf
仅修改下面这行的内容
pid /apps/nginx/run/nginx.pid;
启动并开机自启服务
[root@lnp-server-ip47 wordpress]# systemctl daemon-reload
[root@lnp-server-ip47 wordpress]# systemctl enable --now nginx
[root@lnp-server-ip47 wordpress]# ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:9000 *:*
LISTEN 0 511 *:80 *:*
[root@lnp-server-ip47 wordpress]#
4.2.2 配置 Nginx 支持 fastcgi
##############################################################################
#### 配置 Nginx 支持 fastcgi
[root@lnp-server-ip47 nginx-1.20.2]# vim /apps/nginx/conf/nginx.conf
仅仅修改下面这些内容,其他都市默认值
worker_processes auto;
pid /apps/nginx/run/nginx.pid;
server {
listen 80;
server_name blog.shone.cn;
location / {
root /data/nginx/wordpress;
index index.php index.html index.htm;
}
location <sub> \.php$ {
root /data/nginx/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location </sub> ^/(ping|pm_status)$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
}
通过命令筛选出有效的配置行
[root@lnp-server-ip47 nginx-1.20.2]# grep -Ev '#|^$' /apps/nginx/conf/nginx.conf
worker_processes auto;
pid /apps/nginx/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name blog.shone.cn; #指定域名
location / {
root /data/nginx/wordpress; #指定数据目录
index index.php index.html index.htm; # 指定默认主页文件
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location <sub> \.php$ { #实现php-fpm
root /data/nginx/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location </sub> ^/(ping|pm_status)$ { #PHP检测状态页
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
}
}
}
[root@lnp-server-ip47 nginx-1.20.2]#
重新启动 nginx 让新配置文件生效
[root@lnp-server-ip47 php-fpm.d]# systemctl reload nginx
[root@lnp-server-ip47 php-fpm.d]# ss -ltn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 127.0.0.1:9000 *:*
LISTEN 0 511 *:80 *:*
[root@lnp-server-ip47 php-fpm.d]#
4.2.3 测试PHP工作是否正常
准备测试页面
[root@lnp-server-ip47 php-fpm.d]# mkdir -p /data/nginx/wordpress
[root@lnp-server-ip47 php-fpm.d]# vim /data/nginx/wordpress/phpinfo.php
[root@lnp-server-ip47 php-fpm.d]# cat /data/nginx/wordpress/phpinfo.php
<?php
phpinfo();
?>
测试PHP的ping
查看状态页
5. 部署 WordPress
5.1 准备 WordPress 文件
下载源文件,并复制到前面定义的网页目录下,并修改权属
[root@lnp-server-ip47 <sub>]# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
[root@lnp-server-ip47 </sub>]# ll
total 19012
-rw-r--r-- 1 root root 19462197 Mar 19 00:00 latest-zh_CN.tar.gz
[root@lnp-server-ip47 <sub>]# tar xf latest-zh_CN.tar.gz
[root@lnp-server-ip47 </sub>]# ll
total 19016
-rw-r--r-- 1 root root 19462197 Mar 19 00:00 latest-zh_CN.tar.gz
drwxr-xr-x 5 1006 1006 4096 Mar 19 00:00 wordpress
[root@lnp-server-ip47 <sub>]# cp -r wordpress/* /data/nginx/wordpress
[root@lnp-server-ip47 </sub>]# chown -R www.www /data/nginx/wordpress/
[root@lnp-server-ip47 ~]#
5.2 初始化 WordPress
修改WIN10的本地hosts文件,路径为 C:\Windows\System32\drivers\etc\hosts 在最后添加一行
192.168.250.47 blog.shone.cn
在浏览器内输入 blog.shone.cn 出现可道云的初始化向导,按照向导完成初始化
在浏览器内输入 http://blog.shone.cn
6. 优化 WordPress
6.1 允许上传大文件
#注意:默认只支持1M以下文件上传,要利用php程序上传大文件,需要修改下面的配置,最大上传由下列项值的最小值决定,直接上传大于1M文件,会出现下面413错误
[root@lnp-server-ip47 wordpress]# vim /apps/nginx/conf/nginx.conf
http {
include 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 logs/access.log main;
client_max_body_size 100m; #nginx上传文件大小修改成100M,默认1M
.........
[root@lnp-server-ip47 wordpress]# vim /etc/php.ini
; http://php.net/post-max-size
;post_max_size = 8M # 默认值为8M
post_max_size = 30M
;upload_max_filesize = 2M # 默认值为2M
upload_max_filesize = 20M
[root@lnp-server-ip47 wordpress]# systemctl restart nginx php-fpm
6.2 安全加固
关闭版本显示
[root@lnp-server-ip47 wordpress]# grep -Ev '#|^$' /apps/nginx/conf/nginx.conf
worker_processes auto;
pid /apps/nginx/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
client_max_body_size 100m;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name blog.shone.cn;
server_tokens off; # 安全加固选项
location / {
root /data/nginx/wordpress;
index index.php index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location <sub> \.php$ {
root /data/nginx/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_hide_header X-Powered-By; # 安全加固选项
}
location </sub> ^/(ping|pm_status)$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
}
}
}
[root@lnp-server-ip47 wordpress]#
关闭 PHP版本暴露
[root@lnp-server-ip47 wordpress]# vim /etc/php.ini
; http://php.net/expose-php
;expose_php = On # 默认值为ON 可以在客户端看到版本信息
expose_php = Off
6.3 配置 php 开启 opcache 加速
[root@lnp-server-ip47 wordpress]# vim /etc/php.ini
.....................
[opcache]
; Determines if Zend OPCache is enabled
zend_extension=opcache.so
opcache.enable=1
.......................
[root@lnp-server-ip47 wordpress]#systemctl restart php-fpm
本文转自:https://blog.51cto.com/shone/5165650
Original: https://www.cnblogs.com/helong-123/p/16086894.html
Author: 萌褚
Title: Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点
相关阅读1
Title: AIX系统NTP同步配置
前言
当AIX系统的本地时间与时间服务器授出的标准时间误差大于±1000秒时。xntpd服务将无法同步时间并变得无法正常工作,请进行ntp配置前,先修改AIX系统的本地时间,尽量和时间服务器的标准时间误差在1000秒内。且必须将AIX系统的时区设置为"BEIST-8"。
如果本地时间在误差1000秒内(16分钟),且不能修改本地时间,可以直接按照下面的步骤开始配置,xntpd服务启动成功后,并不会立即同步本地时间,而是会慢慢的向时间服务器授出的标准时间对齐。最终对齐需要花费的时间需要根据实际误差多少分钟而定。(误差2分钟左右会在1小时内对齐)
一、修改时区及本地时间
参考:https://www.cnblogs.com/xujiecnblogs/p/16950122.html
二、NTP配置
使用Telnet登录AIX系统,或在本地操作 vi /etc/ntp.conf
#编辑该文件,找到 broadcastclient
,一般在文档最后,进行如下编辑
# broadcastclient #注释改行
server 192.168.6.200 #添加NTP服务器地址
driftfile /etc/ntp.drift #保持默认
tracefile /etc/ntp.trace #保持默认
slewalways yes
保存并退出,然后启动xntpd服务(启动ntpd服务后,需等待系统识别,此过程可能需要15-20分钟):
startsrc -s xntpd -a "-x"
说明:"-x"的意思是:启用微调模式,防止本地时间过大的跳变导致应用系统出现异常。
参考:https://www.ibm.com/support/pages/node/885931 和 https://www.ibm.com/docs/en/aix/7.1?topic=x-xntpd-daemon
其实,这里不加 -x
参数启动xntpd服务,系统时间也不会出现跳变,而是会慢慢与标准时间对齐。经过测试,本地时间和标准时间快2分钟左右,启动xntpd服务后,本地时间会在1小时内与标准时间校正。
启动后查看xntd进程是否存 lssrc -s xntpd
存在的话PID有值,不存在则PID无值
等待系统识别,期间可以使用 lssrc -ls xntpd
和 lssrc -s xntpd
命令查看xntpd状态
注:系统识别可能需要15-20分钟,系统识别期间多用该命令查询xntpd状态,如果发现服务启动失败,请检查配置后再次启动服务。出现下图表示系统还没有识别,还需要等待
成功识别到服务器后如下图所示:
使用ntpq -p查看,服务器已标*
三、设置xntpd服务自动启动
vi /etc/rc.tcpip
将
# Start up Network Time Protocol (NTP) daemon
#start /usr/sbin/xntpd "$src_running"
改为:
# Start up Network Time Protocol (NTP) daemon
start /usr/sbin/xntpd "$src_running"
end.
Original: https://www.cnblogs.com/xujiecnblogs/p/16728096.html
Author: xujie333
Title: AIX系统NTP同步配置
相关阅读2
Title: Redis 持久化
相关配置
port 6379
daemonize yes
logfile "6379.log"
dir /data
dbfilename dump-6379.rdb
rdbcompression yes
rdbchecksum yes
stop-writes-on-bgsave error yes
手动保存操作
# 会阻塞 redis 进程
save
# 合适的时候后台执行,fork 函数开启子进程去执行持久化操作
bgsave
# 服务器运行过程中重启
debug reload
# 关闭服务器时指定保存数据
shutdowm save
自动保存
# 满足限定时间范围内 key 的变化数量达到指定数量即进行持久化,使用的 bgsave 方式,不影响主进程
# second:监控时间范围,changes:监控key的变化量
save second changes
RDB
优点
- RDB 是一个紧凑压缩的二进制文件,存储效率较高
- RDB 内部存储的是 redis 在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景
- RDB 恢复数据的速度要比 AOF 快很多
- 应用:服务器中每 X 小时执行 bgsave 备份,并将 RDB 文件拷贝到远程机器中,用于灾难恢复
缺点
- RDB 方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据
- bgsave 指令每次运行要执行 fork 操作创建子进程,要牺牲掉一些性能。基于 fork 创建子进程,内存产生额外消耗
- Redis 的众多版本中未进行 RDB 文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象
- 存储数据量较大,效率较低基于快照思想,每次读写都是全部数据,当数据量巨大时,效率非常低
- 大数据量下的 IO 性能较低
- 宕机带来的数据丢失风险
AOF 概念
AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中命令达到恢复数据的目的。与 RDB 相比可以简单描述为改记录数据为记录数据产生的过程
AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式
AOF 配置
# 是否开启AOF持久化功能,默认为不开启状态
appendonly yes | no
# AOF 写数据策略
# always(每次),每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用。
# everysec(每秒),每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高,建议使用,也是默认配置在系统突然宕机的情况下丢失1秒内的数据
# no(系统控制),由操作系统控制每次同步到AOF文件的周期,整体过程不可控
appendfsync always | everysec | no
# AOF 持久化文件名,默认文件名未 appendonly.aof,建议配置为 appendonly-端口号.aof
appendfilename filename
# AOF 持久化文件保存路径,与 RDB 持久化文件保持一致即可
dir
AOF 重写
随着命令不断写入 AOF,文件会越来越大,为了解决这个问题,Redis 引入了 AOF 重写机制压缩文件体积。
AOF 文件重写是将 Redis 进程内的数据转化为写命令同步到新 AOF 文件的过程。简单说就是将对同一个数据的若干个条命令执行结果转化成最终结果数据对应的指令进行记录。
作用
- 降低磁盘占用量,提高磁盘利用率
- 提高持久化效率,降低持久化写时间,提高O性能
- 降低数据恢复用时,提高数据恢复效率
重写规则
- 进程内已超时的数据不再写入文件
- 忽略无效指令,重写时使用进程内数据直接生成,这样新的AOF文件只保留最终数据的写入命令。如 del key1、hdel key2、srem key3、set key4 111、set key4 222 等
- 对同一数据的多条写命令合并为一条命令。如 lpush list1 a、lpush list1 b、Ipush list1 c,可以转化为:lpush list 1 a b c。
- 为防止数据量过大造成客户端缓冲区溢出,对 list、set、hash、zset 等类型,每条指令最多写入 64 个元素
AOF 重写方式
手动重写,同样会 fork 子进程去操作
bgrewriteaof
自动重写,配置触发条件,两个中满足任意一个就触发
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage
自动重写触发比对参数(运行指令info Persistence获取具体信息)
aof_current_size
aof_base_size
自动重写触发条件
aof_current_size > auto-aof-rewri te-min-si ze
(aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage
AOF 重写流程
配置方式
RDB 与 AOF 对比
RDB 与 AOF 的选择
对数据非常敏感,建议使用默认的 AOF 持久化方案
- AOF 持久化策略使用 everysecond,每秒钟 fsync 一次。该策略 redis 仍可以保持很好的处理性能,当出现问题时,最多丢失 0-1 秒内的数据。
- 注意:由于 AOF 文件存储体积较大,且恢复速度较慢
数据呈现阶段有效性,建议使用 RDB 持久化方案
- 数据可以良好的做到阶段内无失(该阶段是开发者或运维人员手工维护的),且恢复速度较快,阶段点数据恢复通常采用 RDB 方案
- 注意:利用 RDB 实现紧凑的数据持久化会使 Redis 降的很低
综合比对
- RDB 与 AOF 的选择实际上是在做一种权衡,每种都有利有弊
- 如不能承受数分钟以内的数据丢失,对业务数据非常敏感,选用 AOF
- 如能承受数分钟以内的数据失,且追求大数据集的恢复速度,选用 RDB
- 灾难恢复选用 RDB
- 双保险策略,同时开启 RDB 和 AOF,重启后,Redis 优先使用 AOF 来恢复数据,降低丢失数据的量
持久化应用场景
- 控制数据库表主键 id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
- 各种结构型和非结构型高热度数据访问加速
- 购物车数据存储设计
- 抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
- 具有操作先后顺序的数据控制
- 最新消息展示
- 同类信息的关联搜索,二度关联搜索,深度关联搜索
- 基于黑名单与白名单设定的服务控制
- 计数器组合排序功能对应的排名
- 即时任务/消息队列执行管理
- 按次结算的服务控制
https://redis.io/topics/persistence
Original: https://www.cnblogs.com/jhxxb/p/14527245.html
Author: 江湖小小白
Title: Redis 持久化
相关阅读3
Title: CodeSys中编程实现串口通讯【基于树莓派4B】
第一步:Linux中启用串口设备。【以树莓派4B为例】
树莓派4B有6个串口,参考上一篇《树莓派4B串口配置与开发》,在 /boot/config.txt 中添加一行,开启 uart2 功能:
  dtoverlay=uart2
重启后,查看是否有多出来一个 /dev/AMA1 设备:
$ ls -l /dev/tty*
crw-rw---- 1 root dialout 204, 64 Jul 20 11:52 /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 65 Jul 20 11:59 /dev/ttyAMA1
crw------- 1 root root 5, 3 Jul 20 11:52 /dev/ttyprintk
crw--w---- 1 root tty 4, 64 Jul 20 11:52 /dev/ttyS0
也可以config.txt 中添加多行(uart2,uart3,uart4,uart5)启动多个串口功能 (对应 ttyAMA1,ttyAMA2,ttyAMA3 和 ttyAMA4).
可以用下面命令查看 uart2 对应的GPIO针脚映射:
# dtoverlay -h uart2
Name: uart2
Info: Enable uart 2 on GPIOs 0-3. BCM2711 only.
Usage: dtoverlay=uart2,<param>
Params: ctsrts Enable CTS/RTS on GPIOs 2-3 (default off)
从输出可见,GPIO针脚为0-3, 其中 针脚0和1分别为TxD和RxD,针脚2-3为流控 CTS/RTS. 此处针脚0-1为 BCM编码号, 物理引脚号为27-28.
第二步: 使用python代码,测试 uart2 功能是否正确
硬件接线: 将 GPIO引脚0 和 1 短接,实现 自发自收。
软件测试:python控制台中,执行如下代码测试
>>> import serial
>>> ted = serial.Serial(port="/dev/ttyAMA1", baudrate=9600)
>>> ted.write("Hello World".encode("gbk"))
11
>>> ted.read(11)
b'Hello World'
>>>
能收到字串'Hello World'表示 uart2 功能和接线均一切正常。
第三步:编辑 CodeSys 配置文件,映射 /dev/ttyAMA* 到 COMx 端口号。
在老版本的CodeSys 中,需要编辑 " /ect/CODESYSControl.cfg" 末尾添加:
[SysCom]
Linux.Devicefile = /dev/ttyUSB
portnum := COM.SysCom.SYS_COMPORT1;
这样,在codesys中指定串口号1,代表使用的设备为 /dev/ttyUSB0, 非常不直观。
从codesys v3.5 SP15 起(据说),改为在文件 /etc/CODESYSControl _User.cfg 里这么设置:
[SysCom]
Linux.Devicefile.1=/dev/ttyS0
Linux.Devicefile.2=/dev/ttyAMA1
Linux.Devicefile.4=/dev/ttyUSB0
这样, Com 1即为 ttyS0, Com 2即为 ttyAMA1, Com 4 即为 ttyUSB0,依次类推。支持多个串口,方便多了。
如上面设置,映射关系 uart2 --> ttyAMA1 ---> Com 2, 所以codesys中指定端口号为 2 (即Com2)即可。
第四步: CodeSys中编程实现串口收发功能
参考 youtube 上的学习视频: https://www.youtube.com/watch?v=NFREG2U07Rg
只需参考codesys编程部分即可,代码我在他基础上又做了修改完善,
(1)程序块导入3个库: Memory, Serial Communication, Util
(2)定义部分:
PROGRAM SerialPort
VAR
(*打开端口部分*)
Open_0: COM.Open;
Open_xExecute: BOOL := TRUE; //默认打开端口
aParams : ARRAY [1..7] OF COM.PARAMETER := [
(udiParameterId := COM.CAA_Parameter_Constants.udiPort, udiValue := 2),
(udiParameterId := COM.CAA_Parameter_Constants.udiBaudrate, udiValue := 9600),
(udiParameterId := COM.CAA_Parameter_Constants.udiParity, udiValue := INT_TO_UDINT(COM.PARITY.NONE) ),
(udiParameterId := COM.CAA_Parameter_Constants.udiStopBits, udiValue := INT_TO_UDINT(COM.STOPBIT.ONESTOPBIT) ),
(udiParameterId := COM.CAA_Parameter_Constants.udiTimeout, udiValue := 0),
(udiParameterId := COM.CAA_Parameter_Constants.udiByteSize, udiValue := 8),
(udiParameterId := COM.CAA_Parameter_Constants.udiBinary, udiValue := 0)
];
hCom: CAA.HANDLE;
(* read模块 *)
BLINK0: BLINK;
Read_0: COM.Read;
bReadData : ARRAY[1..80] OF BYTE;
read_szSize: CAA.SIZE;
sReadData : STRING;
(* write模块 *)
Write_0: COM.Write;
write_xExecute: BOOL; //执行write操作
bWriteData : ARRAY[1..80] OF BYTE;
sWriteData : STRING;
sWriteDataLast : STRING; //上一次 Write值
END_VAR
(3)梯形图部分
先要 打开串口 (串口参数在定义部分已预设定):
注意此处,参数 xExecute 需始终为 True,否则 会关闭串口 hCom=0 !
注意2:打开串口需要时间,特别时多个端口同时打开时。必须 检验 xDone 的值确保端口已打开,否则后续 读写端口指令 会报错(无效端口)
读串口部分的代码:
使用 blink 定期读取,读出的内容放到数组 bReadData 中,读出长度为 read_szSize.
为了防止读入空(读出为空是常态,有内容 是少数)时 覆盖掉前面值,非空时才拷贝和更新到某个string,代码如下:
这样,仅在有新内容读出时,才更新值到 sReadData 中。末尾的 MEM.MemFill() 用于写入 string 的结束字符 '\0' .
下面到了 写串口 的部分。基本思路也是差不多,字符串中有新值时,才将 字符串内容 拷贝到 数组中用于写出,并使能一次写动作,代码如下:
之后开始真正的 串口写 动作:
代码后半行,如果写成功,就把此次内容保存到 sWriteDataLast 字串里,用于下一次比较,内容不同时才触发一次 COM.Write() 写动作。
需要注意的是,若写动作发生error,会一直卡住 不更新 sWriteDataLast,所以加上并联条件 Write_0.xError , 不管成功/Error失败 均结束此次写动作!就算写失败,想再一次尝试,也必须将 sWriteData 改为其他才能再次触发 写动作。
(4)CodeSys中测试串口读写功能
若串口正确打开, 则 hCom 的值非空,否则 hCom=0 表示失败。
blink产生的信号定时读一遍数据,有新内容显示在字串 sReadData 中;
字串 sWriteData 中的内容会通过串口写出去,只有更新 sWriteData 值的瞬间才会触发一次写操作,不管是否写出成功。
以上代码,使用 树莓派4B, Codesys 3.5.18.2 ,Codesys Control for Linux ARM64 SL 测试通过。
使用树莓派 自带的 uart2 (ttyAMA1)和 usb转ttl串口(ttyUSB0) 均测试通过。
2022-07-21
附:codesys串口示例程序.第2版完善(下载后后缀改为zip)
2022-07-22
Original: https://www.cnblogs.com/zhw618/p/16502058.html
Author: zhw618
Title: CodeSys中编程实现串口通讯【基于树莓派4B】