- 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 端口完全没有问题)
四、使用 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 (运行后才可以载入内存)
启动或重启配置修改项对应的服务:/usr/bin/supervisorctl update
PS: 其他 supervisord 命令说明
当然也可以重启全部 supervisord 服务:/usr/bin/supervisorctl reload (运行这个将会重启全部服务,会比较慢)
我们更新了 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 了
五、使用 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 文件替换成下面内容:
- [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': 输入对应的密码
操作到这里,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
在尾部添加下面代码:
- 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
退出 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 配置文件,内容如下:
- [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 中文社区大牛:阿弟,他就一句话帮我这个外行人解决了,非常感谢阿弟的帮助
来源: http://www.cnblogs.com/EmptyFS/p/6595968.html