阿里云配置centos7+nginx+django+python
https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-centos-7英文文章地址
1.配置有一个non-root并有sudo权限的root用户
useradd nginxu
passwd nginxu
visudo配置nginxu sudo权限且不输密码
nginxu ALL=(ALL) NOPASSWD: ALL
2. 配置VirtualEnv and VirtualEnvWrapper(已安装好python3)
安装virtualenv virtualenvwrapper及设置
root下
pip3 install virtualenv virtualenvwrapper
然后再在nginxu下装
pip3 install virtualenv virtualenvwrapper
# 设置虚拟环境的位置(ENV)
echo "export WORKON_HOME=~/Env" >> ~/.bashrc
# 如果使用python3,则需指明python3执行程序的位置
echo "export VIRTUALENVWRAPPER_PYTHON=/usr/local/python3/bin/python3.6" >> ~/.bashrc
echo "source /usr/local/python3/bin/virtualenvwrapper.sh" >> ~/.bashrc
读取~/.bashrc文件
source ~/.bashrc
3. 创建Django项目
现在,我们可以使用virtualenvwrapper在虚拟环境下轻松的搭建我们的项目环境。
mkvirtualenv myweb
该指令会在虚拟环境下安装Python及pip,并激活该环境。现在,你的命令行行首应该类似于(myweb) [nginxu@xk-pc Env]$。并且,在该虚拟环境下,你也无需再管python2, python3之间的版本区别什么的了,使用pip(python3也使用该指令)安装的Python包也仅在当前环境中有效(并且无需使用sudo即可安装)。
现在,安装Django
pip install django
Django安装之后,创建我们的Django项目:
cd ~
django-admin.py startproject mysite
该命令会在当前用户的家目录下创建名为firstsite的Django项目
对该项目进行一些基础设置:
(1) 数据库迁移及超级用户的创建
cd ~/mysite
# 如果需要修改默认数据库,请在执行下一命令前修改Django的setting.py文件中的数据库配置部分内容。
./manage.py migrate
./manage.py createsuperuser
(2) 静态文件位置的修改
打开项目的配置文件:vim mysite/settings.py
当我们使用Nginx来反向代理我们的站点时,我们需要将我们的静态文件(如图片、视频、音频、字体、CSS等)放置在统一的目录下。
# 将该行输入到setting.py文件中
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
保存并关闭后使用./manage.py collectstatic 命令,Django会帮你在当前位置~/mysite下创建static目录保存静态文件
(3) 进行测试
在我们创建的项目里修改setting.py文件
ALLOWED_HOSTS = ['*'] #在这里请求的host添加了*
./manage.py runserver 0.0.0.0:8000
在浏览器中输入:http://server_domain_or_IP:8000
即可看到Django熟悉的初识界面
进入/admin界面:
即可使用之前创建的超级用户进行登陆了。
(4)关于虚拟环境进入退出的一点说明
退出:deactivate
进入:workon firstsite
OK,现在我们需要使用deactivate命令退出当前虚拟环境。
4. 设置uWSGI应用服务器
4.1 软件安装
# 如果之前用rpm安装过python3-devel则跳过该命令
yum search python3 | grep devel结果为:
python34-cairo-devel.x86_64 : Libraries and headers for python34-cairo
python34-greenlet-devel.x86_64 : C development headers for python34-greenlet
python34-devel.x86_64 : Libraries and header files needed for Python 3
: development
python34-gobject-devel.x86_64 : Development files for embedding Python 3.4
python36-devel.x86_64 : Libraries and header files needed for Python development
shiboken-python34-devel.x86_64 : Development files for shiboken
sudo yum install python36-devel.x86_64
sudo yum install gcc gcc-c++
sudo pip install uwsgi
# 若为python3,则使用
sudo pip3 install uwsgi
快速测试:
uwsgi --http :8000 --home /home/nginxu/Env/myweb --chdir /home/nginxu/mysite -w mysite.wsgi
在浏览器中输入:http://server_domain_or_IP:8080,即可看到如同之前的页面了。注意,现在/static下的文件并不能正常的显示工作,需要通过Nginx的配置后才能正常显示。
4.2 uWSGI配置的设置
创建/etc/uwsgi/sites的目录来保存我们的配置文件
sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites
创建Django站点对应的配置文本:
sudo vim /etc/uwsgi/sites/mysite.ini
在其中输入:
[uwsgi] project = mysite username = nginxu base = /home/%(username) chdir = %(base)/%(project) home = %(base)/Env/%(project) module = %(project).wsgi:application master = true processes = 5 uid = %(username) socket = /run/uwsgi/%(project).sock chown-socket = %(username):nginx chmod-socket = 660 vacuum = true
不扩展
[uwsgi] chdir = /home/nginxu/mysite home = /home/nginxu/Env/myweb module = mysite.wsgi:application master = true processes = 5 uid = nginxu socket = /run/uwsgi/mysite.sock chown-socket = nginxu:nginx chmod-socket = 660 vacuum = true
各项值的含义我就不一一解释了,详情见Justin Ellingwood的文章。
4.3 为uWSGI创建一个Systemd Unit File
现在我们的配置文件可以为我们Django项目提供服务了,当并不能自动实现。接下来,我们需要创建一个系统文件实现uWSGI的自启动。
我们将在/etc/systemd/system目录下创建我们的uwsgi.service文件:
sudo vim /etc/systemd/system/uwsgi.service
并在其中输入:
[Unit]
Description=uWSGI Emperor service
[Service]
ExecStartPre=/usr/bin/bash -c 'mkdir -p /run/uwsgi; chown user:nginx /run/uwsgi'
ExecStart=/usr/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target
各项值的具体含义见Justin Ellingwood的文章。
5. Nginx的安装及配置
uWSGI配置好后,我们需要安装和配置Nginx作为我们的反向代理。
5.1 nginx的安装
(1) 在此处,你可以直接使用yum的方式进行安装:
sudo yum install nginx
使用此方式安装的话,你的配置文件位于/ete/nginx/nginx.conf以及/etc/nginx/conf.d/*两个位置中。
为Django项目单独创建一个Nginx配置文件:
sudo vim /etc/nginx/conf.d/mysite.conf
在文本中输入:
server {
listen 80;
server_name localhot;
location = favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/nginxu/mysite;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/mysite.sock;
}
配置完成后,可使用sudo nginx -t对Nginx的配置文件进行检查。
5.3 权限及启动的配置
为了能让nginx能访问/home/user中的文件,我们需要将nginx添加到user用户组,并设置相应权限确保安全:
sudo usermod -a -G nginxu nginx
chmod 710 /home/nginxu
自此,我们的配置已经基本完成啦,现在,就启动我们的Nginx服务以及uWSGI进程吧:
以nginxu运行下面:
/usr/local/python3/bin/uwsgi --emperor /etc/uwsgi/sites --uid www-data --gid www-data --daemonize /var/log/uwsgi-emperor.log