Linux 命令行 创建指定大小的文件

经常有看到VPS、服务器等主机商有提供个例如100MB-fremont.bin、100mb.test等的文件,供用户下载测试网络使用。

本文介绍下如何在Linux,命令行下创建指定大小的文件(这里以创建13MB大小的文件onebox.test为例)。

truncate

truncate -s 13M onebox.test

未分类

fallocate

fallocate -l 13000000 onebox.test

未分类

dd

dd if=/dev/urandom of=onebox.test bs=13MB count=1
OR
head -c 13MB /dev/urandom > onebox.test

未分类

dd if=/dev/zero of=onebox.test bs=13MB count=1
OR
head -c 13MB /dev/zero > onebox.test

未分类

额外

13MB=1310001000字节;如果想要1310241024,则替换MB为M,示例:

dd if=/dev/urandom of=onebox.test bs=13M count=1
head -c 13M /dev/zero > onebox.test

未分类

命令fallocate只支持字节(bytes)单位,如果想创建1310241024大小的文件,则1310241024=13631488:

fallocate -l 13631488 onebox.test

未分类

Linux系统下find命令递归删除查找目录的方法

本文将会讲述如何使用linux系统下的find查找命令来查找目录或文件,并将查找到的所有文件和目录递归删除掉。

Linux find 命令递归删除非空目录

通常情况下我们会想到find命令里的删除操作是使用-delete选项,但是使用该选项只能删除空目录的文件,不能递归删除该目录里的其它文件。如下面的例子:

$ ls dir1
test1

