本人最近想研究一个基于python的网站,在配置服务器的过程中遇到了很多的困难,经过了2天两夜的奋战,终于绕过了各种坑,现在将我总结的成果分享给大家,希望有同样经历的朋友能够少走弯路,共同进步!(ps:有错误的地方希望大家更正,一起交流!)
1. 基于VMware的Ubuntu16.04的安装,很简单几乎一步安装。
2. 安装python3.5
l 添加 PPA:
sudo add-apt-repository ppa:fkrull/deadsnakes
l 升级源
sudo apt-get update
l 安装python:
sudo apt-get install python3.5
l 将python 3.5替代2.7设为默认:
1)删除usr/bin/目录下的默认python link文件
2)sudo ln -s /usr/bin/python3.5 /usr/bin/python
3.安装pip
sudo apt-get install python3-pip
出错解决:
sudo dpkg -C
sudo apt-get clean
sudo apt-get update
sudo apt-get install --reinstall python-minimal python-lockfile
(分析: 原因是,我们在将python2.7升级到python3.3时,只是将/usr/local/bin目录下修改了(使用ln -s 或者其他),然而我们的配置目录并没有修改..)
使用pip:
Pip3 install SomePackage (这里一定要pip3)
4.安装django
sudo apt-getinstall python-django(这个不行)
sudo pip3 install Django (直接用pip3来安装!)
检测安装成功:
python
import django
django.get_version()
建立项目
django-admin startproject 项目的名称(在要放项目的目录下打开终端,复制命令)
建立app
python manage.py startapp app名称 (在上步骤所建立的项目目录下打开终端运行命令)
运行 Django 服务
python manage.py runserver
设置setting.py host 文件
ALLOWED_HOSTS = ['192.168.216.131','localhost', '127.0.0.1'] (这是格式)
5.Ubuntu设置静态ip
Ifconfig 查看网络状态,这里网卡型号很重要 这里 ens33
netstat –rn 查看 route -n
1、目录: vi /etc/network/interfaces
添加内容:
autoens33
iface ens33inet static
address 192.168.216.131
netmask 255.255.255.0
gateway 192.168.216.2
dns-nameserver 192.168.216.2
(这里en33是网卡型号,是上面得到的。。 dns-nameserver 192.168.216.2这句一定需要有,
因为以前是DHCP解析,所以会自动分配DNS 服务器地址。
而一旦设置为静态IP后就没有自动获取到DNS服务器了,需要自己设置一个
设置完重启电脑后,/etc/resolv.conf文件中会自动添加 nameserver 192.168.216.2
)
2 重启网络
sudo/etc/init.d/networking restart
6.运行app
python manage.py startapp polls
polls/
__init__.py
admin.py
apps.py
migrations/
__init__.py
models.py
tests.py
views.py
polls/views.py
fromdjango.httpimport HttpResponse
defindex(request):
return HttpResponse("Hello, world. You're at the polls index.")
polls/urls.py
fromdjango.urlsimport path
from.import views
urlpatterns= [
path('', views.index, name='index'),
]
mysite/urls.py
fromdjango.urlsimport include, path
fromdjango.contribimport admin
urlpatterns= [
path('polls/', include('polls.urls')),
path('admin/', admin.site.urls),
]
测试成功!
7.安装Nginx
sudo apt-get install nginx
基本命令:
/etc/init.d/nginx start #启动
/etc/init.d/nginx stop #关闭
/etc/init.d/nginx restart #重启
修改Nginx默认端口号,打开/etc/nginx/nginx.conf 文件,修改端口号。(可以修改也可以不修改)
如果报错:尝试运行命令 ps -aux | grep apt
查看 哪个端口 占用这apt的程序
然后 kill -9 端口号(利用root来kill)
cd /var/lib/dpkg sudo mv info info.bak sudo mkdir info
最后最好在升级源: sudo apt-get update
再运行: sudo apt-get install nginx 安装nignx
重新运行 nignx : /etc/init.d/nginx restart
在浏览器输入: 127.0.0.1 测试nginx运行成功
8.安装Uwsgi
pip3install uwsgi
测试uwsgi,创建test.py文件:
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"HelloWorld"]
通过uwsgi运行该文件。
fnngj@ubuntu:~/pydj$ uwsgi --http :8001 --wsgi-filetest.py
9.连接他们三
在项目目录下 建立文档myweb_uwsgi.ini (与manage.py同级)
#myweb_uwsgi.ini file
[uwsgi]
#Django-related settings
socket= :8002
#the base directory (full path)
chdir = /guoju/project/shiyan
#Django s wsgi file
module = shiyan.wsgi
#process-related settings
#master
master = true
#maximum number of worker processes
processes = 4
#... with appropriate permissions - may be needed
#chmod-socket = 664
#clear environment on exit
vacuum = true
在目录下运行:
uwsgi --ini myweb_uwsgi.ini
修改nginx
打开/etc/nginx/nginx.conf文件,添加如下内容。
server {
listen 8099;
server_name 127.0.0.1
charset UTF-8;
access_log /var/log/nginx/myweb_access.log;
error_log /var/log/nginx/myweb_error.log;
client_max_body_size 75M;
location/ {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_read_timeout 2;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/fnngj/pydj/myweb/static/;
}
}
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口号与myweb_uwsgi.ini配置中的文件中的必须一致。
现在重新启动nginx,翻看上面重启动nginx的命令。然后,访问:http://127.0.0.1:8099/ (端口自定义,默认80)
至此如果没有其他问题的话,就全部配置完毕了
后记:在成功运行的过程中,有一个很蹩脚的问题就是,后台django在更新setting文件或者view文件的过程中,前台的nginx的网页不随着更新,原因是uwsgi在传递过程中的问题,为了提高效率默认关闭了刷新数据的功能。
解决办法:
1 把uwsgi端口关了,然后重启,以后每次后台数据一更新就重新reload(不推荐,很傻的方法)。
2 在myweb_uwsgi.ini文件中,最后一行加上py-autoreload = 1 以后每次后台更新,前台自动更新。(推荐此方法,一劳永逸!)