centos7 部署网页实战记录django+uwsgi+nginx

CentOS7下配置Django+nginx+uwsgi实战记录
0. 安装环境:

CentOs版本: 阿里云CentOS 7.7 64位

nginx版本: 1.18.0      http://nginx.org

Sqlite3版本: Sqlite3 3.24.0    http://www.sqlite.org/

Python版本: Python 3.8.3       https://www.python.org/

Django版本: Django 3.0.6       https://www.djangoproject.com/community/

详细步骤(下面步骤都是ROOT权限执行)

一、更新系统软件包

yum update -y

二、安装软件依赖包

# yum -y groupinstall "Development tools"
yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel
yum install telnet	# 用于检查服务器对应的端口是否放开
yum install iptables-services	# 防火墙控制

三、安装Pyhton3、pip3

wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz		# 下载
tar -zxvf Python-3.6.6.tgz				#解压
./configure --prefix=/usr/local/python3		# 编译安装到指定路径/usr/local/python3可以指定
make
make install
ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3	# 从安装路径复制文件,建立软链接添加变量 可以直接使用python3命令
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3	# pip3建立软连接

四、安装、创建、启用virtualenv
1、安装
pip3 install virtualenv
ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv # virtualenv建立软连接,源文件/anaconda3/bin
2、创建

mkdir -p /data/env  
 mkdir -p /data/wwwroot	# 存放env和网站文件

cd /data/env/下,建立虚拟环境

virtualenv my_project_env	
virtualenv --python=/usr/bin/python3 my_project_env		# 多个python版本指定建立环境
# 或者virtualenv -p /usr/bin/python3 my_project_env		

3、启动/停用虚拟环境

cd /data/env/my_project_env/bin,
source activate	# 启用的环境名应和my_project_env一致
source /data/env/my_project_env/bin/activate
deactivate	# 停用虚拟环境	anaconda环境中用source deactivate

问题解决:Anaconda默认进入虚拟环境base设置修改

五、虚拟环境里用python3安装django和uwsgi
uWSGI是实现了了uwsgi和WSGI两种协议的Web服务器
uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。

pip3 install django		#  (如果用于生产的话,则需要指定安装和你项目相同的版本pip3 install django=django3.0.6)
pip3 install uwsgi
ln -s /data/env/my_project_env/bin/uwsgi /usr/bin/uwsgi		# 建立软连接
rm -rf  uwsgi		# 删除软连接

六、创建Django项目

cd /data/wwwroot	# 切换到网站目录
django-admin startproject my_project	# 创建工程
rm -rf my_project# 删除项目
cd /data/wwwroot/my_project		# 进入工程目录
python3 manage.py startapp my_app	# 创建应用

# 添加static和templates,分别用于存放静态文件和模板文件
mkdir static
mkdir templates

七、项目迁移
登录WinSCP,迁移django项目,启动服务器

python3 manage.py runserver	# 仅允许本地访问
python manage.py runserver 0.0.0.0:8000	# 启动服务器,允许外网访问

注意:外网想通过ip访问,setting.py中ALLOWED_HOSTS要添加外网IP地址字符串

ALLOWED_HOSTS = ['外网ip','localhost', '0.0.0.0:8000', '127.0.0.1',]
ALLOWED_HOSTS = ['*'] 

在这里插入图片描述
八、配置uwsgi
8.0 启动uwsgi

cd /data/wwwroot/my_project/
uwsgi --http :8000 --module mysite.wsgi	# 可以外网访问

8.1xml配置(为nginx准备,这种方法没通)
在项目根目录下创建my_project.xml文件,输入如下内容:

<uwsgi>    
   <socket>127.0.0.1:8000</socket><!-- 内部端口,自定义 --> 
   <chdir>/data/wwwroot/my_project /</chdir><!-- 项目路径 -->            
   <module>my_project.wsgi</module> 
   <processes>4</processes> <!-- 进程数 -->     
   <daemonize>uwsgi.log</daemonize><!-- 日志文件 -->
</uwsgi>

注意端口号和启动服务器时候要一致,默认8000
注意文件名和文件中的my_project,根据项目名不同进行替换。
注意注释要去掉,不然配置时可能会出错,字符无法识别

cd /data/wwwroot/mysite/
uwsgi -x mysite.xml	# 仍无法外网访问

8.2 ini配置(单独启动配置)
在项目目录中建立个conf文件夹,将nginx和uwsgi文件都放进去,不是必须#但是个好习惯
注意ini文件里不要留注释,会报错

[uwsgi]
chdir = /my/project/address/
module   = my_project.wsgi
home   = /data/env/monitor_env/ 
master   = true
processes  = 1
threads = 1
http = :8000		# 单独启动uwsgi时,用http端口监听,nginx启动前,改为socket端口监听
req-logger = file:/tmp/access.log
logger = file:/tmp/error.log
daemonize = /tmp/uwsgi_daemon
pidfile = /tmp/uwsgi.pid
chmod-socket = 777
master = True
vacuum = True	# 当服务器退出时自动删除unix socket文件和pid文件
socket = /tmp/uwsgi.sock
#### 启动:
cd /data/wwwroot/mysite/conf
uwsgi --ini xxx.ini
# 查看uwsgi端口状态
netstat -ltunp
#### 重启:
uwsgi --reload xxx.pid	# pid文件位置见ini配置中pidfile = /tmp/uwsgi.pid
#### 停止:
uwsgi --stop xxx.pid
pkill -f uwsgi -9	# 找不到pid文件时候用

