Rootop 服务器运维与web架构

2021-07-27
发表者 Venus
安装oci8和pdo_oci扩展已关闭评论

安装oci8和pdo_oci扩展

下载依赖:
https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
oracle-instantclient11.1-devel-11.1.0.7.0-1.x86_64.rpm
oracle-instantclient11.1-basic-11.1.0.7.0-1.x86_64.rpm
把2个rpm包安装上。

php版本7.4.20,去官网下载相同版本源码。

进ext目录:

[root@MiWiFi-RA69-srv ext]# ll -d oci8 pdo_oci
drwxrwxr-x 8 root root 4096 Jul 14 10:01 oci8
drwxrwxr-x 3 root root  175 Jun  1 23:41 pdo_oci

oci8和pdo_oci都是php oracle的扩展。

安装pdo_oci:

[root@MiWiFi-RA69-srv pdo_oci]# /www/server/php/74/bin/phpize 
[root@MiWiFi-RA69-srv pdo_oci]# ./configure  --with-php-config=/www/server/php/74/bin/php-config
checking if that is sane... configure: error: You need to tell me where to find your Oracle Instant Client SDK, or set ORACLE_HOME.

[root@MiWiFi-RA69-srv pdo_oci]# rpm -ql oracle-instantclient11.1-basic-11.1.0.7.0-1.x86_64
/usr/lib/oracle/11.1/client64/bin/adrci
/usr/lib/oracle/11.1/client64/bin/genezi
/usr/lib/oracle/11.1/client64/lib/libclntsh.so.11.1
/usr/lib/oracle/11.1/client64/lib/libnnz11.so
/usr/lib/oracle/11.1/client64/lib/libocci.so.11.1
/usr/lib/oracle/11.1/client64/lib/libociei.so
/usr/lib/oracle/11.1/client64/lib/libocijdbc11.so
/usr/lib/oracle/11.1/client64/lib/ojdbc5.jar
/usr/lib/oracle/11.1/client64/lib/ojdbc6.jar

[root@MiWiFi-RA69-srv pdo_oci]# ./configure --help
  --with-pdo-oci[=DIR]    PDO: Oracle OCI support. DIR defaults to
                          $ORACLE_HOME. Use
                          --with-pdo-oci=instantclient,/path/to/instant/client/lib
[root@MiWiFi-RA69-srv pdo_oci]# ./configure  --with-php-config=/www/server/php/74/bin/php-config --with-pdo-oci=instantclient,/usr/lib/oracle/11.1/client64/lib
[root@MiWiFi-RA69-srv pdo_oci]# make && make install

安装oci8:

[root@MiWiFi-RA69-srv oci8]# /www/server/php/74/bin/phpize 
[root@MiWiFi-RA69-srv pdo_oci]# ./configure  --with-php-config=/www/server/php/74/bin/php-config
[root@MiWiFi-RA69-srv pdo_oci]# make && make install

配置php.ini加载模块:

extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/pdo_oci.so
extension=/www/server/php/74/lib/php/extensions/no-debug-non-zts-20190902/oci8.so

重启php。

[root@MiWiFi-RA69-srv ext]# /www/server/php/74/bin/php -m | grep -E "oci|OCI"
oci8
PDO_OCI

2021-07-05
发表者 Venus
nginx中几个性能调整的参数已关闭评论

nginx中几个性能调整的参数

worker_processes 1;
#默认1,可以设置为cpu核心数,或者auto自动配置

worker_rlimit_nofile 1024;
#最大文件打开数,这里指 nginx worker 进程的最大打开数,不是 nginx master 进程。
可以通过 cat /proc/nginx worker进程号/limits | grep open 返回的数值验证生效。

events
{
	use epoll;
	worker_connections 1024; 
	#单个进程最大连接数,包括和客户端的连接、反向代理之间的连接。
	
	multi_accept on;
	# 一次性处理所有backlog中的队列。off的话,就是一次一个。
	# backlog队列参考:https://www.rootop.org/pages/4842.html
}


# http 配置段
http
{
	sendfile   on; 
	# 此参数用于提高I/O性能,但不适用于大文件(要平衡磁盘和网络的I/O速度)/反向代理情况下,也就是说文件不在本地,在远程服务器上的不适用(包括文件共享)。
	# 大文件情况下用 aio
	tcp_nopush on;
	# 和sendfile一起出现,用于发送一个完整的数据包,实际是影响socket中TCP_CORK参数效果。
	
	keepalive_timeout 60;
	# nginx服务器与客户端会话结束后仍旧保持连接的最长时间(秒)
	tcp_nodelay on;
	# 开启、关闭nagle算法,和 keepalive_timeout 一起出现,默认on
}

