常用软件:secureCRT,ssh,crf,xshell等。
其中文件操作功能基本都需要root账户才能有上传权限。但是root账户默认不能远程登录,所以需要以下配置:
为root设置密码:
sudo passwd root
根据提示输入密码
修改ssh功能配置文件:
$ sudo vi /etc/ssh/sshd_config
#找到PermitRootLogin no一行,改为PermitRootLogin yes
重启 ssh 服务
service sshd restart
接下来远程登录root账户,开始安装依赖包
一般linux服务器目前都安装python2.x版本,最新的都会装3.x的。可以查看系统中是否安装了python
#输入python即可查看相关信息
python2 --version #查看python2的版本信息
pyton3 --version #查看python3的版本信息
#如需要安装,输入
sudo apt-get install python3.x #安装python
Python3和Python2是互相不兼容,但也不能卸载python2,可以将Python指向Python3,这样就可以默认使用python3了。默认指向python2。
指向python3的命令
echo alias python=python3 >> ~/.bashrc
source ~/.bashrc
linux中的pip默认是装的python2.x版本,
需要安装python3版本的pip:
apt install python3-pip #主目录下,这可以可以全局使用pip3
安装包的时候根据提示升级了pip,再次使用pip 安装相关的python包的时候就出现以下错误再来直接使用就会报错:
ImportError: cannot import name main
解决方法:vim /usr/bin/pip3
from pip import main
if __name__ == '__main__':
sys.exit(main())
换成下面即可:
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())
sudo pip3 install virtualenv
sudo pip3 install virtualenvwrapper
我们只需要使用到virtualenvwrapper提供的命令来操作virtualenv,使用之前,需要对其配置:
进入当前用户根目录编辑打开配置文件
cd ~
sudo vim .bashrc
把以下三行赋值到配置文件中,
export WORKON_HOME=$HOME/.virtualenvs
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
随后执行以下命令令修改立即生效
source ~/.bashrc
其实,我们可以不使用虚拟环境,那么运行pip命令所有的包将直接安装在系统中,如果服务器上打算只运行单个项目可以跳过虚拟环境的操作。如果将来有可能会有多个项目,需要运行在不同的环境内,我们可以通过为每个应用创建虚拟环境来实现。
#新建虚拟环境,通过"-p"指定python解释器的版本
#blogenv是自定义的虚拟环境名
mkvirtualenv -p /usr/bin/python3 blogenv
创建完虚拟环境,我们需要进入虚拟环境,
workon blogenv
进入以后,接下来的pip下载的包将保存在当前虚拟环境下,与其他虚拟环境不共享。
如果想要退出虚拟环境,执行以下命令
deactivate
删除虚拟环境的命令
rmvirtualenv blogenv
我们最终需要在服务器上运行我们的django项目,项目中使用到大量的第三方库,如果挨个进行下载过于笨拙,我们可以批量执行。
在开发者的代码所在的pycharm中下收集并生成当前项目的第三方库。
# 在以前项目环境里导出环境
pip freeze > requirements.txt #生成plist.txt
可以通过命令,或者xftp等ssh类型的客户端,也可以使用svn,git等将生成的环境文件上传到服务器。我这里使用的secureCRT客户端软件把plist.txt上传至服务器的src目录
服务器中cd到环境文件上传到的目录下执行以下代码:
pip install -r plist.txt
注意:如果这里报错,请先完成下面的mysql的安装之后再回来重新执行这个命令
安装 Mysql :
sudo apt-get install mysql-server
apt install libmysqlclient-dev
安装成功后可以通过下面的命令测试是否安装成功
netstat -tap | grep mysql
1设置mysql允许远程访问,首先编辑mysql配置文件。
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
注释掉bind-address = 127.0.0.1: #允许远程连接
2在阿里云服务器的安全组设置中开放3306端口
3修改root密码
如果使用root进行远程连接,需要重新修改root的远程权限和密码。
#进入mysql后执行
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
4 service mysql restart重启生效
5 mysql配置成功之后,要在mysql中新建数据库,命令是:
create database FruitDay default charset utf8 collate utf8_general_ci;
注意:也可以在Navicat中远程连接服务器上的mysql,再新建mysql数据库,要注意指定库的编码为utf-8,这样可以避免中文乱码问题。
将我们编写好的整个项目的上传到服务器的某个路径下(我选择的目录/src/www),这个目录以后会使用到。
代码上传之前我们最好提前修改好settings.py文件:
服务器中cd到保存的项目,与manage.py文件同级执行:
#在服务器上生成表和管理员账号
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
#在服务器上执行,启动服务器,并绑定到8000端口
python manage.py runserver 0:8000 #0是0.0.0.0的缩写
端口可以自定义,注意不要与其他冲突,并且注意云服务器是否有安全组的考虑而关闭了端口的访问。
接下来客户端就可以通过浏览器打开"公网ip:8000"来在线访问我们的项目
按照以上的配置虽然我们已经可以将项目部署到公网上,但是刚才是使用django内置的一个小型服务器,这个服务器的性能只能用于测试,实际开发我们并不会这样使用,而是使用uwsgi。
WSGI和uWSGI:
在服务器上安装需要依赖的包
apt install python3-dev
apt install gcc
安装uwsgi
pip3 install uwsgi #在虚拟环境里面,具体看实际
退出刚才内置服务器的django项目,然后使用uWSGI运行我们的项目:
#进入cd django项目中
uwsgi --http :8000 --module 项目.wsgi
#举例 uwsgi --http :8000 --module bookshop.wsgi
这里应该可以再向下深入一层,直接运行wsgi
我们使用uwsgi已经算得上是一个性能比较不错的服务器了,可以运行django项目,处理用户请求了。但是在用户量很大的场景下还不够,我们需要配置Nginx+uwsgi。
主要使用到Nginx的功能:
安装nginx(在虚拟环境外执行)
apt install nginx
启动nginx
/etc/init.d/nginx start(stop、restart)
测试nginx,
在客户端浏览器输入启动Nginx的公网ip地址,显示nginx的首页说明测试成功。
接下来我们会操作一些配置文件用于他们三个之间配合工作:
uwsgi.ini模板
[uwsgi]
#使用nginx连接时:socket=127.0.0.1:端口,端口自定义 #这里不要填写公网ip
#单独使用uwsgi时为: http=内网ip:端口,端口自定义
socket=xxx.xxx.xxx.xxx:12000 #单独启用uwsgi时这里一定用内网ip
#需要部署的项目的路径
chdir=/opt/src/www/bookshop
#需要部署的项目的wsgi文件
wsgi-file=bookshop/wsgi.py
#最大数量的工作进程数
processes=4
#最大数量的工作线程数量
threads=2
master=True
pidfile=uwsgi.pid
#生成的日志保存文件
daemonize=uwsgi.log
#指定使用的虚拟路径
home=/root/.virtualenvs/blogenv #这里一定要精确到虚拟环境的名称
启动uwsgi服务:
进入uwsgi.ini目录下执行
# 最后的文件也可以是绝对路径
uwsgi --ini uwsgi.ini #这是通过配置文件启动uwsgi的方式,好处在于服务器在后台运行,不影响我们的其他操作
关闭uwsgi服务:
sudo pkill -f uwsgi -9
nginx文件配置模板:
主要学些重要配置部分
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
####################重要配置区域########################
#配置文件内容:
# 转发给哪个服务器,可以通过upstream配置项让nginx实现负载均衡
upstream django {
server 127.0.0.1:12000;
#这里可以有多个server,那么就可以实现使用多个server之间默认轮询的方式处理请求
}
# 设定虚拟主机配置,一个http中可以有多个server。
server {
# 启动的nginx的端口
listen 80;
server_name 111.231.239.236;
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# location 配置请求静态文件多媒体文件。
location /media {
alias /opt/src/www/bookshop/media/;
}
# 静态文件访问的url
location /static {
# 指定静态文件存放的目录
alias /opt/src/www/bookshop/static/;
}
# 将所有非媒体请求转到Django服务器上
location / {
# 包含uwsgi的请求参数,路径为qmblog_uwsgi_params绝对路径
include uwsgi_params;
# 转交请求给uwsgi
# uwsgi_pass 127.0.0.1:8000;
uwsgi_pass django; #这个django对应开头出的,对于动态请求,转发到本机的端口,也就是uwsgi监听的端口,uwsgi运行的主机和ip,后面我们会在本机的该端口上运行uwsgi进程
}
}
############################################
}
#mail {
# # See sample authentication script at:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "USER";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# server {
# listen localhost:110;
# protocol pop3;
# proxy on;
# }
#
# server {
# listen localhost:143;
# protocol imap;
# proxy on;
# }
#}
uginx先启动。随后启动nginx。
uwsgi --ini uwsgi.ini #启动uwsgi
sudo pkill -f uwsgi -9 #关闭uwsgi
/etc/init.d/nginx start #还有(restart、stop)命令
测试:
客户端访问:
http://公网ip:nginx端口(不填端口或者80)/资源名称
可以实现请求先到达nginx,然后将请求分发给某个uwsgi服务器,uwsgi调用视图。