PHP共享内存使用状况和注意点

  前面我们早已装好了python服务器运行所需要的相干软件,而绝要紧最麻烦的就是是参数配置,写这篇就踹了森坑,花了不少时,遇到了各种各样的问题。好了费话少说,直接进入本篇话题。

应用状况

  PS:本人未是标准的运维,很多linux服务器的题材还是同等了然半解,只能依据自己之研究整治来单机版的python
web服务器,而对多服务器自动化同步的配置、服务器的监察、Linux服务器的安康、服务器的调优(很多劳务安装不是着重,能以各种参数运用配置到洽到好处才是难题),大家最为好找专业的运维工程师小戴同学叩问,问我之言语我呢非必然能够回复的出。再同坏感谢小戴同学的用心指导,让自家学会了众服务器运维方面的文化,才有这篇文章。(想模仿python与自动化运维的得达标外的博客http://www.linuxyw.com/)

监控汇总

当下着为此之一个观,针对有一样宝机械及的谬误进行集中并报警,我们拿同分钟之内的同一报警合并成为一久,用共享内存来暂存,非常实用且迅速。

 

PHP SESSION

假设你是单机的劳动,且又启用了session,那么好管session换成共享内存的来存储,会于文件要尽早齐不少,这里还要强调是单机,这是绝酷之软肋,但不怕功能上来讲没有memcache方便。


哎是共享内存

共享内存是一律栽于一如既往台机器的例外进程(应用程序)之间交换数据的计。一个进程而创造一个不过供应其他进程看的外存段,并予其对应的权能。每个内存段拥有一个无比的ID,我们日常称之为shmid,这个ID指向一个物理内存区域,其他进程而经过这ID来操作这块内存,
包扩读取、写副以及去除。

共享内存的采用是同一种植在过程中交换数据的短平快道,主要为于创建内存段之后传递数据,不见面涉嫌基本。这种方式常常叫进程之中通信
(IPC)。其他 IPC 方法包括管道、消息队列、RPC 和效仿接字。

 

PHP 中几乎种植普遍的共享内存使用办法

APC 可以缓存 PHP 的 opcode 提高使用之属性,可以当与个 PHP-FPM
进程池的进程中共享数据,常用功能如下:

  • apc_store
  • apc_fetch
  • apc_add
  • apc_delete
  • apcinc apcdec
  • apc_cas
  • apcclearcache
  • apcsmainfo

  目录:

Shmop Unix 系统共享内存使用接口常用功能:

  • shmop_open
  • shmop_close
  • shmop_read
  • shmop_write
  • shmop_delete

  一、让你的python代码跑起

ipcs -m 查看本机共享内存的状态和统计。

  二、使用supervisord来管理python进程
  三、将nginx与supervisord关联起来(使用代理方,非uwsgi)
  四、使用nginx+supervisord+uwsgi来管理python web服务
  五、使用svn来管理python的自动化发布
  六、postgresql配置
  七、pgbouncer配置
  八、Redis配置
  九、设置各服务开机启动功能

ipcrm -m shmid 或 ipcrm -M shmkey 清除共享内存中的数目。

SystemV Shm常用功能:

  • ftok
  • shm_attach
  • shm_detach
  • shmputvar
  • shmgetvar
  • shmremovevar

使用共享内存需要考虑操作的原子性和沿、并行和排斥。

sem 信号量相关函数: 
* semget \ semremove \ semacquire \ sem*release

 

PHP 提供的 IPC 机制。

  • –enable-shmop 共享内存,只能按字节操作
  • –enable-sysvsem 信号量
  • –enable-sysvshm 共享内存,和 shmop 的异样是供的操作函数不同,支持
    key、value操作
  • –enable-sysvmsg 音队列

  一、让你的python代码跑起

正文主讲

哪些用 PHP shmop
创建与操作共享内存段,使用它们存储可供应其他应用程序使用的数量。

  既然我们要安排的是python服务器,那首先我们设举行的率先步是,放上我们的python代码,看看是否运行并访问

1. 创建内存段

共享内存函数类似于文件操作函数,但管需处理一个淌,您将处理一个共享内存访问
ID。第一个示范就是 shmopopen
函数,它同意而打开一个存世的内存段或创造一个新内存段。此函数非常类似于经典的
fopen
函数,后者打开用于文书操作的流动,返回一个资源供其他想读取或写副该打开的流的函数使用。让咱省
shmop
open的用法:

<?php  
$key = ftok(__FILE__, 'h');
$mode = 'c';
$permissions = 0644;
$size = 1024;
$shmid = shmop_open($key, $mode, $permissions, $size);
?>

  先上代码,将下代码粘贴到记事本上并蕴藏吗main.py(这个文名可以无从,我存储的格式为ANSI格式,即记事本默认的格式)

率先只参数($key):

系成立IPC通讯 (消息队列、信号量和共享内存)
时必指定一个key值。通常状态下,该key值通过ftok函数得到, *
*key是一个咱们逻辑上表示共享内存段的标识。不同进程而选与一个Key值就可共享同一段储存段。

#!/usr/bin/evn python
# coding=utf-8

from bottle import default_app, get, run
from beaker.middleware import SessionMiddleware

@get('/index/')
def callback():
    return 'Hello World!'

if __name__ == '__main__':
    app_argv = SessionMiddleware(default_app())
    run(app=app_argv, host='0.0.0.0', port=8088, debug=True, reloader=True)
else:
    application = SessionMiddleware(default_app())

亚个参数($mode):

访模式,它好像于fopen的拜访模式,有以下几种植

  • 模式 “a”,它同意而拜只读内存段
  • 模式 “w”,它同意你拜可读写的内存段
  • 模式
    “c”,它创建一个初内存段,或者使该内存段已是,尝试打开它进行读写
    *模式 “n”,它创建一个初内存段,如果该内存段已存在,则会砸,返回
    false,并陪同产生warning: unable to attach or create shared memory
    segment

  我们为了方便以后对服务器的管制,需要创造一个点名的文书夹(如果来挂载新硬盘的,可以拿此文件夹绑定到拖欠目录),将日志、数据库、web站、后台服务、svn等内容统一置于指定文件夹下面

老三独参数($permissions):

内存段的权能。您得以此间提供一个八迈入制值,它相仿于UNIX操作系统文件和目录的操作权限。

  首先以彻底目录下创办一个data文件夹(后面的各种日志、web站点等皆在此处统一管理,以后我们而找时便死有益于了)

季只参数($size):

外存段大小,以字节为单位。在描写副一个内存段之前,您必须在她之上分配适当的字节数。

  输入指令:mkdir /data

返结果:

这函数返回一个 ID 编号,其他函数可采取该 ID 编号操作该共享内存段。这个
ID 是共享内存访问 ID,与系统 ID
不同,它为参数的形式传递。请留意不要混淆这二者。如果失败,shmop_open
将返回 FALSE。

shmop_open成功后,使用ipcs -m, 可以查到刚创建的内存段,注意
申请之外存段有严厉的权能,比如用root用户申请之,普通用户就无权访问

  创建python web存储目录:mkdir /data/www

2. 通向外存段写副数据

使用 shmop_write 函数为共享内存块写副数据。此函数的利用非常简短,它就收受
3 个参数,如下所示。

<?php  
//这里shmid可以延用上一段代码返回的shmid
$shmid = shmop_open(ftok(__FILE__,'h'), 'c', 0644, 1024); 
shmop_write($shmid, "Hello World!", 0);

?>

斯函数类似于 fwrite 函数, 在此处来三独参数。 *
第一个参数($shmid):是 shmop_open 返回的
ID,它识别而操作的共享内存块。 *
第二个参数($data):是你希望存储的数量。 *
第三独参数($offset):是公想开勾画副的岗位。默认情况下,我们老以
0 来代表开始勾画副的职位。

回结果:此函数在失败时见面回去 FALSE,在成时会见回写副的字节数。

  创建测试目录:mkdir /data/www/test

3. 打外存段读取数据

起共享内存段读取数据很粗略。您才待一个开辟的内存段和 shmop_read
函数,它承受三单参数,如下所示:

<?php  
$shmid = shmop_open(ftok(\__FILE_\_,'h'), 'c', 0644, 1024);
shmop_write($shmid, "Hello World\!", 0);  
var_dump(shmop_read($shmid, 0, 11));  
?>
  • 率先只参数($shmid):是 shmop_open 返回的
    ID,它识别而操作的共享内存块。
  • 次只参数($start):是若要打内存段读取的职,这个参数可以老为0,
    表示数据的初步
  • 老三独参数($count):是公想读取的字节数。一般情形下我们为此shmop_size($shmid),以便完整的读取它。

  然后使SSH的上传工具图片 1,上传刚刚创建好的main.py文件及www目录下之test文件夹

4. 去内存段

shmop_delete 该函数只收到一个参数,如下所示:

<?php  
$shmid = shmop_open(ftok(\__FILE_\_,'h'), 'c', 0644, 1024);
shmop_delete($shmid);  
?>

骨子里这个函数不见面实际删除该内存段。它用该内存段标记为除去状态,因为共享内存段在闹外进程在下其时无法为剔除。shmop_delete
函数将欠内存段标记为去,阻止任何其它进程打开它。要去除其,我们得关闭该内存段。

  图片 2

5. 关门内存段

开辟一个共享内存段会 “附加”
到它。附加该内存段之后,我们而在其中进行读取和写入,但好操作后,我们要由它们脱。

<?php  
$shmid = shmop_open(ftok(\__FILE_\_,'h'), 'c', 0644, 1024);
shmop_write($shmid, "Hello World\!", 0);  
shmop_delete($shmid); shmop_close($shmid);  
?>

  后面的齐传自书用这个上传工具处理(也足以直接动用vi进行编辑)不再截图

共享内存的原子操作 – 信号控制

本着共享内存的勾操作自己不是原子性的,那么当我们大量并作进行读写的下,怎么保证原子性呢,这里而引入信号量进行支配。

PHP 也供了坐扩展 sysvsem ,其实我们于看sysvsem
提供的一模一样文山会海sem\的方法的时光,就会见想到,这和上面提到的shmop\生什么区别也,我们来拘禁官房文档中的立一个说:PHP
already had a shared memory extension (sysvshm) written by Christian
Cartus cartus@atrior.de, unfortunately this extension was designed
with PHP only in mind and offers high level features which are extremely
bothersome for basic SHM we had in mind.

为就算是说:sysvshm
扩展提供的道在蕴藏之前对用户之数开展serialize处理,这里就招这个蕴藏的数目是无能为力和外语言共享的,这无异多样措施是php
only的方式。

引入信号控制之后的言传身教:

<?php  
$key = ftok(_FILE_, 'h') $mode = "c";
$permissions = 0755;
$size = 1024; // 内存段的大小,单位是字节
$semid = sem_get($key); # 请求信号控制权
if (sem_acquire($semid)) {  
    $shmid = shmop_open($key, 'c', 0644, 1024); # 读取并写入数据
    shmop_write($shmid, '13800138000', 0); # 关闭内存块
    shmop_close($shmid); # 释放信号 sem_release($semid);
}

共享内存的操作是那个快之,在地方想使效仿实现写副冲突是可怜拮据的,但是地方想模仿实现写副冲突实际上是甚麻烦之(考虑到计算机的尽进度)。在当地测试着,使用
for 循环操作时如不使用shmop_close
关闭资源会冒出无法打开共享内存的失实警告。这应是盖正在共享内存被上一致破操作占用着尚从未放导致。

  然后我们运行:python /data/www/test/main.py
 (或进入test目录运行:python
main.py)

共享内存,memcache,文件之宣读写速度相比。

以下是还要读写1k的数码读写100000不善的年华相比:

  读(s) 写(s)
memcache 7.8 8.11
file 2.6 3.2
shm 0.1 0.07

  运行后会显示ImportError: No module
named
bottle错误,这是为我们的主次调用了bottle包,而我辈不安装之依靠包,需要装后先后才会正常运转,以后在用python中遇这种场面,直接输入pip
install xxx即可

  安装bottle包:pip install bottle

  安装beaker包:pip install beaker

  图片 3

  然后还输入:python main.py

  就见面发觉python
web服务运行起来了

  图片 4

   然后关防火墙:systemctl stop firewalld 
(如果浏览器访问不了,可以运作是令来关闭防火墙)

   打开浏览器输入:http://192.168.0.128:8088/index/
 就可以看到Hello World!了

   图片 5

  为了便利后面的测试,我们随Ctrl+C,关闭刚才python启动的main.py服务

 

  二、使用supervisord来管理python进程

  supervisord默认配置文件存放路径是/etc/目录下面,安装好后安排文件是勿有的,需要用命令生成还是我们温馨加大一个入,我们先行安排一个大概的不使用uwsgi的布局文件

  文件名称:supervisord.conf
(我存储的格式为ANSI格式,即记事本默认的格式)

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/data/logs/supervisord/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=10MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket


[program:test]
command=python /data/www/test/main.py    ; supervisord将要执行的运行python服务的命令
directory=/data/www/test
stdout_logfile=/data/logs/supervisord/test_supervisord.log    ; supervisord当前这个test服务运行产生的日志存储路径,方便我们查看运行情况
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT

  使用上传工具上传到/etc/supervisord.conf

  图片 6

  为了规范日志管理,我们当data文件夹下继续创造对应之日记文件夹,以后查找supervisord日志就好于脚创建的文书夹着查了

  输入指令:mkdir /data/logs

  输入指令:mkdir
/data/logs/supervisord

  由于supervisord目前仅支持python2,所以运行时需用python2来启动

  启动supervisord服务:/usr/bin/python2.7
/usr/bin/supervisord

  图片 7

  我们继续以浏览器被输入http://192.168.0.128:8088/index/
可以发现还是可健康访问,看到Hello World!(前面执行python
/data/www/test/main.py后,按Ctrl+C就直接退出了,用浏览器是力不从心正常访问的,现在的顾是supervisord启动之)

  使用supervisord启动之python进程可以发现,我们就此kill
xxx命令来一直关门python进程,关闭后supervisord会重新开动新的历程,也就是说不kill掉supervisord进程,是无力回天杀死supervisord启动之python进程的

  图片 8

 

  PS:由于python2.7.5以及python3.5.2现有,在针对supervisord配置进行修改之后,使用命令:/usr/bin/supervisord
-v执行时,会并发 ImportError: No module named
‘supervisor’
这个似是而非,虽然咱前面用的是python2.7.5来启动supervisord服务的,但别执行命令时,默认还是用python这个链接,所以我们需要对/usr/bin/supervisord和/usr/bin/supervisorctl进行改动

  执行命令:vi /usr/bin/supervisord

  将第一履行的#!/usr/bin/python 改为 #!/usr/bin/python2.7.5

  执行命令:vi /usr/bin/supervisorctl

  将率先实施的#!/usr/bin/python 改为 #!/usr/bin/python2.7.5

  我们再度实施:/usr/bin/supervisord
-v时即便如常了

 

  老三、将nginx与supervisord关联起来(使用代理方,非uwsgi)

  首先我们只要也nginx创建对应之造访账号

  输入指令:/usr/sbin/groupadd -f
www
  输入指令:/usr/sbin/useradd -g www
www

 

  为nginx创建对应的日志管理文件夹

  输入指令:mkdir /data/logs/nginx

  因为nginx的布置默认全部凡是当nginx.conf里安的,网站多时管理不便于,所以我们需要创造一个文本夹,将每个独立的网站配置在中间

  创建nginx配置统一管理文件夹:mkdir /usr/local/nginx/conf/vhost

  修改/usr/local/nginx/conf/nginx.conf配置文件内容,替换成下面参数

user www www;
worker_processes  1;
worker_rlimit_nofile 10240;
error_log /data/logs/nginx/error.log error;

events {
    use epoll;
    worker_connections  10240;
}

http {
    log_format  main  '[$time_local] $remote_addr  $upstream_addr  $status  $body_bytes_sent  [$request_time] '
                      '"$request" "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    tcp_nopush     on;
    tcp_nodelay on;
    server_tokens off;

    include vhost/*.conf;
}

  将test.conf上传到刚刚创立的/usr/local/nginx/conf/vhost/目录下,具体内容如下(使用80端口访问,将代理地址指定前面配置的8088端口):

server {
    listen      80;
    charset     utf-8;
    root        /data/www/test;
    server_name 192.168.0.128;

    location / {
        proxy_pass  http://127.0.0.1:8088;
    }

    access_log  /data/logs/nginx/test_access.log  main;
}

  PS:在用前,我们需要还一不成服务器,不然可能会见现出端口被霸占访问出现404之题目,重开后哪怕见怪不怪

  启动nginx服务: /usr/local/nginx/sbin/nginx 

  启动supervisord服务:/usr/bin/python2.7
/usr/bin/supervisord

  如果改动了nginx配置内容,需要重起动nginx才会奏效,重开命令: /usr/local/nginx/sbin/./nginx 

  如果开行后尚未出现错误信息,就表示启动成功了,可以行使命令来查询启动景:ps -ef | grep nginx

  我们以浏览器中输入http://192.168.0.128/index/可以发现Hello
World!访问正常(PS:可以窥见,我们直接访问80端口全没有问题)

  图片 9

  四、使用nginx+supervisord+uwsgi来管理python
web服务

  首先,我们被uwsgi运行起来

  根据官网(https://uwsgi-docs.readthedocs.io/en/latest/)说明,我们还需要安装python-dev插件

  输入指令:yum install python-dev

 

  第一个Hello World!例子:

  输入指令:vi /tmp/foobar.py

  然后点击键盘 i
 进入编辑模式,将脚的代码粘贴进vi编辑器,然后按Esc键,按Shift+:,输入wq+回车键,保存foobar.py文件

 

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

 

  将此事例运行起来:uwsgi –http :9090 –wsgi-file
/tmp/foobar.py

 

  我们于浏览器中输入网址:http://192.168.0.128:9090/
就可以看到Hello World了

 

  我们以Ctrl+C,关闭刚刚之所以uwsgi启动的main.py服务

  为了好uwsgi配置的军事管制,我们得以etc目录下创办uwsgi文件夹,用来存储配置文件

  输入指令:mkdir /etc/uwsgi

  创建uwsgi日志文件夹:mkdir /data/logs/uwsgi

  创建布局文件,并将她上传到/etc/uwsgi目录下,配置文件称:test.ini,内容如下:

[uwsgi]
socket = 127.0.0.1:8088
chdir = /data/www/test/
wsgi-file = /data/www/test/main.py 
limit-as = 512
reload-on-as = 256
reload-on-rss = 192
processes = 2
max-requests = 1000
pythonpath = /data/www/test/
daemonize = /data/logs/uwsgi/test_uwsgi.log
log-maxsize = 10000000
disable-logging = true
master = true
vacuum = true
no-orphans = true

  修改/etc/supervisord.conf配置文件内容,将command=python
/data/www/test/main.py修改为command=/usr/local/bin/uwsgi
/etc/uwsgi/test.ini

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/data/logs/supervisord/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=10MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket


[program:test]
command=/usr/local/bin/uwsgi /etc/uwsgi/test.ini
directory=/data/www/test
stdout_logfile=/data/logs/supervisord/test_supervisord.log
socket-timeout=3
autostart=true
autorestart=true
redirect_stderr=true
stopsignal=QUIT

  修改nginx的布置文件/usr/local/nginx/conf/vhost/test.conf

server {
    listen      80;
    charset     utf-8;
    root        /data/www/test;
    server_name 192.168.0.128;

    location / {
        include uwsgi_params;
        uwsgi_pass  127.0.0.1:8088;
    }

    access_log  /data/logs/nginx/test_access.log  main;
}

  重开服务令:/usr/local/nginx/sbin/nginx -s
reload(如果nginx服务没有启动,就动用这个命令:/usr/local/nginx/sbin/nginx )

  另外,如果我们修改了supervisord的布置文件,则需要周转下面发号施令还开服务(如果您以再次开了服务器,则要重新启航supervisord服务:/usr/bin/python2.7
/usr/bin/supervisord,否则不用执行之命令)

  载入刚刚改了的布局信息:/usr/bin/supervisorctl reread
(运行后才方可载入内存)

  重开全部supervisord服务:/usr/bin/supervisorctl reload (运行是用会更开全部劳动,会较缓慢)

  PS:其他supervisord命令说明

  启动或再开配置修改项对应的服务:/usr/bin/supervisorctl
update (有时可能会见启动失败,需要用另外方法启动)

  我们创新了python文件,如果没有重启对应的服务修改是无奏效之,即看时还是旧的代码功能,需要再次开对应之劳务才行,比如现在我们的supervisord服务号叫做test,那么得使下发号施令来再次开对应的uwsgi服务

  重开test的uwsgi服务:/usr/bin/supervisorctl restart
test (启动服务令:/usr/bin/supervisorctl start
test)

 

  我们当浏览器被输入网址:http://192.168.0.128/index/ 就可以看到用nginx+supervisord+uwsgi+python(bottle框架)运行的Hello
World了

 

—————————————-2017-3-30
16:06改动更新—————————————————

  ps:之前使用/usr/bin/supervisorctl
update重开supervisord,可能浏览器访问时起502 Bad
Gateway,这时我们用查阅supervisord和uwsgi日志,看看日志里发啊错提示。一般会发生下**
日志:**

 

*** Starting uWSGI 2.0.14 (64bit) on [Thu Mar 30 03:44:31 2017] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-11) on 29 March 2017 23:46:25
os: Linux-3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016
nodename: localhost.localdomain
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 16
current working directory: /data/www/test
detected binary path: /usr/local/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** 
chdir() to /data/www/test/
your processes number limit is 62479
limiting address space of processes...
your process address space limit is 536870912 bytes (512 MB)
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
probably another instance of uWSGI is running on the same address (127.0.0.1:8088).
bind(): Address already in use [core/socket.c line 769]

 

  我们得输入指令:ps -ef | grep
uwsgi,查看转uwsgi有没来运行,如果没有运行吧,可尽:/usr/bin/supervisorctl
reload,再使ps命令检查一下uwsgi启动了并未,启动了就算意味着正常了

 

 

  五、使用svn来治本python的自动化发布

  创建svn管理目录:mkdir /data/svn

  进入svn管理目录:cd /data/svn

  创建svn项:svnadmin create test

  修改/data/svn/test/conf文件夹下的布文件

  图片 10

  可以拿及时三独公文下充斥下来进行改动,也得就此vi进行编辑

  将authz文件替换成下面内容:

[test:/]

admin = rw
allempty = rw

   test是svn当前仓库项之模块名称,每个svn的此名称还是唯一的,不然可能无法登录使用

  添加添加了少只账号,admin用于服务器端自动同步svn的代码到相应的web或劳动用,和个体账号区别出来,方便管理和保障账号安全,而allempty是自个儿自己加上用于svn更新最新代码的账号

  将password文件替换成下面内容:

[users]
admin = 123456
allempty = 123456

  这里装账号对应的密码

  将svnserve.conf文件替换成下面内容:

[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz

  以/data/svn/test/hooks/目录下开创post-commit勾子文件(post-commit文件并未扩大名),用于svn更新成功后,自动同步到相应的代码目录

#!/bin/sh

export LANG=en_US.UTF-8
/usr/bin/svn up /data/www/test
/usr/bin/supervisorctl restart test

  /usr/bin/svn up /data/www/test
这个令是运作更新指令,本地代码通过svn更新到服务器以后,勾子会运作它们来一头到指定的/data/www/test目录

  /usr/bin/supervisorctl restart
test 为咱们为此底是supervisord来治本python
web服务的,代码更新完成以后从未生效,需要再服务才行,这个命令是用来更开指定的supervisord进程的,它们拉咱以相应的uwsgi进程展开重复开操作

  运行命令,将与勾子post-commit可实行权:chmod +x
/data/svn/test/hooks/post-commit

 

  启动svn服务:/usr/bin/svnserve -d -r
/data/svn

  配置test项目服务器端svn同步设置

  输入指令:svn checkout svn://localhost/test
/data/www/test (在服务器端对test项进行svn检出操作)

  PS:出现Password for ‘root’:
直接回车就足以了,Username:输入前面authz里安的账户号,Password for
‘admin’: 输入相应之密码

  图片 11

  操作及这边,svn的自动化发布即水到渠成了,我们只有待以地面检出svn项,然后更新代码后,服务器端就见面自动将代码同步到/data/www/test目录下面,并再开对应的supervisord服务了

  本地操作截图:(可以下载TortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi进行动)

  图片 12

  图片 13

  图片 14

  图片 15

 

  六、postgresql配置 

  以data下创造pg文件夹,用于放置pg相关的享有东西

  输入指令:mkdir /data/pg

  以pg文件夹下我们再次创存放数据库的公文夹

  输入指令:mkdir /data/pg/data

  也新创办的pg文件夹分配数据库服务的操作权限

  输入指令:chown
postgres:postgres /data/pg

  图片 16

  为存放数据库的文书夹分配权限

  输入指令:chown postgres:postgres
/data/pg/data

  设置postgresql相关环境变量

  修改profile文件

  输入指令:vi /etc/profile

  于尾部添加下面代码:

PGDATA=/data/pg/data
PGHOST=127.0.0.1
PGDATABASE=postgres
PGUSER=postgres
PGPORT=5432
PATH=/usr/pgsql-9.6/bin:$PATH
export PATH
export PGDATA PGHOST PGDATABASE PGUSER PGPORT
export TMOUT=1000

  重开一下虚拟机(reboot),然后输入指令:export
就可以看到刚才添加之变量了

  初始化postgresql数据库:

  使用postgres登录:su postgres

  然后实行初始化数据库命令,并指定数据库存储路径:initdb -D /data/pg/data

  图片 17

  退出postgres用户,使用原root账号登录,可输入指令:su
root,然后输入密码便得切换回去

  

  我们重上/data/pg/data路径,就可以看到几近矣过多数据库文件夹和配备文件了

  图片 18

  打开/data/pg/data/pg_hba.conf配置文件,找到# IPv4 local connections:
在它们的下面加加一行host    all  
          all             0.0.0.0/0         md5

  图片 19

  添加以后,我们链接数据库都必使就此输入密码

  打开/data/pg/data/postgresql.conf配置文件

  找到#listen_addresses =
‘localhost’,将前方的#删掉,参数localhost表示只是允许时服务器能够链接数据库,如果想指定地方可以看,可以输入ip地址,多独地点时用逗号分隔,如果开具有地点可以拜,由运用*

  找到#port =
5432,将前的#删掉,这里可以指定访问数据库的端口

  图片 20

  启动postgresql数据库:su postgres -c
“/usr/pgsql-9.6/bin/pg_ctl start -D /data/pg/data”

  使用postgres用户登录:su postgres

  连接数据库:psql -U postgres

  修改postgres用户密码:Alter user postgres with password
‘123456’;

  退出数据库连接:\q

  我们可在地面的windows系统里设置postgresql9.6(官方下载地址:https://www.postgresql.org/download/windows/),然后使用pgAdmin4连接上服务器的数据库,用图形界面来管理数据库了

 

  七、pgbouncer配置

  pgbouncer是pg数据库的链接池管理工具,一般用于高并发高可用时采用,并发量不强之系可无使用其,可利用直接链接数据库的措施

  创建pgbouncer配置文件和日志存储文件夹:mkdir
/data/pg/pgbouncer

  设置文件夹访问用户权限:chown -R postgres:postgres
/data/pg/pgbouncer

  设置文件夹读写权限:chmod 600
/data/pg/pgbouncer

  添加/data/pg/pgbouncer/pgbouncer.ini配置文件,内容如下:

[databases]
write_db = host=127.0.0.1 port=5432 dbname=postgres user=postgres password=123456
read_db = host=127.0.0.1 port=5432 dbname=postgres user=postgres password=123456
[pgbouncer]
listen_port = 5433
listen_addr = *
auth_type = md5
auth_file = /data/pg/pgbouncer/userlist.txt
logfile = /data/pg/pgbouncer/pgbouncer.log
pidfile = /data/pg/pgbouncer/pgbouncer.pid
admin_users = pg_admin
pool_mode = session
max_client_conn = 1000
default_pool_size = 128

  配置中之pg_admin是pgbouncer的登录账号,auth_file是布置各种账号密码的文本路径,在此可以一直配备读与写用不同的数据库(write_db与read_db)

  添加/data/pg/pgbouncer/userlist.txt配置文件,内容如下:

"pg_admin" "123456"

  设置文件夹访问用户权限:chown -R postgres:postgres
/data/pg/pgbouncer/*

  添加pgbouncer相关环境变量

  输入指令:vi /etc/profile

  在尾部添加下面代码:

PATH=/usr/local/pgbouncer/bin:$PATH

  输入指令还开服务器:reboot,让配置生效

  启动postgresql数据库:su postgres -c
“/usr/pgsql-9.6/bin/pg_ctl start -D /data/pg/data”

  启动pgbouncer服务: su postgres -c
“/usr/local/bin/pgbouncer -d
/data/pg/pgbouncer/pgbouncer.ini”

  查看pgbouncer服务启动景:ps -ef | grep pgbouncer

  PS:pgbouncer服务的启航,不能够一直用root用户失去履行启动命令,这样见面现出 FATAL
@src/main.c:875 in function main(): PgBouncer should not run as root
这样的左提示,为了这个题材,我因此这荒唐提示做呢要字找了N久,都无找到解决办法,还好认识postgresql中文社区大牛:阿弟,他尽管一样词话拉我者外行人解决了,非常感谢阿弟的拉扯

  pgbouncer具体的测试与使用,以后有关文章还写

 

  八、Redis配置

  redis之前设置没有点名安装路径,重新开了改,大家可查看http://www.cnblogs.com/EmptyFS/p/6558800.html 检查装置

  修改redis配置信息(可以下载/usr/local/redis/redis.conf或直接用vi
/usr/local/redis/redis.conf进行编辑)

  主要修改内容产生:

  bind 127.0.0.1 
 redis服务走访限制设置。使用127.0.0.1表示只能本机访问;如果就此底凡服务器在局域网里的ip:192.168.1.128,即意味着局域网外之ip都好拜;如果运用0.0.0.0由于象征所有地方都可看。需要绑定多独时,可以加上多独bind
xxx.xxx.xxx.xxx

  daemonize no  这个修改也daemonize yes
 开启守护进程

  dir ./  这里需要改也dir
/usr/local/redis/data 不然redis数据会储存到root文件夹下面

  随便找找个位置多requirepass
xxxxx,可以加访问redis访问密码,如果你的redis对外网开放,这个密码一样只要足够长足够复制,不然以redis的访问速度,比较好受人破解

  可以加maxmemory
1024M来限制redis占用内容大小,也得以免限制

  修改完后,创建redis数据存储文件夹:mkdir /usr/local/redis/data

  修改形成,运行redis启动命令:/usr/local/redis/bin/redis-server
/usr/local/redis/redis.conf

  redis服务就是启动了,可以采用RedisDesktopManager这种第三着可视化工具来访问redis,查看中的贮存数据

 

  九、设置各服务开机启动功能

  以上博的劳动,有的朋友喜欢拿它们设置成service方式自动启动,也来喜欢用命令道来启动它们,为了操作简易,我们拿其还合并安装为令启动方式。

  输入指令: vi
/etc/rc.local ,在情节后长下面发号施令项,然后保留退出

ulimit -SHn 102400
/usr/bin/python2.7 /usr/bin/supervisord
/usr/local/nginx/sbin/nginx
/usr/bin/svnserve -d -r /data/svn
su postgres -c "/usr/pgsql-9.6/bin/pg_ctl start -D /data/pg/data"
su postgres -c "/usr/local/bin/pgbouncer -d /data/pg/pgbouncer/pgbouncer.ini"
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

  给予rc.local可实施权:chmod +x
/etc/rc.d/rc.local

  然后再开服务器,我们使用ps
-ef就足以查到各服务在周转面临了

 

 

 版权声明:

  本文由AllEmpty原创并揭示于博客园,版权与博客园共同持有,欢迎转载,未经自己同意要保留这个段子声明,且以篇章页面明显位置给出原先和链接,要不保留追究法律责任的权。如发生题目,可以经1654937@qq.com 联系自己,非常感谢。

    发表本编内容,**举凡为和大家齐声学习共同进步,有趣味之情侣可加加Q群:669058475,大家共同探讨。**

  更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注