TCP_CORK 资料:https://blog.csdn.net/sinat_20184565/article/details/89682807
TCP_NODELAY 资料:https://blog.csdn.net/lclwjl/article/details/80154565

2021-07-01
发表者 Venus
mysql5.6数据库varchar类型超过字段长度自动截取的问题已关闭评论

mysql5.6数据库varchar类型超过字段长度自动截取的问题

帮群里处理一个问题,说是前台页面post提交的数据,其中一个字段的字符串超过数据库中字段的最大长度限制后出现自动截取的结果。
最终数据库里存的数据为这个字段的最大长度,其余的自动截取了。在我印象里超过长度应该是报错的。

特地研究了一下。
比如有个字段为varchar类型,长度10。当写入数据的时候,mysql5.6和mysql5.7处理方式不一样。
具体原因是由sql_mode模式决定的。

5.7版本插入一串字符串长度为11时,会报错:1406 Data too long for column ‘字段名’。
5.6版本插入时,则会截取到10个字符的长度。

5.7文档中默认的sql-mode值为:

ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_AUTO_CREATE_USER NO_ENGINE_SUBSTITUTION

5.6文档中默认的sql-mode值为:

NO_ENGINE_SUBSTITUTION

参考:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html

当在修改数据库sql-mode模式为 “严格模式” 时,发现用数据库客户端软件测试没效果。

/etc/my.cnf:

[mysqld]
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# 最后查进程发现是启动参数里带着sql-mode参数,那么应该是启动脚本里定义的,优先级高于配置文件中。

[root@MiWiFi-RA69-srv mysql]# ps aux | grep mysql
root     29328  0.6  0.0  11820  1580 pts/1    S    13:41   0:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/MiWiFi-RA69-srv.pid --sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
mysql    29946  8.0  9.0 1297996 327088 pts/1  Sl   13:41   0:00 /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --log-error=MiWiFi-RA69-srv.err --open-files-limit=65535 --pid-file=/www/server/data/MiWiFi-RA69-srv.pid --socket=/tmp/mysql.sock --port=3306

# 检查启动脚本

[root@MiWiFi-RA69-srv mysql]# vi /etc/init.d/mysqld 
other_args= #--sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"   # uncommon, but needed when called from an RPM upgrade action

把他注释掉再重启mysql,再次查看进程信息里没有sql-mode参数了。

sql-mode不同值的含义或者直接找百度翻译版:
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

然后再次测试插入过长数据时,就提示错误了。
PS:
我在用sqlyog客户端测的时候发现设置了sql-mode 后通过 “select @@sql_mode;” 取不到设置的值。
但是用navicat可以查到。推测sqlyog连接的时候给临时设置了模式,又浪费了一段时间。

2021-06-29
发表者 Venus
linux通过配置文件配置多ip已关闭评论

linux通过配置文件配置多ip

这里不采用子设备号的方式,即 ifcfg-eth0:0、ifcfg-eth0:1的配置文件方式。
通过一个配置文件方式实现多ip配置。

vi /etc/sysconfig/network-scripts/ifcfg-eth0
# 方法1,适用于不连续ip

