Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Linux70

镜像下载、域名解析、时间同步请点击阿里云开源镜像站

​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. 架构拓扑及主机说明

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

三台主机
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

&#x5B89;&#x88C5;&#x7F16;&#x8BD1;PHP&#x9700;&#x8981;&#x7684;&#x4F9D;&#x8D56;&#x5305;
[root@lnp-server-ip47 ]# yum -y install gcc openssl-devel libxml2-devel bzip2-devel libmcrypt-devel sqlite-devel oniguruma-devel

&#x4E0B;&#x8F7D; php-7.4.28.tar.xz &#x6E90;&#x7801;&#x5305;
[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

&#x89E3;&#x538B;&#x6E90;&#x7801;&#x5305;&#xFF0C;&#x8FDB;&#x5165;&#x6E90;&#x7801;&#x5305;&#x6240;&#x5728;&#x76EE;&#x5F55;
[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

&#x51C6;&#x5907;&#x7F16;&#x8BD1;&#x53C2;&#x6570;
[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.    # &#x9700;&#x8981;&#x770B;&#x5230;&#x8FD9;&#x4E2A;&#x4FE1;&#x606F;&#x624D;&#x7B97;&#x6210;&#x529F;&#x4E86;

&#x67E5;&#x770B;cpu&#x4E2A;&#x6570;&#xFF0C;&#x4F5C;&#x4E3A;&#x7F16;&#x8BD1;&#x53C2;&#x6570;CPU&#x9009;&#x9879;&#x8F93;&#x5165;
[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]#

&#x7F16;&#x8BD1;&#x5B89;&#x88C5;
[root@lnp-server-ip47 php-7.4.28]# make -j 8 && make install

...................  #&#x6B64;&#x5904;&#x5220;&#x9664;&#x5F88;&#x591A;&#x5C4F;&#x663E;&#x5185;&#x5BB9;&#xFF0C;&#x9700;&#x8981;&#x770B;&#x5230;&#x4E0B;&#x9762;&#x6210;&#x529F;&#x4FE1;&#x606F;&#x518D;&#x8FDB;&#x5165;&#x4E0B;&#x4E00;&#x6B65;
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/

##############################################################################
## &#x51C6;&#x5907; php &#x914D;&#x7F6E;&#x6587;&#x4EF6;
&#x4ECE;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x6A21;&#x677F;&#x590D;&#x5236;&#xFF0C;&#x5E76;&#x8FDB;&#x884C;&#x4FEE;&#x6539;
[root@lnp-server-ip47 php-7.4.28]# cp /usr/local/src/php-7.4.28/php.ini-production /etc/php.ini

&#x8FDB;&#x5165;&#x5F53;&#x65F6;&#x7F16;&#x8BD1;&#x53C2;&#x6570;&#x5185;&#x5B9A;&#x4E49;&#x7684;&#x76EE;&#x5F55; /apps/php74/    &#x4ECE;&#x6A21;&#x677F;&#x590D;&#x5236;&#x521B;&#x5EFA; 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

&#x8FDB;&#x5165;&#x5B50;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x76EE;&#x5F55;&#xFF0C;&#x4ECE;&#x6A21;&#x677F; &#x6587;&#x4EF6;&#x521B;&#x5EFA; 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]#

&#x6309;&#x7167;&#x672C;&#x5B9E;&#x8DF5;&#x7684;&#x601D;&#x8DEF;&#x4FEE;&#x6539; 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

&#x4FEE;&#x6539;&#x540E;&#x7684; www.conf &#x6587;&#x4EF6;&#x53BB;&#x9664; &#xFF1B; &#x6CE8;&#x91CA;&#x884C;&#x7684;&#x6240;&#x6709;&#x6587;&#x4EF6;&#x5185;&#x5BB9; &#x4F9B;&#x6BD4;&#x5BF9;
[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]#

&#x521B;&#x5EFA; www &#x7528;&#x6237;
[root@lnp-server-ip47 php-fpm.d]# useradd -r -s /sbin/nologin www
&#x521B;&#x5EFA;&#x8BBF;&#x95EE;&#x65E5;&#x5FD7;&#x6587;&#x4EF6;&#x8DEF;&#x5F84;
[root@lnp-server-ip47 php-fpm.d]# mkdir /apps/php74/log
[root@lnp-server-ip47 php-fpm.d]#

##############################################################################
## &#x542F;&#x52A8;&#x5E76;&#x9A8C;&#x8BC1; php-fpm &#x670D;&#x52A1;
&#x68C0;&#x67E5;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x8BED;&#x6CD5;&#x7B49;
[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
&#x51C6;&#x5907;&#x542F;&#x52A8;&#x670D;&#x52A1;&#x6587;&#x4EF6;
[root@lnp-server-ip47 php-fpm.d]# cp /usr/local/src/php-7.4.28/sapi/fpm/php-fpm.service /usr/lib/systemd/system/

&#x542F;&#x52A8;&#x5E76;&#x5F00;&#x673A;&#x81EA;&#x542F;&#x52A8; 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.

&#x9A8C;&#x8BC1;&#x76D1;&#x542C;&#x7AEF;&#x53E3;
[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             *:*

&#x67E5;&#x770B;&#x5E76;&#x8DDF;&#x8E2A; &#x8FDB;&#x7A0B;&#x4FE1;&#x606F;
[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

#### &#x7F16;&#x8BD1;&#x5B89;&#x88C5; nginx
&#x51C6;&#x5907;Nginx&#x7F16;&#x8BD1;&#x5B89;&#x88C5;&#x7684;&#x4F9D;&#x8D56;&#x5305;
[root@lnp-server-ip47 <sub>]# yum -y install gcc pcre-devel openssl-devel zlib-devel
&#x4E0B;&#x8F7D; nginx 1.20.2 &#x6E90;&#x7801;&#x5305;  &#x4E00;&#x822C;/usr/local/src/  &#x4F5C;&#x4E3A;&#x6E90;&#x7801;&#x6587;&#x4EF6;&#x5B58;&#x653E;&#x76EE;&#x5F55;
[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
&#x89E3;&#x538B;&#x6E90;&#x7801;&#x5305;
[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]#

&#x8FDB;&#x5165;nginx-1.20.2 &#x76EE;&#x5F55;&#xFF0C;&#x51C6;&#x5907;&#x7F16;&#x8BD1;&#x53C2;&#x6570;
[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

##############################################################################
&#x51C6;&#x5907;&#x670D;&#x52A1;&#x6587;&#x4EF6;&#x5E76;&#x542F;&#x52A8; 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]#

&#x521B;&#x5EFA;&#x76EE;&#x5F55;
[root@lnp-server-ip47 nginx-1.20.2]# mkdir /apps/nginx/run/

&#x4FEE;&#x6539;&#x914D;&#x7F6E;&#x6587;&#x4EF6;
[root@lnp-server-ip47 nginx-1.20.2]# vim /apps/nginx/conf/nginx.conf
&#x4EC5;&#x4FEE;&#x6539;&#x4E0B;&#x9762;&#x8FD9;&#x884C;&#x7684;&#x5185;&#x5BB9;
pid        /apps/nginx/run/nginx.pid;

&#x542F;&#x52A8;&#x5E76;&#x5F00;&#x673A;&#x81EA;&#x542F;&#x670D;&#x52A1;
[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

##############################################################################
#### &#x914D;&#x7F6E; Nginx &#x652F;&#x6301; fastcgi
[root@lnp-server-ip47 nginx-1.20.2]# vim /apps/nginx/conf/nginx.conf
&#x4EC5;&#x4EC5;&#x4FEE;&#x6539;&#x4E0B;&#x9762;&#x8FD9;&#x4E9B;&#x5185;&#x5BB9;&#xFF0C;&#x5176;&#x4ED6;&#x90FD;&#x5E02;&#x9ED8;&#x8BA4;&#x503C;
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;
        }

&#x901A;&#x8FC7;&#x547D;&#x4EE4;&#x7B5B;&#x9009;&#x51FA;&#x6709;&#x6548;&#x7684;&#x914D;&#x7F6E;&#x884C;
[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;    #&#x6307;&#x5B9A;&#x57DF;&#x540D;
        location / {
        root /data/nginx/wordpress;    #&#x6307;&#x5B9A;&#x6570;&#x636E;&#x76EE;&#x5F55;
        index index.php index.html index.htm;    # &#x6307;&#x5B9A;&#x9ED8;&#x8BA4;&#x4E3B;&#x9875;&#x6587;&#x4EF6;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        location <sub> \.php$ {                      #&#x5B9E;&#x73B0;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&#x68C0;&#x6D4B;&#x72B6;&#x6001;&#x9875;
        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]#

&#x91CD;&#x65B0;&#x542F;&#x52A8; nginx &#x8BA9;&#x65B0;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#x751F;&#x6548;
[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

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

查看状态页

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

5. 部署 WordPress

5.1 准备 WordPress 文件

&#x4E0B;&#x8F7D;&#x6E90;&#x6587;&#x4EF6;&#xFF0C;&#x5E76;&#x590D;&#x5236;&#x5230;&#x524D;&#x9762;&#x5B9A;&#x4E49;&#x7684;&#x7F51;&#x9875;&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x5E76;&#x4FEE;&#x6539;&#x6743;&#x5C5E;
[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

&#x4FEE;&#x6539;WIN10&#x7684;&#x672C;&#x5730;hosts&#x6587;&#x4EF6;&#xFF0C;&#x8DEF;&#x5F84;&#x4E3A;  C:\Windows\System32\drivers\etc\hosts   &#x5728;&#x6700;&#x540E;&#x6DFB;&#x52A0;&#x4E00;&#x884C;
192.168.250.47  blog.shone.cn

&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x5185;&#x8F93;&#x5165; blog.shone.cn  &#x51FA;&#x73B0;&#x53EF;&#x9053;&#x4E91;&#x7684;&#x521D;&#x59CB;&#x5316;&#x5411;&#x5BFC;&#xFF0C;&#x6309;&#x7167;&#x5411;&#x5BFC;&#x5B8C;&#x6210;&#x521D;&#x59CB;&#x5316;

在浏览器内输入 http://blog.shone.cn

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

6. 优化 WordPress

6.1 允许上传大文件

#&#x6CE8;&#x610F;:&#x9ED8;&#x8BA4;&#x53EA;&#x652F;&#x6301;1M&#x4EE5;&#x4E0B;&#x6587;&#x4EF6;&#x4E0A;&#x4F20;,&#x8981;&#x5229;&#x7528;php&#x7A0B;&#x5E8F;&#x4E0A;&#x4F20;&#x5927;&#x6587;&#x4EF6;,&#x9700;&#x8981;&#x4FEE;&#x6539;&#x4E0B;&#x9762;&#x7684;&#x914D;&#x7F6E;,&#x6700;&#x5927;&#x4E0A;&#x4F20;&#x7531;&#x4E0B;&#x5217;&#x9879;&#x503C;&#x7684;&#x6700;&#x5C0F;&#x503C;&#x51B3;&#x5B9A;&#xFF0C;&#x76F4;&#x63A5;&#x4E0A;&#x4F20;&#x5927;&#x4E8E;1M&#x6587;&#x4EF6;,&#x4F1A;&#x51FA;&#x73B0;&#x4E0B;&#x9762;413&#x9519;&#x8BEF;

[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&#x4E0A;&#x4F20;&#x6587;&#x4EF6;&#x5927;&#x5C0F;&#x4FEE;&#x6539;&#x6210;100M&#xFF0C;&#x9ED8;&#x8BA4;1M
    .........

[root@lnp-server-ip47 wordpress]# vim /etc/php.ini
; http://php.net/post-max-size
;post_max_size = 8M              # &#x9ED8;&#x8BA4;&#x503C;&#x4E3A;8M
post_max_size = 30M

;upload_max_filesize = 2M        # &#x9ED8;&#x8BA4;&#x503C;&#x4E3A;2M
upload_max_filesize = 20M

[root@lnp-server-ip47 wordpress]# systemctl restart nginx php-fpm

6.2 安全加固

&#x5173;&#x95ED;&#x7248;&#x672C;&#x663E;&#x793A;
[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;                             # &#x5B89;&#x5168;&#x52A0;&#x56FA;&#x9009;&#x9879;
        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;     # &#x5B89;&#x5168;&#x52A0;&#x56FA;&#x9009;&#x9879;
        }
        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]#

&#x5173;&#x95ED; PHP&#x7248;&#x672C;&#x66B4;&#x9732;
[root@lnp-server-ip47 wordpress]# vim /etc/php.ini
; http://php.net/expose-php
;expose_php = On                # &#x9ED8;&#x8BA4;&#x503C;&#x4E3A;ON  &#x53EF;&#x4EE5;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x770B;&#x5230;&#x7248;&#x672C;&#x4FE1;&#x606F;
expose_php = Off

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

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             #&#x6CE8;&#x91CA;&#x6539;&#x884C;
server 192.168.6.200          #&#x6DFB;&#x52A0;NTP&#x670D;&#x52A1;&#x5668;&#x5730;&#x5740;
driftfile /etc/ntp.drift      #&#x4FDD;&#x6301;&#x9ED8;&#x8BA4;
tracefile /etc/ntp.trace      #&#x4FDD;&#x6301;&#x9ED8;&#x8BA4;
slewalways yes

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

保存并退出,然后启动xntpd服务(启动ntpd服务后,需等待系统识别,此过程可能需要15-20分钟):

startsrc -s xntpd -a "-x"

说明:"-x"的意思是:启用微调模式,防止本地时间过大的跳变导致应用系统出现异常。

参考:https://www.ibm.com/support/pages/node/885931https://www.ibm.com/docs/en/aix/7.1?topic=x-xntpd-daemon

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

其实,这里不加 -x参数启动xntpd服务,系统时间也不会出现跳变,而是会慢慢与标准时间对齐。经过测试,本地时间和标准时间快2分钟左右,启动xntpd服务后,本地时间会在1小时内与标准时间校正。

启动后查看xntd进程是否存 lssrc -s xntpd存在的话PID有值,不存在则PID无值

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

等待系统识别,期间可以使用 lssrc -ls xntpdlssrc -s xntpd命令查看xntpd状态

注:系统识别可能需要15-20分钟,系统识别期间多用该命令查询xntpd状态,如果发现服务启动失败,请检查配置后再次启动服务。出现下图表示系统还没有识别,还需要等待

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

成功识别到服务器后如下图所示:

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

使用ntpq -p查看,服务器已标*

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

三、设置xntpd服务自动启动

vi /etc/rc.tcpip
&#x5C06;
# Start up Network Time Protocol (NTP) daemon
#start /usr/sbin/xntpd "$src_running"
&#x6539;&#x4E3A;&#xFF1A;
# 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 重写流程

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

配置方式

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

RDB 与 AOF 对比

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

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 功能:

&#xA0; 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
    (*&#x6253;&#x5F00;&#x7AEF;&#x53E3;&#x90E8;&#x5206;*)
    Open_0: COM.Open;
    Open_xExecute: BOOL := TRUE;   //&#x9ED8;&#x8BA4;&#x6253;&#x5F00;&#x7AEF;&#x53E3;
    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&#x6A21;&#x5757; *)
    BLINK0: BLINK;
    Read_0: COM.Read;
    bReadData : ARRAY[1..80] OF BYTE;
    read_szSize: CAA.SIZE;

    sReadData : STRING;

    (* write&#x6A21;&#x5757; *)
    Write_0: COM.Write;
    write_xExecute: BOOL;  //&#x6267;&#x884C;write&#x64CD;&#x4F5C;
    bWriteData : ARRAY[1..80] OF BYTE;
    sWriteData : STRING;
    sWriteDataLast : STRING;  //&#x4E0A;&#x4E00;&#x6B21; Write&#x503C;
END_VAR

(3)梯形图部分

先要 打开串口 (串口参数在定义部分已预设定):

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

注意此处,参数 xExecute 需始终为 True,否则 会关闭串口 hCom=0 !

注意2:打开串口需要时间,特别时多个端口同时打开时。必须 检验 xDone 的值确保端口已打开,否则后续 读写端口指令 会报错(无效端口)

读串口部分的代码:

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

使用 blink 定期读取,读出的内容放到数组 bReadData 中,读出长度为 read_szSize.

为了防止读入空(读出为空是常态,有内容 是少数)时 覆盖掉前面值,非空时才拷贝和更新到某个string,代码如下:

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

这样,仅在有新内容读出时,才更新值到 sReadData 中。末尾的 MEM.MemFill() 用于写入 string 的结束字符 '\0' .

下面到了 写串口 的部分。基本思路也是差不多,字符串中有新值时,才将 字符串内容 拷贝到 数组中用于写出,并使能一次写动作,代码如下:

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

之后开始真正的 串口写 动作:

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

代码后半行,如果写成功,就把此次内容保存到 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 测试通过。

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

使用树莓派 自带的 uart2 (ttyAMA1)和 usb转ttl串口(ttyUSB0) 均测试通过。

附: codesys工程源码(下载改后缀为zip)

2022-07-21

附:codesys串口示例程序.第2版完善(下载后后缀改为zip)

2022-07-22

Nginx 实践案例(源码编译安装方式):利用LNMP搭建wordpress站点

Original: https://www.cnblogs.com/zhw618/p/16502058.html
Author: zhw618
Title: CodeSys中编程实现串口通讯【基于树莓派4B】