8.3 ini配置(uwsgi+nginx启动配置)

[uwsgi]
socket=127.0.0.1:8000	# .ini文件中的socket参数中的ip地址可以为阿里云服务器的内网地址(私网地址)
wsgi-file=server.py
master=true
processes=4
threads=2
# stats=127.0.0.1:9191	# #monitor uwsgi status 通过该端口可以监控 uwsgi 的负载情况

当系统启动时,让uWSGI启动
https://blog.csdn.net/oolawokao/article/details/77994527

九、安装nginx和配置nginx.conf
Nginx是一个Web服务器其中的HTTP服务器功能和uWSGI功能很类似,但是Nginx还可以用作更多用途,比如最常用的反向代理功能
9.1 安装

cd /home
wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar -zxvf nginx-1.18.0.tar.gz
cd nginx1.18.0
./configure
make
make install
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx     # 建立nginx命令(非配置)软连接,注意软连接位置

9.2配置文件位置
nginx一般默认安装好的路径为/usr/local/nginx


cd /usr/local/nginx/sbin/	# 
./nginx -t  # 检查配置文件是否有错,同时查看调用哪个位置的.conf文件,如果有多个.conf要注意
# 显示:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# 在方便修改的位置创建nginx.conf,软连接到/etc/nginx/, 
ln -s /data/wwwroot/mysite/conf/nginx.conf /etc/nginx/nginx.conf
./nginx	# 用/etc/nginx/位置的配置文件启动

注意::1地址和文件名要写全,
2、原配置文件备份

9.3修改nginx.conf文件配置

cd /usr/local/nginx/conf/
cp nginx.conf nginx.conf.bak

然后打开nginx.conf,把原来的内容删除,直接加入以下内容:
参考nginx.conf文件内容详解

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen       80;	# nginx监听的端口,注意阿里云上安全组配置
        server_name  ip;	# 服务器外网ip
        charset utf-8;
        location / {	# 上述location的配置是“/”,当我们访问http://ip:8088/ 或 http://ip:8088,nginx会转给uwsgi处理。
           include uwsgi_params;
           uwsgi_pass 127.0.0.1:8000;	# 这段配置表明Nginx会将收到的所有请求都转发到”127.0.0.1:8000″端口上,阿里云也可以用内网地址
           uwsgi_param UWSGI_SCRIPT my_project .wsgi;
           uwsgi_param UWSGI_CHDIR /data/wwwroot/my_project ; #项目路径
           
        }
        location /static/ {
        alias data/wwwroot/my_project /static/; #静态资源路径
        }
    }
}

注意:直接粘贴缩进会有乱码,转txt再贴
worker_connections 单个进程最大连接数,这里设置得比较小
worker_connections 太小会出现 502 Bad Gateway
uwsgi_pass 路径与端口,端口要与listen一样
uwsgi_param 、static里my_project 要和项目名称对应上。
./nginx # 注意uwsgi要关闭,否则提示被占用端口

终端没有任何提示就证明nginx启动成功。可以使用你的服务器地址查看,成功之后就会看到一个nginx欢迎页面。

