前面我们已安装好了python服务器运行所需要的相关软件,而最重要最繁琐的就是参数配置,写这篇就踩了好多坑,花了好多时间,遇到了各种各样的问题。好了费话少说,直接进入本篇话题。
一、让你的python代码跑起来
既然我们要配置的是python服务器,那首先我们要做的第一步是,放上我们的python代码,看看能否运行并访问
先上代码,将下面代码粘贴到记事本上并存储为main.py(这个文名可以随便起,我存储的格式为ANSI格式,即记事本默认的格式)
我们为了方便以后对服务器的管理,需要创建一个指定的文件夹(如果有挂载新硬盘的,可以将这个文件夹绑定到该目录),将日志、数据库、web站、后台服务、svn等内容统一放到指定文件夹下面
首先在根目录下创建一个data文件夹(后面的各种日志、web站点等全都放在这里统一管理,以后我们要查找时就很方便了)
输入命令:mkdir /data
创建python web存储目录:mkdir /data/www
创建测试目录:mkdir /data/www/test
然后使用SSH的上传工具,上传刚刚创建好的main.py文件到www目录下的test文件夹
后面的上传用这个上传工具处理(也可以直接使用vi进行编辑)不再截图
然后我们运行:python /data/www/test/main.py (或进入test目录运行:python main.py)
运行后会显示ImportError: No module named bottle错误,这是因为我们的程序调用了bottle包,而我们未安装这个依赖包,需要安装后程序才能正常运行,以后在使用python中碰到这种情况,直接输入pip install xxx即可
安装bottle包:pip install bottle
安装beaker包:pip install beaker
然后再次输入:python main.py
就会发现python web服务运行起来了
然后关闭防火墙:systemctl stop firewalld (如果浏览器访问不了,可以运行这个命令来关闭防火墙)
打开浏览器输入:http://192.168.0.128:8088/index/ 就可以看到Hello World!了
为了方便后面的测试,我们按Ctrl+C,关闭刚才python启动的main.py服务
二、使用supervisord来管理python进程
supervisord默认配置文件存放路径是/etc/目录下面,安装完成后配置文件是不存在的,需要使用命令生成或我们自己放一个进去,我们先配置一个简单的不使用uwsgi的配置文件
文件名称:supervisord.conf (我存储的格式为ANSI格式,即记事本默认的格式)
使用上传工具上传到/etc/supervisord.conf
为了规范日志管理,我们在data文件夹下继续创建对应的日志文件夹,以后查找supervisord日志就可以在下面创建的文件夹中查看了
输入命令:mkdir /data/logs
输入命令:mkdir /data/logs/supervisord
由于supervisord目前只支持python2,所以运行时需要用python2来启动
启动supervisord服务:/usr/bin/python2.7 /usr/bin/supervisord
我们继续在浏览器中输入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进程的
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配置文件内容,替换成下面参数
将test.conf上传到刚创建的/usr/local/nginx/conf/vhost/目录下,具体内容如下(使用80端口访问,将代理地址指定前面配置的8088端口):
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端口完全没有问题)
四、使用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文件
将这个例子运行起来: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,内容如下:
修改/etc/supervisord.conf配置文件内容,将command=python /data/www/test/main.py修改为command=/usr/local/bin/uwsgi /etc/uwsgi/test.ini
修改nginx的配置文件/usr/local/nginx/conf/vhost/test.conf
重启服务命令:/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日志,看看日志里有什么错误提示。一般会有下面日志:
我们可以输入命令: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文件夹下的配置文件
可以将这三个文件下载下来进行修改,也可以用vi进行编辑
将authz文件替换成下面内容:
[test:/]
admin = rw
allempty = rw
test是svn当前仓库项的模块名称,每个svn的这个名称都是唯一的,不然可能无法登录使用
添加添加了两个账号,admin用于服务器端自动同步svn的代码到对应的web或服务使用,和个人账号区别出来,方便管理和保护账号安全,而allempty是我自己添加用于svn更新最新代码的账号
将password文件替换成下面内容:
这里设置账号对应的密码
将svnserve.conf文件替换成下面内容:
在/data/svn/test/hooks/目录下创建post-commit勾子文件(post-commit文件没有扩展名),用于svn更新成功以后,自动同步到对应的代码目录
/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': 输入对应的密码
操作到这里,svn的自动化发布就完成了,我们只需要在本地检出svn项,然后更新代码后,服务器端就会自动将代码同步到/data/www/test目录下面,并重启对应的supervisord服务了
本地操作截图:(可以下载TortoiseSVN-1.9.4.27285-x64-svn-1.9.4.msi进行使用)
六、postgresql配置
在data下创建pg文件夹,用于放置pg相关的所有东西
输入命令:mkdir /data/pg
在pg文件夹下我们再创建存放数据库的文件夹
输入命令:mkdir /data/pg/data
为新创建的pg文件夹分配数据库服务的操作权限
输入命令:chown postgres:postgres /data/pg
为存放数据库的文件夹分配权限
输入命令:chown postgres:postgres /data/pg/data
设置postgresql相关环境变量
修改profile文件
输入命令:vi /etc/profile
在尾部添加下面代码:
重启一下虚拟机(reboot)或者输入命令: source /etc/profile重新载入配置,然后输入命令:export 就可以看到刚才添加的变量了
初始化postgresql数据库:
使用postgres登录:su postgres
然后执行初始化数据库命令,并指定数据库存储路径:initdb -D /data/pg/data
退出postgres用户,使用原root账号登录,可输入命令:su root,然后输入密码就可以切换回去
我们再次进入/data/pg/data路径,就可以看到多了很多数据库文件夹和配置文件了
打开/data/pg/data/pg_hba.conf配置文件,找到# IPv4 local connections: 在它的下面添加一行host all all 0.0.0.0/0 md5
添加以后,我们链接数据库都必须要用输入密码
打开/data/pg/data/postgresql.conf配置文件
找到#listen_addresses = 'localhost',将前面的#删掉,参数localhost表示只允许当前服务器能链接数据库,如果想指定地址可以访问,可以输入ip地址,多个地址时用逗号分隔,如果开放所有地址可以访问,由使用*
找到#port = 5432,将前面的#删掉,这里可以指定访问数据库的端口
启动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配置文件,内容如下:
配置中的pg_admin是pgbouncer的登录账号,auth_file是配置各种账号密码的文件路径,在这里可以直接配置读与写用不同的数据库(write_db与read_db)
添加/data/pg/pgbouncer/userlist.txt配置文件,内容如下:
设置文件夹访问用户权限:chown -R postgres:postgres /data/pg/pgbouncer/*
添加pgbouncer相关环境变量
输入命令:vi /etc/profile
在尾部添加下面代码:
输入命令重启服务器: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之前安装没有指定安装路径,重新做了修改,大家可以查看检查安装
修改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 ,在内容后面添加下面命令项,然后保存退出
给予rc.local可执行权限:chmod +x /etc/rc.d/rc.local
然后重启服务器,我们使用ps -ef就可以查看到各服务正在运行中了