先说一下安装遇到的问题,安装uwsgi的时候报错:
ImportError: No module named _ssl
一开始以为是版本问题,因为最开始是用的python3.6,网上能搜到大把同类问题,给出的解决方法是修改源码包Modules/Setup文件,其原理其实就是指明python安装的时候去哪里找到openssl。
修改SSL=/usr/local/ssl这一句为你系统openssl所在的位置,去除对应的注释,网上有详细的说明,这里就不赘述,因为我发现我遇到的问题是安装了pcre-devel产生冲突导致的,卸载即可。
一、安装python
由于需要安装uwsgi,所以需要先安装openssl,python3.7之后的版本要求openssl1.0.2以上。我安装的是openssl 1.1.1f。
下载:wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1f.tar.gz
解压:tar -xzf openssl-1.1.1f.tar.gz
编译:/openssl-1.1.1f/config --prefix=/usr/local/openssl
安装:make && make install
中间如果有报错,按提示安装缺少的依赖就可以了。
然后是python3
下载:wget https://www.python.org/ftp/python/3.7.7/Python-3.7.7.tar.xz
解压:tar -xzf Python-3.7.7.tar.xz
编译:/Python-3.7.7/configure prefix=/usr/local/python3
安装:make && make install
创建软链接:ln -s /usr/local/python3/bin/python3 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
二、安装virtualenv
安装:pip install virtualenv -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
后面标红色的是使用了国内的下载源并标记为信任,这样下载安装快一些。
创建软链接:ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv
新建一个空文件夹专门存放虚拟环境:mkdir -p /mypro/env
进入文件夹下创建指定版本的虚拟环境:cd /mypro/env
virtualenv --python=/usr/bin/python3 你的虚拟环境名称py3env
进入虚拟环境:source /mypro/env/py3env/bin/activate
然后开始安装Django等项目需要的各种依赖。到这里相信看出来虚拟环境的好处了,虚拟环境是相互独立的,但又共用python下的库,所以你可以把各个项目都会用到的诸如框架之类的直接通过pip3安装,而一些具体到项目下需要使用到的第三方库,进入虚拟环境后再安装,这样使得你的项目依赖的列表不会显得太驳杂,避免引用依赖之间如同名的冲突。
将本地项目迁移,先导出项目环境依赖:pip3 freeze > requirements.txt
然后在服务器上的虚拟环境下执行命令:pip3 install -r requirements.txt
三、安装uwsgi
安装:pip install uwsgi -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
创建软链接:ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
uwsgi安装好后可以先简单测试一下是否能正常运行
创建并编辑vim /test.py
def application(env, start_response): start_response('200 OK', [('Content-Type', 'text/html')]) return [b"Hello World"]
启动uwsgi命令:uwsgi --http-socket:8080 --plugin python --wsgi-file /test.py
然后访问:wget http://127.0.0.1:8080/看是否能访问到
四、安装Nginx
下载:wget http://nginx.org/download/nginx-1.20.2.tar.gz
解压:tar -zxvf nginx-1.20.2.tar.gz
编译:./configure --prefix=/usr/local/nginx --add-module=/root/nginx-rtmp-module-master --with-http_ssl_module --with-http_stub_status_module
我这里后面加了--add-module是因为要支持视频直播流rtmp协议,如果不需要可以不加,需要的话要先下载nginx-rtmp-module,然后把路径给到这里。
安装:make && make install
五、配置uwsgi.ini和nginx.conf文件
uwsgi.ini
[uwsgi]
http=:8997
chdir=/mypro/wwwroot/Django项目名
# 虚拟环境
home=/mypro/env/py3env
PYTHONHOME=/mypro/env/py3env/bin/
wsgi-file=Django项目名/wsgi.py
module=Django项目名.wsgi
workers=5
# socket=127.0.0.1:8997
socket = /mypro/wwwroot/Django项目名/uwsgi.sock
static-map=/static=/mypro/wwwroot/Django项目名/static
uid=root
gid=root
# 启动一个master进程
master=true
attach-daemon=memcached
processes=4
threads=2
pidfile=/opt/script/uwsgi.pid
# 服务停止移除socket和pid
vacuum=true
enable-threads=true
# chmod-socket=664
thunder-lock=true
# post-buffering=4096
# 每个进程的处理上限
max-requests=1000
daemonize=/opt/script/uwsgi.log
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #日志的格式
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8080;
server_name 127.0.0.1:8080; #服务的名称,不加的话默认是80端口
charset utf-8; #编码格式
access_log logs/host.access.log main; #访问日志
gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; #访问内容的类型
error_log /mypro/wwwroot/log/nginx/error.log error; # 错误日志,默认没有,需要手动创建
client_max_body_size 5M;
location / {
include uwsgi_params; # 加载uwsgi_params
# uwsgi_pass 127.0.0.1:8997; # 端口和uwsgi里的配置一样
uwsgi_param UWSGI_SCRIPT GCEV.wsgi;
uwsgi_param UWSGI_CHDIR /mypro/wwwroot/Django项目名/;
uwsgi_connect_timeout 30; # 连接的超时时间
uwsgi_pass unix:/mypro/wwwroot/Django项目名/uwsgi.sock; #uwsgi.sock通讯的文件地址
uwsgi_read_timeout 1800;
uwsgi_send_timeout 300;
proxy_read_timeout 300;
}
location /static{
alias /mypro/wwwroot/Django项目名/static/; # 静态文件的目录
index index.html index.htm;
}
location /media{
alias /mypro/wwwroot/Django项目名/media/; #媒体文件的目录,如图片
}
}
}
启动项目
先启动uwsgi:uwsgi --ini /opt/script/uwsgi.ini
再启动nginx:nginx -c /opt/nginx.conf
后面发现nginx启动这个指定配置文件的服务会在每天凌晨三点关掉,可能是nginx服务被定时重启了,通过命令crontab -e查看执行定时任务,修改了nginx-restart.sh文件,服务就正常了。