```python
# 判断nginx是否正常运行
ps -A | grep nginx	# 查看进程
netstat -anput | grep nginx	# 查看端口
# 从容停止服务  这种方法较stop相比就比较温和一些了,需要进程完成当前工作后再停止。
nginx -s quit

# 立即停止服务  这种方法比较强硬,无论进程是否在工作,都直接停止进程。
nginx -s stop

systemctl 停止
systemctl属于Linux命令

systemctl stop nginx.service

killall 方法杀死进程
直接杀死进程,在上面无效的情况下使用,态度强硬,简单粗暴!

killall nginx

十、访问项目的页面


# 重启nginx
cd /usr/local/nginx/sbin/
./nginx -s reload

然后在浏览器里访问你的项目地址!

附录:实战过程问题解决
0、实战记录:日常部署

1、
告警:uwsgi: invalid option – ‘x’

原因:centos下,在没有安装libxml2时,pip安装的uwsgi无法支持xml格式的配置文件
解决:
yum install libxml*
pip uninstall uwsgi
pip install uwsgi

有时安装libxml2后由于pip缓存编译结果,导致再次安装uwsgi仍然报该异常。
可以下载uwsgi源码包后,本地手动编译后安装即可。

wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz	# 不能用
wget https://projects.unbit.it/downloads/uwsgi-2.0.18.tar.gz
tar zxvf uwsgi-latest.tar.gz

cd uwsgi-2.0.11.1/

python uwsgiconfig.py --build

python setup.py install
ln -s /data/env/my_project_env/bin/uwsgi /usr/bin/uwsgi		# 建立软连接

1.1 uwsgi配置xml文件时遇到 libssl.so.1.0.0/libcrypto.so.1.0.0缺失

uwsgi -x mysite.xml
# 提示
uwsgi: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory
uwsgi: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
uwsgi: error while loading shared libraries: libicui18n.so.58: cannot open shared object file: No such file or directory
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /lib64/libicui18n.so.58)
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /lib64/libicui18n.so.58)
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.8' not found (required by /lib64/libicuuc.so.58)
uwsgi: /lib64/./libstdc++.so.6: version `CXXABI_1.3.9' not found (required by /lib64/libicuuc.so.58)
# 解决libssl.so.1.0.0: cannot open shared object file
ln -s ~/anaconda3/lib/libssl.so.1.0.0 /lib64/libssl.so.1.0.0
# 解决libcrypto.so.1.0.0: cannot open shared object file
ln -s ~/anaconda3/lib/libcrypto.so.1.0.0 /lib64/libcrypto.so.1.0.0
# 解决libicui18n.so.58: cannot open shared object file
ln -s ~/anaconda3/lib/libicui18n.so.58 /lib64/libicui18n.so.58	# libicui18n.so.58
ln -s ~/anaconda3/lib/libicuuc.so.58 /lib64/libicuuc.so.58		# libicui18n.so.58
ln -s ~/anaconda3/lib/libicudata.so.58 /lib64/libicudata.so.58	# libicui18n.so.58
# 解决version `CXXABI_1.3.9' not found 
sudo rm -rf /lib64/libstdc++.so.6
sudo ln -s /home/ian/anaconda3/lib/libstdc++.so.6.0.25 /lib64/libstdc++.so.6

2、启动nginx提示端口被占用
提示:nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
原因:原nginx进程没有关闭
解决办法:

netstat -ntlp	# 查看端口被占用进程
kill 6751	# 根据PID删除进程

3、nginx启动成功进程正常,浏览器访问不了,欢迎页面不出现

3.1
原因:端口没开放
解决办法:阿里云安全组配置,开放端口
云服务器ECS-网络与安全-安全组-安全组规则-入方向,授权所有IP访问
在这里插入图片描述
3.2 查看你的端口是否已经处于监听状态,并且绑定的是公网Ip而不是内网。

netstat -tlanp

注意:需要启动nginx服务才让端口处于监听状态
看nginx.conf里listen端口

3.2检查服务器对应的端口是否放开
3.2.1检查防火墙是否开启

sudo ufw status   # 如果输出:Status: inactive 说明防火墙已经关闭,按理说端口应该都是开放的,用自己的主机连接远程服务器都是可以的

ps: 可以关闭防火墙,放开所有端口,执行下面的命令

ufw disable   #关闭防火墙
ufw enable  # 开启防火墙

3.2.2如果为了安全性,开启了防火墙,可以单独放开某一个端口

.2.1.查看端口是否开放

telnet ip port # telnet 59.110.155.32 8001

telnet + ip + port  #如: telnet 192.168.157.129 80  
	#没有telnet命令使用:yum install telnet 安装后使用。
	

输入命令后得到如下,证明端口没有开放
在这里插入图片描述
(1)查看开放的所有端口
命令一

netstat -a # 查看所有服务端口 
netstat -nltp # 本机看在监听的端口

1
命令二

nmap + ip地址 # 如:nmap 127.0.0.1
#没有nmap 命令使用:yum install telnet 安装后使用。

(2)很多时候 telnet 完就无法退出了,ctrl+c 有时也无法退出;

这个时候先执行:ctrl+] 然后在telnet 命令行输入 quit 就可以退出了

参考文献:
CentOS7下部署Django项目详细操作步骤
https://www.cnblogs.com/djangocn/p/9538551.html
nginx与uWSGI
https://blog.csdn.net/dqchouyang/article/details/81639788
nginx.conf文件内容详解
https://www.cnblogs.com/paulwhw/articles/11116363.html
nginx启动成功进程正常,浏览器访问不了,欢迎页面不出现
https://blog.csdn.net/weixin_42896137/article/details/88797094
nginx启动成功,访问不了
https://blog.csdn.net/qq_22638399/article/details/81060535
linux端口开放指定端口的两种方法
https://www.cnblogs.com/jtestroad/p/8031850.html
阿里云服务器的一点小坑—端口不通问题,还是防火墙的锅
https://www.cnblogs.com/grey-wolf/p/8961581.html
uwsgi loading shared libraries:libicui18n.so.58 异常处理
https://blog.csdn.net/MarsYWK/article/details/86704428
阿里云部署nginx + uwsgi + Django,公网访问
https://blog.csdn.net/xingzishuai/article/details/84108539

Nginx 502 bad gateway的解决方案
https://www.cnblogs.com/etiao/p/4991916.html

python 使用Nginx和uWSGI来运行Python应用
https://www.cnblogs.com/lixiufeng1994/articles/10041238.html
uwsgi配置详解
https://www.cnblogs.com/mensiler/p/11889546.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

779醒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值