主ip配置略```

IPADDR1=10.10.10.10
NETMASK1=255.255.255.0

IPADDR2=10.10.10.11
NETMASK2=255.255.255.0

IPADDR和NETMASK后面的数字要排起来,中间不能有间隔。否则会失败。

# 方法2,适用于连续ip,某个范围内的ip(-range0)。
注意首先要保证主网卡配置文件ifcfg-eth0中配置了 NM_CONTROLLED = no 参数,否则多ip配置重启network服务后依旧看不到ip。
vi /etc/sysconfig/network-scripts/ifcfg-eth0-range0

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=static
IPADDR_START=10.10.10.10
IPADDR_END=10.10.10.20
CLONENUM_START=0
GATEWAY=10.10.10.1
NETMASK=255.255.255.0
NO_ALIASROUTING=yes
ARPCHECK=no

CLONENUM_START=0 是 eth0:0 的意思,从0开始,下一个ip设备名就会是eth0:1
ARPCHECK=no 是禁用arp检查,否则重启网卡的时候arp检查是否有其他主机占用此ip(等待广播包回复需要几秒时间),从而导致重启网络速度很慢。
message日志中会提示 Determining if ip address x.x.x.x is already in use for device xxx

重启网络。

2021-06-03
发表者 Venus
Linux系统错误码大全已关闭评论

Linux系统错误码大全

比如mysql里报了一个error code 13或者error code 28,那么对比这个错误码,就可以找到对应错误为权限错误、磁盘不足。

比如我这里下载了个内核源码版本linux-5.12.9
github地址:https://github.com/torvalds/linux/tree/master/include/uapi/asm-generic
1-34错误号是在内核源码下的include\uapi\asm-generic\errno-base.h
35-133错误号是在include\uapi\asm-generic\errno.h

#ifndef _ASM_GENERIC_ERRNO_BASE_H
#define _ASM_GENERIC_ERRNO_BASE_H

#define    EPERM         1     /* Operation not permitted */
#define    ENOENT        2     /* No such file or directory */
#define    ESRCH         3     /* No such process */
#define    EINTR         4     /* Interrupted system call */
#define    EIO           5     /* I/O error */
#define    ENXIO         6     /* No such device or address */
#define    E2BIG         7     /* Argument list too long */
#define    ENOEXEC       8     /* Exec format error */
#define    EBADF         9     /* Bad file number */
#define    ECHILD        10    /* No child processes */
#define    EAGAIN        11    /* Try again */
#define    ENOMEM        12    /* Out of memory */
#define    EACCES        13    /* Permission denied */
#define    EFAULT        14    /* Bad address */
#define    ENOTBLK       15    /* Block device required */
#define    EBUSY         16    /* Device or resource busy */
#define    EEXIST        17    /* File exists */
#define    EXDEV         18    /* Cross-device link */
#define    ENODEV        19    /* No such device */
#define    ENOTDIR       20    /* Not a directory */
#define    EISDIR        21    /* Is a directory */
#define    EINVAL        22    /* Invalid argument */
#define    ENFILE        23    /* File table overflow */
#define    EMFILE        24    /* Too many open files */
#define    ENOTTY        25    /* Not a typewriter */
#define    ETXTBSY       26    /* Text file busy */
#define    EFBIG         27    /* File too large */
#define    ENOSPC        28    /* No space left on device */
#define    ESPIPE        29    /* Illegal seek */
#define    EROFS         30    /* Read-only file system */
#define    EMLINK        31    /* Too many links */
#define    EPIPE         32    /* Broken pipe */
#define    EDOM          33    /* Math argument out of domain of func */
#define    ERANGE        34    /* Math result not representable */

#endif



#include <asm-generic/errno-base.h>

#define    EDEADLK        35    /* Resource deadlock would occur */
#define    ENAMETOOLONG   36    /* File name too long */
#define    ENOLCK         37    /* No record locks available */
#define    ENOSYS         38    /* Function not implemented */
#define    ENOTEMPTY      39    /* Directory not empty */
#define    ELOOP          40    /* Too many symbolic links encountered */
#define    EWOULDBLOCK    EAGAIN    /* Operation would block */
#define    ENOMSG         42    /* No message of desired type */
#define    EIDRM          43    /* Identifier removed */
#define    ECHRNG         44    /* Channel number out of range */
#define    EL2NSYNC       45    /* Level 2 not synchronized */
#define    EL3HLT         46    /* Level 3 halted */
#define    EL3RST         47    /* Level 3 reset */
#define    ELNRNG         48    /* Link number out of range */
#define    EUNATCH        49    /* Protocol driver not attached */
#define    ENOCSI         50    /* No CSI structure available */
#define    EL2HLT         51    /* Level 2 halted */
#define    EBADE          52    /* Invalid exchange */
#define    EBADR          53    /* Invalid request descriptor */
#define    EXFULL         54    /* Exchange full */
#define    ENOANO         55    /* No anode */
#define    EBADRQC        56    /* Invalid request code */
#define    EBADSLT        57    /* Invalid slot */

#define    EDEADLOCK    EDEADLK

#define    EBFONT        59    /* Bad font file format */
#define    ENOSTR        60    /* Device not a stream */
#define    ENODATA       61    /* No data available */
#define    ETIME         62    /* Timer expired */
#define    ENOSR         63    /* Out of streams resources */
#define    ENONET        64    /* Machine is not on the network */
#define    ENOPKG        65    /* Package not installed */
#define    EREMOTE       66    /* Object is remote */
#define    ENOLINK       67    /* Link has been severed */
#define    EADV          68    /* Advertise error */
#define    ESRMNT        69    /* Srmount error */
#define    ECOMM         70    /* Communication error on send */
#define    EPROTO        71    /* Protocol error */
#define    EMULTIHOP     72    /* Multihop attempted */
#define    EDOTDOT       73    /* RFS specific error */
#define    EBADMSG       74    /* Not a data message */
#define    EOVERFLOW     75    /* Value too large for defined data type */
#define    ENOTUNIQ      76    /* Name not unique on network */
#define    EBADFD        77    /* File descriptor in bad state */
#define    EREMCHG       78    /* Remote address changed */
#define    ELIBACC       79    /* Can not access a needed shared library */
#define    ELIBBAD       80    /* Accessing a corrupted shared library */
#define    ELIBSCN       81    /* .lib section in a.out corrupted */
#define    ELIBMAX       82    /* Attempting to link in too many shared libraries */
#define    ELIBEXEC      83    /* Cannot exec a shared library directly */
#define    EILSEQ        84    /* Illegal byte sequence */
#define    ERESTART      85    /* Interrupted system call should be restarted */
#define    ESTRPIPE      86    /* Streams pipe error */
#define    EUSERS        87    /* Too many users */
#define    ENOTSOCK      88    /* Socket operation on non-socket */
#define    EDESTADDRREQ  89    /* Destination address required */
#define    EMSGSIZE      90    /* Message too long */
#define    EPROTOTYPE    91    /* Protocol wrong type for socket */
#define    ENOPROTOOPT   92    /* Protocol not available */
#define    EPROTONOSUPPORT    93    /* Protocol not supported */
#define    ESOCKTNOSUPPORT    94    /* Socket type not supported */
#define    EOPNOTSUPP         95    /* Operation not supported on transport endpoint */
#define    EPFNOSUPPORT       96    /* Protocol family not supported */
#define    EAFNOSUPPORT       97    /* Address family not supported by protocol */
#define    EADDRINUSE    	  98    /* Address already in use */
#define    EADDRNOTAVAIL      99    /* Cannot assign requested address */
#define    ENETDOWN    		  100    /* Network is down */
#define    ENETUNREACH    	  101    /* Network is unreachable */
#define    ENETRESET    	  102    /* Network dropped connection because of reset */
#define    ECONNABORTED       103    /* Software caused connection abort */
#define    ECONNRESET    	  104    /* Connection reset by peer */
#define    ENOBUFS        	  105    /* No buffer space available */
#define    EISCONN        	  106    /* Transport endpoint is already connected */
#define    ENOTCONN    		  107    /* Transport endpoint is not connected */
#define    ESHUTDOWN    	  108    /* Cannot send after transport endpoint shutdown */
#define    ETOOMANYREFS       109    /* Too many references: cannot splice */
#define    ETIMEDOUT    	  110    /* Connection timed out */
#define    ECONNREFUSED       111    /* Connection refused */
#define    EHOSTDOWN   		  112    /* Host is down */
#define    EHOSTUNREACH       113    /* No route to host */
#define    EALREADY    		  114    /* Operation already in progress */
#define    EINPROGRESS    	  115    /* Operation now in progress */
#define    ESTALE        	  116    /* Stale NFS file handle */
#define    EUCLEAN        	  117    /* Structure needs cleaning */
#define    ENOTNAM        	  118    /* Not a XENIX named type file */
#define    ENAVAIL        	  119    /* No XENIX semaphores available */
#define    EISNAM        	  120    /* Is a named type file */
#define    EREMOTEIO    	  121    /* Remote I/O error */
#define    EDQUOT        	  122    /* Quota exceeded */

#define    ENOMEDIUM    	  123    /* No medium found */
#define    EMEDIUMTYPE    	  124    /* Wrong medium type */
#define    ECANCELED    	  125    /* Operation Canceled */
#define    ENOKEY        	  126    /* Required key not available */
#define    EKEYEXPIRED    	  127    /* Key has expired */
#define    EKEYREVOKED    	  128    /* Key has been revoked */
#define    EKEYREJECTED    	  129    /* Key was rejected by service */

/* for robust mutexes */
#define    EOWNERDEAD    	  130    /* Owner died */
#define    ENOTRECOVERABLE    131    /* State not recoverable */
#define ERFKILL        		  132    /* Operation not possible due to RF-kill */

#ifdef __KERNEL__

/*
 * These should never be seen by user programs. To return one of ERESTART*
 * codes, signal_pending() MUST be set. Note that ptrace can observe these
 * at syscall exit tracing, but they will never be left for the debugged user
 * process to see.
 */
#define ERESTARTSYS       	  512
#define ERESTARTNOINTR    	  513
#define ERESTARTNOHAND    	  514    /* restart if no handler.. */
#define ENOIOCTLCMD       	  515    /* No ioctl command */
#define ERESTART_RESTARTBLOCK 516 /* restart by calling sys_restart_syscall */

/* Defined for the NFSv3 protocol */
#define EBADHANDLE    		  521    /* Illegal NFS file handle */
#define ENOTSYNC    		  522    /* Update synchronization mismatch */
#define EBADCOOKIE    		  523    /* Cookie is stale */
#define ENOTSUPP    		  524    /* Operation is not supported */
#define ETOOSMALL    		  525    /* Buffer or request is too small */
#define ESERVERFAULT    	  526    /* An untranslatable error occurred */
#define EBADTYPE    		  527    /* Type not supported by server */
#define EJUKEBOX    		  528    /* Request initiated, but will not complete before timeout */
#define EIOCBQUEUED    		  529    /* iocb queued, will get completion event */
#define EIOCBRETRY    		  530    /* iocb queued, will trigger a retry */

#endif