近来瞎胡闹尝试用python搭建一个http游戏服务器,由于django本身并发性能不高,所以查了下需要用nginx + uwsgi + django才能搭建一个勉强够用的http服务器,由于对nginx 和 uwsgi都不是很了解,所以搭建过程并不像想象中那么简单。。。
由于这三个模块都是可以独立运行的,那么我们在部署的时候先单独的一个个去安装,装完独立运行,最后再通过配置文件去统一部署,思路就是这样。。。
第零步,我们先安装下c c++相关依赖库
sudo yum -y install gcc gcc-c++
#避免后续pip安装时无法使用https源
sudo yum install openssl-devel
第一步,我们先部署nginx
你可以通过wget nginx的源码然后手动编译安装到指定目录
但对小白来说还是怎么方便怎么来吧,我们直接通过yum安装
yum install nginx
#不同版本的linux系统可能会遇到No package nginx available.那么请尝试先安装epel
#yum install epel-release
安装完成之后,我们手动启动以下nginx
service nginx start
没有大问题的情况下,我们直接访问127.0.0.1就可以看到nginx部署完成的界面了,当然这里如果你直接在linux服务器上操作的话,那么你打开自己的浏览器,输入你linux服务器的地址就可以了
浏览器中看到此界面表示nginx部署完成了
第二步,我们再部署uwsgi
直接通过如下指令安装
pip install uwsgi
安装完成之后我们新建一个python脚本,test-uwsgi.py,写入如下内容
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello UWSGI"]
然后在这个脚本的同级目录下,执行
#简单理解就是通过uwsgi服务创建一个http测试服务器,端口8001,通过浏览器访问后返回脚本内定义的“Hello UWSGI”文本
uwsgi --http :8001 --wsgi-file test-uwsgi.py
//如果显示没有uwsgi命令那么请找到uwsgi命令所在位置
//通过pip3安装一般在/usr/local/python3/bin/目录下
//然后通过ln -s关联到环境变量中存在的目录,例如'/usr/local/bin'或者'/usr/bin'
//即ln -s /usr/local/python3/bin/uwsgi /usr/local/bin/uwsgi
如果你直接部署在linux上的,那么打开浏览器,在地址栏输入你的linux地址:8001 看到浏览器返回文本“Hello UWSGI”那么恭喜,uwsgi部署完成
第三步,我们部署django开发环境
pip install django
django安装成功之后,创建一个django项目,名为test_project
django-admin.py startproject test_project
//如果显示没有django-admin.py 或 django-admin命令那么请找到django-admin.py 或 django-admin命令命令所在位置,然后通过ln -s关联到环境变量中存在的目录,例如'usr/local/bin'或者'/usr/bin'
进入到创建的项目目录test_project,然后看到还有一级test_project目录,进入后发现有个settings.py文件,我们修改这个文件
找到
ALLOWED_HOSTS = [""]
将其修改为
ALLOWED_HOSTS = ["*"]
修改成["*"]表示允许任何IP访问进来,否则访问会被拒绝
修改之后我们再回到上一级目录,即manage.py所在目录,然后执行如下命令
#执行如下命令即在8002端口创建了一个django的测试运行环境
python manage.py runserver 0.0.0.0:8002
完成之后我们继续通过浏览器,地址栏输入你的linux地址:8002,然后成功看到如下的界面,则表示django环境也部署完成了
django测试环境完成
第四步,我们通过配置文件链接几个模块
1.django的settings.py文件配置
继续回到上一步提到的settings.py文件
为了安全性找到,测试时候建议打开,部署到nginx的时候必须关闭DEBUG
DEBUG = True
修改为
DEBUG = False
并且再settings.py文件末尾添加
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
结束修改后,回到manage.py所在目录,执行如下代码收集所有静态文件
为什么要收集静态文件呢,因为一个项目中可能又多个app,多个app有时候可能公用同一个js文件
所以将其收集起来再删除每个app自己独立的static,可以更好的复用
PS:如果事先已经将自行将静态文件的目录和内容配置好,则无需收集
python manage.py collectstatic
2.nginx的配置文件
通过yum安装nginx的,默认的启动nginx的配置文件位置在/ect/nginx/nginx.conf
我们修改这个文件的server部分,注意是server部分
server {
listen 80;
server_name test;
charset utf-8;
# 静态路径相关配置
location /static {
autoindex on;
#root /var/www/test_project/;
alias /var/www/test_project/static;
}
location / {
uwsgi_pass 127.0.0.1:9090;
include /etc/nginx/uwsgi_params; #这里我们使用默认文件即可,此处若不指定或指定错误,会出现502错误,uwsgi.log文件中会看到KeyError: 'REQUEST_METHOD'的错误
index index.html index.htm;
}
}
##如还需要其他参数请自行了解后配置添加
##如还需要其他参数请自行了解后配置添加
##如还需要其他参数请自行了解后配置添加
3.uwsgi配置文件
uwsgi的配置文件可以放在任何目录下,只需要在uwsgi的启动的时候指定下目录即可,这里我们将其创建在/etc/目录下,我们在/etc/目录下新建一个 uwsgi_config.ini 文件,并写入如下内容
[uwsgi]
#重要重要重要!!!此处的9090端口和之前nginx配置文件需要一致,相当于链接通路
socket = 127.0.0.1:9090
# 指定test_project项目所在路径,一般放在 /var/www 这个目录,避免遇到nginx root权限问题
chdir = /var/www/test_project
# 指定Django's wsgi file
wsgi-file = /var/www/test_project/test_project/wsgi.py
# 最大工作进程 processes
processes = 10
#每个工作进程processes启动后开启线程个数threads
threads = 2
#环境退出时自动清理
vacuum = true
#记录uwsgi日志路径
#daemonize = /var/log/uwsgi.log
##如还需要其他参数请自行了解后配置添加
##如还需要其他参数请自行了解后配置添加
##如还需要其他参数请自行了解后配置添加
4.我们启动服务,查看结果
1.先重启下nginx
service nginx restart
2.我们指定uwsgi配置文件启动uwsgi服务
##先关闭之前启动的进程
killall -9 uwsgi
然后执行
uwsgi --ini /etc/uwsgi_config.ini
如果uwsgi配置文件中没有将log计入指定文件中,那么你会看到如下,如配置文件中的设置一致,启动10个进程,每个进程启动2个线程
uwsgi启动成功
这里补充下nginx和uwsgi相关服务的启动和关闭命令
service nginx start #启动nginx服务
service nginx stop #关闭nginx服务
service nginx restart #重启nginx服务
systemctl enable nginx.service #开启启动nginx服务
uwsgi --ini /etc/uwsgi_config.ini #初始化uwsgi服务
uwsgi --stop /etc/uwsgi_config.ini #停止uwsgi服务
uwsgi --reload /etc/uwsgi_config.ini #重新加载uwsgi服务
##重启命令可能无效,请尝试先杀死相关进程然后再重启
killall -9 nginx #kill所有 nginx相关进程
killall -9 uwsgi #kill所有 uwsgi 相关进程
5.启动浏览器验证
由于nginx中监听的是80端口,所以在你的浏览器直接输入你linux的服务器ip地址即可,如果能看到之前的django界面,那么恭喜,部署完成了。。。
部署完成
PS:如果还是一切配置都正确还是出现了502错误,请查看nginx或uwsgi相关日志
若出现错误
"connect() to 127.0.0.1:9090failed (13: Permission denied) while connecting to upstream"
那么是SeLinux问题导致的,执行以下代码方可解决:
setsebool -P httpd_can_network_connect 1
网友评论