$ find ./ -name "dir1" -type d -delete
find: cannot delete `./dir1': Directory not empty

可以使用下面的Linux find 命令删除非空目录,如:

$ find ./ -name “dir1” -type d -exec rm -rf {} +

或者

$ find ./ -name “dir1” -type d -exec rm -rf  ;

Linux find 命令结合xargs命令实现删除非空目录

删除当前目录下的所有空目录

$ find ./ -type d -empty -print0 |xargs -0 -i {} rm -rf  “{}”

删除当前目录下所有以“dir”开头的目录

$ find ./ -type d -name “dir*” -print0 |xargs -0 -I {} rm -rf “{}”

Linux检测远程端口是否打开

本文介绍3中检测远程端口方式,telnet、nmap和nc。

如果Linux提示找不到命令,请用apt-get或者yum安装。

1、telnet方式

telnet 101.101.101.101 80

如果提示Connected to 101.101.101.101,说明80端口可以访问。
如果超时,说明端口未开放。

2、nmap方式

命令:

nmap 101.101.101.101 -p 80

# 显示全部打开的端口
nmap ip

根据显示close/open确定端口是否打开。

3、nc方式

命令:

nc -v 101.101.101.101 80

端口未打开返回状态为非0。

s权限位引发postfix及crontab异常处理

一、问题现象

业务反馈某台应用服务器,普通用户使用mutt程序发送邮件时,提示“postdrop warning: mail_queue_enter: create file maildrop/713410.6065: Permission denied”,而且普通用法使用crontab -e 编辑自身任务计划时,也会提示“ crontab: edits left in /tmp/crontab.XXXXCl0bLz” 。

二、问题分析与解决

1、postdrop异常问题

未分类

使用postfix check命令检测发现有如下报错:

postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postqueue
postfix/postfix-script: warning: not set-gid or not owner+group+world executable: /usr/sbin/postdrop 

上面的提示其实已经非常清楚了,在这两个可执行文件的组权限中,没有s权限位。慎重起见,不审找了一台主机对比下,发现确实不存在s权限,正常的权限如下:

# ll /usr/sbin/postqueue
-rwxr-sr-x. 1 root postdrop 259992 Jan 27  2014 /usr/sbin/postqueue

解决方法非常简单:

chmod g+s /usr/sbin/postqueue
chmod g+s /usr/sbin/postdrop
postfix reload 

2、crontab普通用户无法编辑问题

使用crontab -e发现可以正常查看,但是编辑完,保存时提示“ crontab: edits left in /tmp/crontab.XXXXCl0bLz” 。即然上面第一个问题是s权限位引起的,这个问题想必也是,所以未做strace 或审计跟踪,地接查看/usr/bin/crontab权限位,发现和正常主机对比,发现用户权限上少了s权限 ---crontab命令和passwd命令类似,需要用户具有s权限位。执行如下命令后,问题解决:

chmod u+s /usr/bin/crontab
rccron restart

注:这点对比了下SuSE和redhat下的区别,发现user权限下如果没有s权限位。在redhat下提示:

You (test) are not allowed to use this program (crontab)
See crontab(1) for more information

而且直接crontab -l命令查看时,都会提示上面的错误。而在SuSE没有这个s权限,仍然可以正常的通过crontab -l 进行查看。

Linux下通过配置Crontab实现进程守护

我们在实际运维过程中,经常会出现某一个程序(如tomcat,perl等)的进程无缘无故就在服务器上消失了,这样的话第一我们需要投入精力去分析它为什么会消失,第二还需要配置相关检查人员,比较耗费时间。

我们可以通过在Linux下写一个shell脚本,并且配置到Crontab中,这样的话当服务器上没有程序进程的时候,让shell自动帮我们完成这个操作,将业务影响的风险降到最低,同时我们可以定期观察Crontab中输出的日志,看是否有这种情况发生,再进行针对性处理,比问题突发起来再处理好很多。

Shell内容:如果需要配置多个程序的话,将最下方注释放开即可。

#!/bin/sh
# 守护脚本,通过 grep 命令检查进程是否存在然后重新启动进程
# 可以配置多个进程
        # 根据进程名判断进程是否消失(行数为0),红字为查询进程关键字,必须唯一
        if test `ps -ef | grep 'programme name' |grep -v vi |grep -v grep| wc -l` -eq 0
        then
                #记录发生时间 ,记录丢失进程名
                echo `date`                        
                echo 'programme name  is missing.And the programme is restarting...!'  
                #重新启动程序,自己配置
                cd /home/inm/ueap-mysql/redis-2.6.17
                src/redis-server redis.conf
        fi

        # 多个进程守护(配置方法与上方相同)
        # if test `ps -ef | grep INASProcessManager |grep -v vi |grep -v grep| wc -l` -eq 0
        # then
        #         echo 'INASProcessManager is missing!'
        #         echo 'INASProcessManager starting!'
        #         java -jar /jh_app/inas/bin/INASProcessManager.jar >> mng.dump &
        # fi

在crontab中配置上以上脚本,并记录日志:

*/3 * * * * /bin/sh /home/aiuap/esb/ueap-collect/watch.sh>>/home/aiuap/esb/ueap-collect/watch.log

Ubuntu PostgreSQL安装和配置

一、安装

1、安装

使用如下命令,会自动安装最新版,这里为9.5

sudo apt-get install postgresql

安装完成后,默认会:

(1)创建名为”postgres”的Linux用户
(2)创建名为”postgres”、不带密码的默认数据库账号作为数据库管理员
(3)创建名为”postgres”的表

安装完成后的一些默认信息如下:

config /etc/postgresql/9.5/main 
data /var/lib/postgresql/9.5/main
locale en_US.UTF-8
socket /var/run/postgresql
port 5432

2、psql命令

安装完后会有PostgreSQL的客户端psql,通过 sudo -u postgres psql 进入,提示符变成: postgres=#
在这里可用执行SQL语句和psql的基本命令。可用的基本命令如下:

password:设置密码
q:退出
h:查看SQL命令的解释,比如h select。
?:查看psql命令列表。
l:列出所有数据库。
c [database_name]:连接其他数据库。
d:列出当前数据库的所有表格。
d [table_name]:列出某一张表格的结构。
du:列出所有用户。
e:打开文本编辑器。
conninfo:列出当前数据库和连接的信息。

二、修改数据库默认账号的密码

1、登录

使用psql命令登录数据库的命令为:

psql -U dbuser -d exampledb -h 127.0.0.1 -p 5432

上面命令的参数含义如下:-U指定用户,-d指定数据库,-h指定服务器,-p指定端口。

输入上面命令以后,系统会提示输入dbuser用户的密码。

psql命令存在简写形式:

如果当前Linux系统用户,同时也是PostgreSQL用户,则可以省略用户名(-U参数的部分)

如果PostgreSQL内部还存在与当前系统用户同名的数据库,则数据库名也可以省略。

2、修改默认管理员账号的密码

以Linux用户”postgres”的身份(此时只有该用户有psql命令)执行psql客户端,进入该客户端的提示符界面(这里系统用户名、数据库用户名、数据库名都为postgres,故可采用简写形式)

sudo -u postgres psql

未分类

postgres=# alter user postgres with password '123456';

这样,管理员”postgres”的密码就为”123456″。
退出psql客户端命令:q
若要删除该管理员的密码,则可用命令:sudo -u postgres psql -d postgres

三、修改Linux用户的密码

这个其实与安装postgresql关系不大。
以Linux用户”postgres”为例,对其运行passwd命令:

zsm@ubuntu:/etc/postgresql/9.5/main$ sudo -u postgres passwd //也可以 sudo passwd postgres
Changing password for postgres.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

四、配置数据库以允许远程连接访问

安装完成后,默认只能本地才能连接数据库,其他机子访问不了,需要进行配置。(以下示例开放了最大连接权限,实际配置根据你的需要而定)

1、修改监听地址

sudo gedit /etc/postgresql/9.5/main/postgresql.conf 

将 #listen_addresses = ‘localhost’ 的注释去掉并改为 listen_addresses = ‘*’

2、修改可访问用户的IP段

sudo gedit /etc/postgresql/9.5/main/pg_hba.conf 

在文件末尾添加: host all all 0.0.0.0 0.0.0.0 md5 ,表示允许任何IP连接

3、重启数据库

sudo /etc/init.d/postgresql restart

其他:管理用户、建立数据库等

五、添加新用户和新数据库

方法一:使用PostgreSQL客户端psql

运行系统用户”postgres”的psql命令,进入客户端:

sudo -u postgres psql

创建用户”xiaozhang”并设置密码:

postgres=# create user xiaozhang with password '123456';

创建数据库exampledb,所有者为xiaozhang:

postgres=# create database exampledb owner xiaozhang;

将exampledb数据库的所有权限赋予xiaozhang,否则xiaozhang只能登录psql,没有任何数据库操作权限:

grant all privileges on database exampledb to xiaozhang;

方法二:使用shell命令行

安装PostgreSQL后提供了createuser和createdb命令行程序。

首先创建数据库用户”xiaozhang1″,并指定为超级用户:

sudo -u postgres createuser --superuser xiaozhang1;

接着登录psql控制台设置其密码后退出:

zsm@ubuntu:~$ sudo -u postgres psql
psql (9.5.3)
Type "help" for help.

postgres=# password xiaozhang1;
Enter new password: 
Enter it again: 
postgres=# q

然后在shell命令行下创建数据库并指定所有者:

sudo -u postgres createdb -O xiaozhang1 exampledb1;

方法三:使用paadmin3以管理员连接数据库后创建

经过方法一、方法二操作后,执行 postgres=# du 得到用户列表如下:

未分类

执行 postgres=# l 得到数据库列表如下:

未分类

若要删除用户(如删除xiaozhang)可先 postgres=# drop database example; 再 postgres=# drop user xiaozhang; 。

六、基本数据库操作命令

# 创建新表 
CREATE TABLE user_tbl(name VARCHAR(20), signup_date DATE);
# 插入数据 
INSERT INTO user_tbl(name, signup_date) VALUES('张三', '2013-12-22');
# 选择记录 
SELECT * FROM user_tbl;
# 更新数据 
UPDATE user_tbl set name = '李四' WHERE name = '张三';
# 删除记录 
DELETE FROM user_tbl WHERE name = '李四' ;
# 添加栏位 
ALTER TABLE user_tbl ADD email VARCHAR(40);
# 更新结构 
ALTER TABLE user_tbl ALTER COLUMN signup_date SET NOT NULL;
# 更名栏位 
ALTER TABLE user_tbl RENAME COLUMN signup_date TO signup;
# 删除栏位 
ALTER TABLE user_tbl DROP COLUMN email;
# 表格更名 
ALTER TABLE user_tbl RENAME TO backup_tbl;
# 删除表格 
DROP TABLE IF EXISTS backup_tbl;

Postgresql数据库主从流复制

由于某个项目前期资源紧张,使用的Postgresql单节点数据库;为解决项目数据库安全性问题,小蜗牛应要求整理Postgresql数据库主从高可用方案,以下操作为部署主从流复制测试过程,后续整理pgpool高可用、负载均衡方案。。

一、安装依赖

yum install -y gcc-c++ zlib-devel vim openssh-clients

二、安装PG

tar zxvf postgresql-9.3.4.tar.gz 
mkdir /opt/pgsql-9.3
cd postgresql-9.3.4
./configure --prefix=/opt/pgsql-9.3/ --without-readline
make -j 2
make install

三、配置PG环境变量

vim /etc/profile
export PGHOME=/opt/pgsql-9.3
export PGDATA=/var/lib/pgsql/9.3/data/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGHOME/lib/
export PATH=$PGHOME/bin:$PATH:$HOME/bin
source /etc/profile

1、添加postgres用户

useradd postgres -d /var/lib/pgsql

四、配置PG主库

1、初始化PG数据库

su - postgres
initdb

2、启动PG数据库,并创建同步用户

pg_ctl -D /var/lib/pgsql/9.3/data/ -l logfile start
psql
postgres# CREATE ROLE replica login replication encrypted password 'replica';

3、配置用户允许远程登录

vi  /var/lib/pgsql/9.3/data/pg_hba.conf
host    replication     replica     192.168.52.0/24                 trust

4、修改PG主库配置,并重启

vi /var/lib/pgsql/9.3/data/postgresql.conf 
listen_addresses = '*'
wal_level = hot_standby  # 这个是设置主为wal的主机
max_wal_senders = 2 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个
wal_keep_segments = 7 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的
pg_ctl -D /var/lib/pgsql/9.3/data/ -l logfile restart

五、配置PG备库

1、从库不用初始化,直接同步主库数据

su - postgres
pg_basebackup -F p --progress -D $PGDATA -h 192.168.52.101 -p 5432 -U replica --password

2、添加一个recovery.conf配置文件

vim  $PGDATA/recovery.conf
standby_mode = on  # 这个说明这台机器为从库
primary_conninfo = 'host=192.168.52.101 port=5432 user=replica password=replica'  # 这个说明这台机器对应主库的信息
trigger_file = '/var/lib/pgsql/9.3/data/postgresql.trigger.192.168.52.101'
recovery_target_timeline = 'latest' # 这个说明这个流复制同步到最新的数据

3、修改PG从库配置

vi $PGDATA/postgresql.conf 
max_connections = 1000 # 一般查多于写的应用从库的最大连接数要比较大
hot_standby = on  # 说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s # 数据流备份的最大延迟时间
wal_receiver_status_interval = 1s  # 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on # 如果有错误的数据复制,是否向主进行反馈

六、验证是否正常同步

1、主库查看

$ psql
psql (9.3.4)
Type "help" for help.
postgres=# select client_addr,sync_state from pg_stat_replication;
  client_addr   | sync_state 
----------------+------------
 192.168.52.102 | async
(1 row)
postgres=# 

2、通过查看进程

ps aux | grep postgres

主节点有如下进程

postgres  74442  0.0  0.2 258652  2424 ?        Ss   15:02   0:00 postgres: wal sender process replica 192.168.52.102(58199) streaming 0/30101D0

从节点有如下进程

postgres   1676  0.0  0.0 113328   748 ?        Ss   15:01   0:00 postgres: stats collector process

3、通过主库增删改查验证

postgres@master ~]$ psql
psql (9.3.4)
Type "help" for help.
postgres=# create table t_user(id int primary key,name varchar(30));
CREATE TABLE
postgres=# dt
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | t_user | table | postgres
(1 row)
postgres=# insert into t_user values(1,'kbson');
INSERT 0 1
postgres=# insert into t_user values(2,'kbsonlong');                                                          
INSERT 0 1
postgres=# select * from t_user;
 id |   name    
----+-----------
  1 | kbson
  2 | kbsonlong
(2 rows)
postgres=# 

从库查看是否同步

[postgres@slave ~]$ psql
psql (9.3.4)
Type "help" for help.
postgres=# dt
No relations found.   ##最开始从库并没有表
postgres=# dt
         List of relations
 Schema |  Name  | Type  |  Owner   
--------+--------+-------+----------
 public | t_user | table | postgres
(1 row)
postgres=# select * from t_user;
 id |   name    
----+-----------
  1 | kbson
  2 | kbsonlong
(2 rows)
postgres=# 

七、手动测试切换主从

1、手动停止主库,模拟主库宕机

[postgres@master data]$ pg_ctl stop

此时查看从库会提示连接不上主库

LOG:  replication terminated by primary server
DETAIL:  End of WAL reached on timeline 1 at 0/3000518.
FATAL:  could not send end-of-streaming message to primary: no COPY in progress
LOG:  record with zero length at 0/3000518
FATAL:  could not connect to the primary server: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.
FATAL:  could not connect to the primary server: could not connect to server: Connection refused
        Is the server running on host "192.168.52.101" and accepting
        TCP/IP connections on port 5432?
FATAL:  could not connect to the primary server: could not connect to server: Connection refused
        Is the server running on host "192.168.52.101" and accepting
        TCP/IP connections on port 5432?

2、从库手动生成触发文件

在从库生成一个触发文件,就是在配置从库中recovery.conf中配置的trigger_file

[postgres@kbsonlong data]$ touch /var/lib/pgsql/9.3/data/postgresql.trigger.5432
    [postgres@kbsonlong data]$ ll /var/lib/pgsql/9.3/data/postgresql.trigger.5432 
-rw-rw-r-- 1 postgres postgres 0 Jul 30 17:49 /var/lib/pgsql/9.3/data/postgresql.trigger.5432

此时日志会提示找到触发文件,自动切换为新的主库

LOG:  trigger file found: /var/lib/pgsql/9.3/data/postgresql.trigger.5432
LOG:  redo done at 0/30004B0
LOG:  last completed transaction was at log time 2017-07-30 17:38:43.592351+08
LOG:  selected new timeline ID: 2
LOG:  archive recovery complete
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

3、新的主库生成测试数据

在新的主库写入测试数据,方便后面旧的主库恢复为从库是查看是否同步数据

postgres=# select * from t_user;
 id |   name    
----+-----------
  1 | kbson
  2 | kbsonlong
(2 rows)
postgres=# insert into t_user values(3,'kbsonlong3');  
insert into t_user values(4,'kbsonlong4');  
insert into t_user values(5,'kbsonlong5');  INSERT 0 1
postgres=# INSERT 0 1
postgres=# 
INSERT 0 1
postgres=# select * from t_user;
 id |    name    
----+------------
  1 | kbson
  2 | kbsonlong
  3 | kbsonlong3
  4 | kbsonlong4
  5 | kbsonlong5
(5 rows)
postgres=# 

4、旧的主库恢复为新的从库

4.1 生成recovery.conf

[postgres@master data]$ cat recovery.conf |grep -v '^#'
    standby_mode = on 
    primary_conninfo = 'host=192.168.52.102 port=5432 user=replica password=replica'   ##注意host指向新的主库
    trigger_file = '/var/lib/pgsql/9.3/data/postgresql.trigger.5432'
    recovery_target_timeline = 'latest'
    [postgres@master data]$

4.2 启动新的从库,并查看数据是否同步

pg_ctl start
[postgres@master data]$ psql 
psql (9.3.4)
Type "help" for help.
postgres=# select * from t_user;
 id |    name    
----+------------
  1 | kbson
  2 | kbsonlong
  3 | kbsonlong3
  4 | kbsonlong4
  5 | kbsonlong5
(5 rows)
postgres=# insert into t_user values(6,'kbsonlong6');  
ERROR:  cannot execute INSERT in a read-only transaction
STATEMENT:  insert into t_user values(6,'kbsonlong6');
ERROR:  cannot execute INSERT in a read-only transaction
postgres=# 

可以看到刚才在新的主库写入的测试数据已经同步,并且无法再次新的从库写入数据

八、配置启动脚本

PostgreSQL的开机自启动脚本位于PostgreSQL源码目录的contrib/start-scripts路径下

Linux文件即为linux系统上的启动脚本

1、修改linux文件属性,添加X属性

#chmod a+x linux

2、 复制linux文件到/etc/init.d目录下,更名为postgresql

#cp linux /etc/init.d/postgresql

3、修改/etc/init.d/postgresql文件的两个变量

prefix设置为postgresql的安装路径:/opt/pgsql-9.3
PGDATA设置为postgresql的数据目录路径:/var/libg/pgsql/9.3/data

4、执行service postgresql start,就可以启动PostgreSQL服务

#service postgresql start

5、设置postgresql服务开机自启动

#chkconfig --add postgresql

使用cgroup限制某个程序对内存的使用

线上的mongodb是复制集模式的。为了便于监控mongodb的慢查询等状态,在3台机器上都部署了packetbeat,通过抓取27017端口的流量发送到ES集群。

但是第二天发现zabbix告警,显示某一台机器A(从节点)上的mongod进程宕了。日志显示是OOM导致的。

未分类

再一想到,我们每天的mongodb的备份脚本是通过远程主机连接到机器A的27017端口进行dump数据的,通过对比zabbix的网卡流量趋势图、备份脚本的执行时间、message日志中OOM的时间点,可以分析出就是因为mongodump时候产生的大量的数据包被packetbeat抓取到并缓存住,造成服务器的内存被吃光了。

解决方法:

关闭这个机器A(从节点)上面的packetbeat进程,或者配置计划任务以确保备份数据的时候,packetbeat进程不要开启。

当然,这里我们还可以用cgroup限制住packetbeat使用的内存大小,这样的话,最多导致packetbeat宕掉,不会影响到mongod进程的正常工作。

以限制mongod使用的内存大小为例(packetbeat的启动有点复杂,没去折腾)

/etc/init.d/cgconfig start 自动会在/cgroup/下生成一堆文件。

mkdir /cgroup/memory/test/    
echo 1024M > /cgroup/memory/test/memory.limit_in_bytes    
echo 1024M > /cgroup/memory/test/memory.memsw.limit_in_bytes    
cgexec -g memory:test /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongod.conf

这样通过cgroup限制后,当mongod使用的内存达到限额1024MB后,进程会被自动kill。

Ubuntu 下轻松实现 PHP 多版本共存

介绍

随着 php-mysql 拓展在 PHP7 被砍掉以后,一些程序或者插件就不能运行在 PHP7 上,因此 PHP 多版本的需求就显得非常的有必要。
因为系列教程中 PHP 是通过软件源非编译安装的,所以实现多版本共存就非常的方便,而且还非常浪费时间,编译一个php那可是大半个小时啊!!。

教程

这里以安装 PHP7.1 和 PHP5.6 多版本为例。

1、根据 Ubuntu 免编译安装 PHP-FPM 教程进行安装 PHP7.1 和 PHP7.1 和 PHP5.6:

  • 先安装 PHP7.1
apt install php7.1-fpm php7.1-mysql php7.1-curl php7.1-gd php7.1-mbstring php7.1-mcrypt php7.1-xml php7.1-xmlrpc php7.1-zip php7.1-opcache -y
  • 再接着安装 PHP7.0
apt install php7.0-fpm php7.0-mysql php7.0-curl php7.0-gd php7.0-mbstring php.07-mcrypt php7.0-xml php7.0-xmlrpc php7.0-zip php7.0-opcache -y
  • 再接着安装 PHP5.6
apt install php5.6-fpm php5.6-mysql php5.6-curl php5.6-gd php5.6-mbstring php5.6-mcrypt php5.6-xml php5.6-xmlrpc php5.6-zip php5.6-opcache -y

2、设置虚拟子主机反代的版本,在需要使用 PHP7.1 的子主机下使用:

##PHP
  location ~ [^/].php(/|$) {
      fastcgi_pass unix:/run/php/php7.1-fpm.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
      fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
    }

在需要使用 PHP7.1 的子主机下使用:

##PHP
  location ~ [^/].php(/|$) {
      fastcgi_pass unix:/run/php/php7.0-fpm.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
      fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
    }

在需要使用 PHP5.6 的子主机下使用:

##PHP
  location ~ [^/].php(/|$) {
      fastcgi_pass unix:/run/php/php5.6-fpm.sock;
      fastcgi_index index.php;
      include fastcgi.conf;
      fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/:/proc/";
    }

然后重启 OpenResty:

nginx -s reload

就是这么简单粗暴,基本上一下子就设置好了。

无论是编译的还是软件包安装的 Nginx 及其衍生版都可以使用这种方法快速设置多版本.

ubuntu 解决“无法获得锁 /var/lib/dpkg/lock -open”的方法

在ubuntu系统终端下,用apt-get install 安装软件的时候,如果在未完成下载的情况下将终端中断,此时 apt-get进程可能没有结束。结果,如果再次运行apt-get install 命令安装,可能会发生下面的提示:

无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用)
无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?

解决办法如下:

1、终端输入 ps aux ,列出进程。找到含有apt-get的进程,直接sudo kill PID。

2、强制解锁,命令

sudo rm /var/cache/apt/archives/lock

sudo rm /var/lib/dpkg/lock

此后若想重新安装则可输入sudo apt-get install XXX, 但此时又可能会提示 “E: dpkg 被中断,您必须手工运行 sudo dpkg –configure -a 解决此问题”, 手工输入 ” sudo dpkg –configure -a” 后,若又出现 “依赖关系问题 – 仍未被配置”这一提示的话,直接运行 “sudo apt-get -f install” 即可。