腾讯云CentOS服务器上配置nginx+python3

来源:互联网 发布:常用mysql语句面试题 编辑:程序博客网 时间:2024/06/05 03:43

之前写过一篇腾讯云Ubuntu服务器上配置apache+python的博客,实际上由于一些莫名其妙的原因,这个服务器最终被我用成了一个php服务器……
最近估计是被搞事的盯上了,服务器疯狂被ddos,以至于后台直接限制了访问……重装系统以后想着一不做二不休,正好借此机会改一下服务器的架构,抛弃了apache+php,彻底转投nginx+python3。正巧小猴后端最近也想重构,看上了nginx+tornado非阻塞调用方式对高并发量的优秀表现,所以也顺手配了tornado做一些小测试

0x01 升级CentOS 7自带的Python

CentOS 7自带的python是2.7,而且系统自带的一些组件(如yum)也是基于python 2工作的。所以第一步就是先升级一下系统自带的python版本
这里由于不能直接通过yum升级python,所以需要采用源码安装

1. 下载源码
先从官网上下载python3的二进制源码
wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tar.xz
下载下来以后,解压
xz -d Python-3.6.1.tar.xz
tar xvf Python-3.6.1.tar

2. 编译并安装
进入解压后的文件夹,配置-编译-安装三连
./configure
sudo make
sudo make install
这里需要注意,如果是一台裸机,那么你还需要先安装gcc,毕竟make可全是靠gcc的……图省事可以像我一样直接装一个开发工具包
yum groupinstall "Development Tools"
如果还没有安装openssl,在安装python前也需要先装上openssl,不然后面make install的时候会报错说ssl模块缺失
yum install openssl-devel
安装过程中还碰到一个问题,make install时提示缺少zlib模块。话说zlib模块不应该是Linux自带的么……
这里先remove掉原始的zlib模块:yum remove zlib
再重装一遍zlib的所有组件:yum install zlib*
重新make&install~

3. 让系统默认使用python3
不加配置的话,python3会被安装到/usr/local/bin目录下
安装以后,由于没有修改链接,所以此时我们直接在shell下运行python打开的还是python2
linux下,系统预装的可执行程序链接在/usr/bin目录下,cd进去可以发现这里有python,python2,python2.7三个链接,ls -al可以看到三个链接都指向原始的python2.7
(个人感觉/usr/bin目录下的链接有点类似于环境变量,shell会在这里寻找要执行的程序。换句话说,在shell里输入python,python2,python2.7,shell都会到/usr/bin下找到对应链接,打开运行python)
(当然linux下的环境变量是在/etc/profile文件里设置的,我这个只是一个不太恰当的比方)
我们的目标是,shell下输入python,会直接运行新安装的python3。所以我们只需要建立一个新的链接替换掉原始的链接
ln -s /usr/local/bin/python3.6 /usr/bin/python
注意要先rm掉原始的python链接

记得我之前提过,CentOS一些组件是基于python2运行的。在我们更改了python的默认链接以后,这些原本基于python2的程序就瓦特了,典型代表就是yum。所以我们需要把这些系统组件的配置文件做下更改,使得他们能够正确调用python2
以yum为例,vim /usr/bin/yum
把第一行的#!/usr/bin/python改成指向python2的链接名即可(如#!/usr/bin/python2
已知的依赖python2的系统组件还有 /usr/libexec/urlgrabber-ext-down

4. 配置一些python库
python 3.6已经自带了pip,所以我们就不需要再get-pip了,直接调用即可
eg. python -m pip install tornado

0x02 安装配置nginx

……安装部分没什么要说的,如果没有特殊要求,直接yum install就行……
讲道理nginx的配置比起apache来说,那是真的简单易懂啊……
nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置)
这里给出一个常用配置,具体每部分的设置可以参见 nginx服务器安装与配置文件详解

server {        listen       80 default_server;        listen       [::]:80 default_server;        server_name  localhost;        root         /var/www/html;        # Load configuration files for the default server block.        include /etc/nginx/default.d/*.conf;        location / {            index index.html;            proxy_pass_header Server;            proxy_set_header Host $http_host;            proxy_redirect off;            proxy_set_header X-Real-IP $remote_addr;            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;            proxy_set_header X-Scheme $scheme;        }        error_page 404 /404.html;            location = /40x.html {        }        error_page 500 502 503 504 /50x.html;            location = /50x.html {        }    }

修改完配置文件后,重启nginx,通过ip访问弹出欢迎界面说明配置成功

0x03 安装配置mariaDB

mariaDB是MySQL团队被Oracle收购以后又开发的一个开源版,用起来和MySQL差不太多,yum默认安装的也是mariaDB
配置和MySQL相差无几,安装以后,修改配置文件my.cnf(在/etc目录下)
添加一行设置字符集
character-set-server = utf8
保存退出后重启mariadb服务,shell输入
mysql_secure_installation
进行初始化设置,例如root密码,是否禁用远程访问等
由于服务器是python环境,还需要python -m pip install mysql-python
然后这里就会出问题了,报错找不到ConfigParser模块
其实呢,你没有缺少这个模块……只是在python3里,这个模块改名叫configparser了
所以呢,我们去把这个模块重命名一下就好啦
cp configparser.py ConfigParser.py(在/usr/local/lib/python3.6下)

顺便提一个萌新可能经常犯的错误,安装时只做了yum install mariadb,然后启动服务死活启动不起来,报错说Unit not found……
那当然找不到啊……你得先安装mariadb-server他才有服务可以跑啊……

0x04 测试

下面使用《Introduction to Tornado》第一章中的例子作为测试demo

# -*- coding:utf-8 -*-import tornado.httpserverimport tornado.ioloopimport tornado.optionsimport tornado.webfrom tornado.options import define, options#定义一个配置选项port。default表示默认值,help表示在帮助中显示的信息,type表示该配置参数的数据类型,如果类型匹配错误会报错。define("port", default=8000, help="run on the given port", type=int)#继承了web的RequestHandlerclass IndexHandler(tornado.web.RequestHandler):    #对应http的get请求    def get(self):        #get_argument方法获取http页面请求参数,如果没有传入参数则显示为默认值        greeting = self.get_argument('greeting', 'Hello')        #将响应的内容写到页面中        self.write(greeting + ', tornado!')if __name__ == "__main__":    tornado.options.parse_command_line()    #创建一个tornado应用。handlers是一个元组列表,其中每个元组的第一个元素是一个正则表达式,表示网址路由。第二个元素是所使用的RequestHandler类用来响应操作。    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])    #创建一个http服务器    http_server = tornado.httpserver.HTTPServer(app)    #设置监听端口    http_server.listen(options.port)    #启动服务器    tornado.ioloop.IOLoop.instance().start()

在shell中输入
nohup python demo.py
后台运行测试脚本,浏览器中访问服务器的8000端口,根据不同的get参数,可以看到相对应的输出。

原创粉丝点击