uWSGI+Nginx部署

环境准备

发布CRM你将使用以下软件

  • nginx
  • uWSGI
  • CentOS7
  • CRM项目文件
  • virtualenv/virtualenvwrapper
  • supervisor

WSGI、uWSGI

python web服务器开发使用WSGI协议(Web Server Gateway Interface)

python web项目默认会生成一个wsgi.py文件,确定好应用模块。

生产环境中使用的是uWSGI,实现了WSGI所有接口,C语言编写,效率很高的web服务器。

uWSGI是一个全功能的HTTP服务器,实现了WSGI协议、uwsgi协议、http协议等。它要做的就是把HTTP协议转化成语言支持的网络协议。比如把HTTP协议转化成WSGI协议,让Python可以直接使用。

Nginx

使用nginx是为了它的反向代理功能,项目会通过Django+uWSGI+Nginx进行服务器线上部署。

CentOS

1.打包项目CRM文件夹,压缩文件

2.通过xftp、scp、lrzsz等上传文件至Centos服务器

Linux使用技巧

1.通过xshell或者iTerm等软件,多终端操作你的linxu,这样对uwsgi、nginx、项目代码调试的时候,避免来回切换目录,提供工作效率。

2.注意修改了linux软件的配置文件,都要重启服务才能生效。

Virtualenv/Virtualenvwrapper

构建一个干净,隔离的python解释器环境,防止软件依赖,冲突等问题,建议使用。

Supervisor

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

nginx部署python程序
1.在进行项目部署的时候,如果报错
no application not found
就是因为你的uwsgi没找到django的wsgi.py应用文件

2.为什么要用nginx uwsgi
因为用户只想访问域名,不带有任何端口
通过nginx反向代理,用户直接访问 chiji.com,但是nginx直接转发给了django,我们其实看到的页面是django
uwsgi是支持并发的,python web服务器,让你的django并发性更高,但是uwsgi不支持静态文件的处理,静态文件会丢失

用nginx处理静态文件,uwsgi处理动态请求

3.项目部署实验步骤
####
nginx

####
uwsgi+django
1.workon切换之前的虚拟环境或者创建新的虚拟环境(mkvirtualenv nginx_crm)且解决环境依赖
[root@localhost ~]# workon
[root@localhost ~]# workon myblog
(myblog) [root@localhost ~]# pip3 list

2.在虚拟环境下安装uwsgi
(myblog) [root@localhost ~]# pip3 install uwsgi
(myblog) [root@localhost ~]# which uwsgi
/root/Envs/myblog/bin/uwsgi
(myblog) [root@localhost ~]# uwsgi --version
2.0.18



3.用uwsgi启动一个python文件:
uwsgi --http :8000 --wsgi-file test.py
http :8000: 使用http协议,端口8000
wsgi-file test.py: 加载指定的文件,test.py

#test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    
#访问:http://192.168.0.101:8000/     


4.用uwsgi启动一个项目(在虚拟环境下操作):
    #cd到目录中,myblog/wsgi.py确保找到这个文件
    (myblog) [root@localhost ~]# uwsgi --http :8000 --module myblog.wsgi --py-autoreload=1
    module myblog.wsgi: 加载指定的wsgi模块
    --py-autoreload=1  热加载命令(修改django代码,uWSGI会自动加载django程序)


    使用uwsgi配置文件去启动项目:

    1.手动创建uwsgi.ini 配置文件
    (myblog) [root@localhost myblog]# ls
    backend  db.sqlite3  manage.py  media  myblog  repository  static  templates  utils  web
    (myblog) [root@localhost myblog]# touch uwsgi.ini
    (myblog) [root@localhost myblog]# vim uwsgi.ini

    #########################
    # mysite_uwsgi.ini file
    [uwsgi]

    # Django-related settings
    # the base directory (full path)
    #指定django的项目目录,第一层
    chdir           = /opt/myblog
    # Django's wsgi file
    #找到django的wsgi文件
    #这里需要写项目的第二层目录myblog
    module          = myblog.wsgi
    # the virtualenv (full path)
    #填写虚拟环境的绝对路径
    home            = /root/Envs/myblog
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    开启进程数量
    processes       = 5
    # the socket (use the full path to be safe
    #指定socket协议,运行django,只能与nginx结合时使用
    #指定socket协议,运行django,只能与nginx结合时使用
    socket          = 0.0.0.0:8000

    #如果你没用nginx,只想启动一个http界面,用这个
    #http          = 0.0.0.0:8000

    # ... with appropriate permissions - may be needed
    # chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
    #########################

    2.通过配置文件启动uwsgi
    (myblog) [root@localhost myblog]# ls
    backend  db.sqlite3  manage.py  media  myblog  repository  static  templates  utils  web
    (myblog) [root@localhost myblog]# uwsgi --ini uwsgi.ini

    
5.收集myblog的静态文件
编辑myblog的settings.py配置文件
#定义django的静态资源根目录,便于用命令收集资源,存放的地儿
STATIC_ROOT="/opt/myblog_static"

[root@localhost myblog]# vim settings.py 
加上STATIC_ROOT="/opt/myblog_static"
用命令收集静态文件
[root@localhost myblog]# python3 manage.py collectstatic

6.配置nginx,反向代理django服务器,且解析静态文件
proxy_pass仅仅是请求转发的参数,与uwsgi结合,还有更高级的协议参数 

修改nginx配置文件如下:
http {  
    server {
        listen       80;
        #server_name  myblog.com;
        server_name  localhost;
        location / {    
        #使用uwsgi_pass转发基于uwsgi协议的一个请求
        include /opt/nginx112/conf/uwsgi_params;
        uwsgi_pass 192.168.0.101:8000;        
        }
    #配置一个url的入口,告诉django静态文件去哪里找
        #当请求静态文件是就进行别名,nginx去/opt/myblog_static/下找,注意不要用tab键切换,敲空格
        location /static{alias /opt/myblog_static/;}
    }
}

7.此时nginx结合uwsgi已经完成
192.168.0.101:8000/访问不到,避免了端口工具
192.168.0.101通过nginx的反向代理访问


8.配置supervisor工具,管理django后台【记住这里退出虚拟环境,使用物理环境去运行】
    1.下载supervisor
    [root@localhost ~]# easy_install supervisor
    2.配置supervisor的配置文件,编写django任务
    (myblog) [root@localhost myblog]# deactivate 
    [root@localhost myblog]# echo_supervisord_conf > /etc/supervisor.conf
    [root@localhost myblog]# vim /etc/supervisor.conf
    最底行写入:

    [program:myblog]
    command=/root/Envs/myblog/bin/uwsgi --ini /opt/myblog/uwsgi.ini  ;  #写绝对路径
    autostart=true
    stopasgroup=true
    killasgroup=true

    3.启动supervisor服务端
    [root@localhost myblog]# supervisord -c /etc/supervisor.conf 
    通过客户端命令查看任务
    [root@localhost myblog]# supervisorctl -c /etc/supervisor.conf 
    myblog                           RUNNING   pid 21129, uptime 0:00:14
    supervisor> 

    4.supervisor管理命令
    [root@localhost myblog]# supervisorctl -c /etc/supervisor.conf 
    myblog                           RUNNING   pid 21129, uptime 0:00:14
    supervisor> 
    supervisor> stop myblog  #停止所有任务
    myblog: stopped
    supervisor> start myblog  #启动所有任务
    myblog: started
    supervisor> 
    supervisor> status         
    myblog                           RUNNING   pid 21284, uptime 0:01:17
    supervisor> 




其他:
找uwsgi的绝对路径
(myblog) [root@localhost myblog]# which uwsgi
/root/Envs/myblog/bin/uwsgi
(myblog) [root@localhost myblog]# pwd
/opt/myblog


怎么查看虚拟环境绝对路径:
(myblog) [root@localhost opt]# cdvirtualenv 
(myblog) [root@localhost myblog]# pwd
/root/Envs/myblog


找uwsgi_params的路径
[root@localhost myblog]# find / -name uwsgi_params
/opt/nginx-1.12.0/conf/uwsgi_params
/opt/nginx112/conf/uwsgi_params
[root@localhost myblog]# 
部署myblog
nginx+uwsgi+路飞学城部署
1.单机本地测试运行方式,调用django第三方的wsgiref单机模块,性能很低
python3 manage.py runserver 0.0.0.0:8000

2.使用uwsgi去启动django项目,支持并发更多

3.准备前后端代码

4.先从vue前端整起
    1.解决node环境
    2.更改vue发送请求的接口地址
    这个vue发送的地址,应该是发送给nginx代理,然后代理再转发请求给drf后台    
    用以下命令,更改vue发送的接口地址
    [root@localhost restful]# sed -i "s/127.0.0.1/192.168.0.101/g"  /opt/luffy/07-luffy_project_01/src/restful/api.js
    
    !!!待会要准备nginx的代理地址,如下:
    !!!待会要准备nginx的代理地址,如下:
    !!!待会要准备nginx的代理地址,如下:
    192.168.0.101:8000
    3.打包编译vue静态文件
    
    [root@localhost 07-luffy_project_01]# ls
    build  config  index.html  package.json  package-lock.json  README.md  src  static
    [root@localhost 07-luffy_project_01]# pwd
    /opt/luffy/07-luffy_project_01
    [root@localhost 07-luffy_project_01]# npm install
    [root@localhost 07-luffy_project_01]# ls
    build  config  index.html  node_modules  package.json  package-lock.json  README.md  src  static
    [root@localhost 07-luffy_project_01]# npm run build
    [root@localhost 07-luffy_project_01]# ls
    build  config  dist  index.html  node_modules  package.json  package-lock.json  README.md  src  static

    4.生成的dist文件夹,就是路飞学城的静态页面,丢给nginx去返回即可
    配置nginx.conf找到vue的静态页面
    http {  
    server {
        listen       80;
        server_name  luffy.com;
        #server_name  localhost;
        location / {    
        root   /opt/luffy/07-luffy_project_01/dist;
        index  index.html index.htm;
        }
    }
    
}

5.开始配置后端代码,用uwsgi启动luffy
    1.新建虚拟环境
    mkvirtualenv luffy
    2.解决所需的依赖模块,准备一个模块版本文件:requirements.txt 这个文件可以手动创建写入如下依赖
    (luffy) [root@localhost opt]# cd /opt/luffy/luffy_boy
    (luffy) [root@localhost luffy_boy]# touch requirements.txt
    (luffy) [root@localhost luffy_boy]# vim requirements.txt 
    ##############################
    certifi==2018.11.29
    chardet==3.0.4
    crypto==1.4.1
    Django==2.1.4
    django-redis==4.10.0
    django-rest-framework==0.1.0
    djangorestframework==3.9.0
    idna==2.8
    Naked==0.1.31
    pycrypto==2.6.1
    pytz==2018.7
    PyYAML==3.13
    redis==3.0.1
    requests==2.21.0
    shellescape==3.4.1
    urllib3==1.24.1
    uWSGI==2.0.17.1
    ##############################
    (luffy) [root@localhost luffy_boy]# ls
    api  db.sqlite3  keys  luffy_boy  manage.py  requirements.txt  static  templates
    3.安装所需的依赖模块
    (luffy) [root@localhost luffy_boy]# pip3 install -i https://pypi.douban.com/simple -r requirements.txt 
    4.看一看
    pip3 list
    5.运行
    python3 manage.py runserver 0.0.0.0:8000  (注意端口得是8000,因为前端的vue发的就是8000)

6.准备uwsgi,以及uwsgi.ini

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /opt/luffy/luffy_boy
# Django's wsgi file
module          = luffy_boy.wsgi
# the virtualenv (full path)
home            = /root/Envs/luffy
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 5
# the socket (use the full path to be safe
socket          = 0.0.0.0:9000
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true



7.通过配置文件启动uwsgi
(luffy) [root@localhost luffy_boy]# ls
!  api  db.sqlite3  keys  luffy_boy  manage.py  requirements.txt  static  templates  uwsgi.ini
(luffy) [root@localhost luffy_boy]# uwsgi --ini uwsgi.ini



8.配置nginx,反向代理django服务器,且解析静态文件
#虚拟主机1的功能是web页面返回
    server {
        listen       80;
        server_name 192.168.0.101;

        location / {
        root   /opt/luffy/07-luffy_project_01/dist;
        index  index.html index.htm;
        }
      }
      
#虚拟主机2的功能是反向代理,vue发送的代理地址是192.168.0.101:8000
    server {
        listen       8000;
        server_name  192.168.0.101;
        location / {

                include /opt/nginx112/conf/uwsgi_params;
                uwsgi_pass 192.168.0.101:9000;
                 }
         }


#解释:
当用户发送请求给192.168.0.101时,默认走的是第一个虚拟主机,进行vue静态页面返回
然后在浏览器中点击课程列表,vue发送请求给代理ip,(然后nginx就支持反向代理,再定义虚拟主机2,监听的地址是8000,

转发的请求地址是后台的uwsgi端口,可以是9000,也可以是9999,自定义)
        
    
9.修改项目的settings文件中的redis配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://192.168.0.101:6380",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {"max_connections": 100},
            # "PASSWORD": "密码",
            "DECODE_RESPONSES":True
        }
    },
}

10修改项目代码中/opt/luffy/luffy_boy/api/views/shoppingcart.py 的代码
(更改redis数据库连接的驱动,用django的驱动)
#REDIS_CONN = redis.Redis(decode_responses=True)改成下面的
REDIS_CONN = get_redis_connection()


11.redis的配置
(luffy) [root@localhost redis-4.0.10]# pwd
/opt/redis-4.0.10
(luffy) [root@localhost redis-4.0.10]# vim redis-6380.conf 
复制如下代码:
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dir /data/6380
requirepass 111111
appendonly yes
appendfsync everysec
protected-mode no
bind 192.168.0.101

12.启动redis
(luffy) [root@localhost redis-4.0.10]# redis-server  redis-6380.conf
(luffy) [root@localhost redis-4.0.10]# redis-cli -p 6380 -a 111111 -h 192.168.0.101
    
13.redis nginx uwsgi 确保都启动了,alex   alex3714登录
    
其他:
    配置两个本地解析的域名
    C:WindowsSystem32driversetchosts文件,写入如下配置:
    192.168.1.101 chiji.com 
    192.168.1.101 hanju.com
    
    
    #如果打包不成功
    1.更换网络
    2.在window中打包,生成dist文件夹后,发送给Linux
    3.更换源,加速下载
部署luffy
命令:curl -I baidu.com

[root@localhost ~]# curl -I baidu.com
HTTP/1.1 200 OK
Date: Tue, 24 Sep 2019 19:24:44 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Wed, 25 Sep 2019 19:24:44 GMT
Connection: Keep-Alive
Content-Type: text/html

web服务器(nginx):接收HTTP请求(例如www.pythonav.cn/xiaocang.jpg)并返回数据
web服务器,仅仅就是接受一个web请求,返回一个磁盘上的静态资源(jpg,mp4...)

错误码
50x 服务器错误,django flask后台蹦了
40x 客户端错误,权限不足,资源不存在等等...
30x 资源重定向
20x 请求正确返回

技术栈:
贵:
Java+apache(web服务器,处理静态资源)+oracle(数据库)+tomcat(处理Java应用)+svn(代码托管)+js+jQuery +redhat
为了省钱,切换开源技术栈
java + perl + python + nginx + mysql + git + js + centos 

web框架(django,flask):开发web应用程序,处理接收到的数据

nginx安装步骤,源码编译安装(源码编译,开源自定制更多功能)
1.解决软件正常运转所需依赖包
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
2.下载源代码
[root@localhost ~]# cd /opt
[root@localhost opt]# wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
3.解压缩源码
[root@localhost opt]# tar -zxvf nginx-1.12.0.tar.gz
4.进入源码目录,编译安装
[root@localhost opt]# cd nginx-1.12.0/
[root@localhost nginx-1.12.0]# ./configure --prefix=/opt/nginx112
[root@localhost nginx-1.12.0]# make && make install 
5.进入Nginx功能目录
cd /opt/nginx112
6.学习Nginx功能目录
[root@localhost nginx112]# ls
conf  配置文件nginx.conf
html  存放前端页面
logs  存放Nginx的运行日志,错误日志
sbin   存放Nginx可执行程序的目录
7.卸载原本的yum装的Nginx
[root@localhost nginx112]# yum remove nginx -y
8.启动
[root@localhost nginx112]# netstat -tunlp | grep 80
[root@localhost nginx112]# ps -ef|grep nginx
root      15678  13010  0 00:45 pts/3    00:00:00 grep --color=auto nginx
[root@localhost nginx112]# ls
conf  html  logs  sbin
[root@localhost nginx112]# cd sbin
[root@localhost sbin]# ls
nginx
[root@localhost sbin]# ./nginx
[root@localhost sbin]# !ps
ps -ef|grep nginx
root      15682      1  0 00:47 ?        00:00:00 nginx: master process ./nginx
nobody    15683  15682  0 00:47 ?        00:00:00 nginx: worker process
root      15685  13010  0 00:47 pts/3    00:00:00 grep --color=auto nginx
[root@localhost sbin]# 
[root@localhost sbin]# history
    1  pwd
    2  ip a
    3  w
    4  ip a
    ...    
  341  ps -ef|grep nginx
  342  ls
  343  cd sbin
  344  ls
  345  ./nginx
  346  history
[root@localhost sbin]# !341
ps -ef|grep nginx
root      15682      1  0 00:47 ?        00:00:00 nginx: master process ./nginx
nobody    15683  15682  0 00:47 ?        00:00:00 nginx: worker process
root      15687  13010  0 00:48 pts/3    00:00:00 grep --color=auto nginx
[root@localhost sbin]# 

9.添加Nginx的环境变量,可以快捷使用Nginx
[root@localhost sbin]# pwd
/opt/nginx112/sbin
[root@localhost sbin]# vim /etc/profile
PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/node-v8.6.0-linux-x64/bin:/opt/nginx112/sbin"

10.读取配置文件 source /etc/profile
[root@localhost sbin]# nginx
-bash: nginx: command not found
[root@localhost sbin]# source /etc/profile
[root@localhost sbin]# which nginx
/opt/nginx112/sbin/nginx

11.测试
192.168.0.101

12.修改配置文件

13.平滑重启nginx
[root@localhost nginx112]# ls
client_body_temp  conf  fastcgi_temp  html  logs  proxy_temp  sbin  scgi_temp  uwsgi_temp
[root@localhost nginx112]# ./sbin/nginx -s reload



Nginx功能目录
conf  配置文件nginx.conf (Nginx的功能参数都在这个文件定义)
html  存放前端页面
logs  存放Nginx的运行日志,错误日志
sbin   存放Nginx可执行程序的目录

conf/nginx.conf参数说明:
####################
#user  nobody;
#工作进程数,根据cpu的核数优化。
worker_processes  4;    
#错误日志
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;
#进程id文件
#pid        logs/nginx.pid;

#nginx事件驱动
events {
    worker_connections  60000;
}

#nginx web配置核心区域
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;
    #定义nginx虚拟主机的
    server {
        #nginx监听的端口,默认浏览器是80
        listen       80;
        #填写服务器的域名,如果你有域名,nginx会解析到当前这个虚拟主机
        #当访问pythonav.cn:80
        server_name  pythonav.cn;

        #charset koi8-r; 
    
        #access_log  logs/host.access.log  main;
        
        #location 就是nginx的路径资源匹配
        #就是当请求
        #pythonav.cn/
        #pythonav.cn/zoie.jpg
        #python.cn/flash/zoie.mp4
        #这个location / 这个语法是万能匹配,你所有的请求,都会进入这个location
        location / {
            #这个root用于定义网页根目录路径(可以换成其他绝对路径,相对路径是当前nginx)
            root   html;
            #定义网页的首页文件,名字必须叫做index.html
            index  index.html index.htm;
        }
        #通过这个参数,定义错误页面的文件,当状态码是404 400 401时,返回40x.html页面
        error_page  404 401 400 403             /40x.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ .php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ .php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}



####################
1.nginx定义多虚拟主机配置如下:
http{
    #虚拟主机1,运行吃鸡网站
    #虚拟主机的加载,自上而下的加载,如果是访问的ip地址,永远访问第一个
    server{
        listen 80;
        #当访问的域名是chiji.com就进入这个server标签
        server_name  chiji.com;
        location / {
            root   /opt/chiji;
            index  index.html index.htm;
        }
    }
    #虚拟主机2,运行韩剧网站
    server{
        listen 80;
        #当访问的域名是hanju.com就进入这个server标签
        server_name  hanju.com;
        location / {
            root   /opt/hanju;
            index  index.html index.htm;
        }
    }
}

2.配置两个虚拟主机的网站资源
    1.配置吃鸡网游的资料
    在/opt/chiji 目录下创建index.html
    2.配置韩剧的资料
    在/opt/hanju 目录下创建index.html
    3.配置两个本地解析的域名
    C:WindowsSystem32driversetchosts文件,写入如下配置:
    192.168.1.101 chiji.com 
    192.168.1.101 hanju.com
    4.在Windows下测试访问是否正常
    chiji.com 
    hanju.com

3.定义nginx错误页面优化404页面定制
    修改nginx.conf 找到如下参数
    #通过这个参数,定义错误页面的文件,当状态码是404 400 401时,返回40x.html页面
    error_page  404 401 400 403             /40x.html;   

4.nginx用户访问日志access.log

####################
nginx反向代理

代理:
微商,代购,房屋中介,黄牛,

用户向一个代理请求资源,而不需要关注这个资源的真实位置
用户(浏览器) 请求网站资源 --》直接定位到django后台(所有的请求压力,都直接给了后台)
django默认对并行很差,并且处理网页的静态资源效率很差。

10万个并发请求--》后台应用
静态请求 --> nginx(天然并发性很高,并且处理静态资源css,js,jpg),静态资源nginx直接从磁盘上返回。
hanju.com/zoie.png
nginx无法处理动态请求,直接将这个请求丢给后端应用django

动态请求(对数据库进行交互,必须有编程语言的支撑)
hanju.com/login/  --> django 后台,django这个编程语言框架,就可以对login请求处理

####################
实现nginx反向代理的功能
1.实验环境准备,2台机器
    用户:浏览器发送请求,得到请求
    192.168.0.101  nginx反向代理服务器(房屋中介代理)
    192.168.0.111  真实资源服务器(有房源的房东)

2.分别在2台机器上,安装nginx    
3.先配置真实资源服务器 192.168.0.111,打开这个机器的页面是吃鸡的网游页面
4.配置反向代理服务器192.168.0.101
http{
    #虚拟主机的加载,自上而下的加载,如果是访问的ip地址,永远访问第一个
    #这个nginx服务器,不再是用作虚拟主机了
    #而是直接转发别人的请求,是一个代理身份
    server{
        listen 80;
        #当访问的域名是chiji.com就进入这个server标签
        server_name  chiji.com;
        location / {
            #root   /opt/chiji;
            #index  index.html index.htm;
            #当请求是chiji.com的时候,这个nginx不做处理,直接转发请求给另一台机器
            proxy_pass  http://192.168.0.111;
        }
    }




####################其他
1.nginx脚本命令
nginx 直接输入是启动
nginx -s stop 停止
nginx -s reload 平滑重启,重新读取配置文件


.nginx.conf.swp 这个文件是由于你在vim编辑文件的时候,异常退出,或者有其他人也想获取这个文件句柄,
vim防止文件内容错乱,丢失,自动生成一个swp缓存文件,用于保护文件的。
[root@localhost conf]# rm -rf .nginx.conf.swp   #删除这个隐藏文件就可以了


###
top 命令可以查看cpu核数
hostnamectl set-hostname master
hostnamectl set-hostname slave
nginx
redis持久化之RDB:
1.rdb持久化,可以手动触发持久化,通过redis放入save命令触发
2.rdb文件是一个经过压缩的二进制文件,redis可以通过这个文件还原数据
3.rdb持久化还有时间策略
save  900 1          #900秒  1个修改类的操作
save 300 10          #300秒  10个操作
save 60  10000       #60秒  10000个操作

4.使用rdb持久化的方式
--配置文件:
    [root@localhost redis-4.0.10]# vim redis-6380.conf 
    写入以下内容:
    port 6380    #redis端口
    daemonize yes  #后台运行redis
    pidfile /data/6380/redis.pid  #pid号码
    loglevel notice   #日志等级
    logfile "/data/6380/redis.log"  #日志文件存放路径
    requirepass bubu666  #redis的密码    
    dir /data/6380  #redis数据目录/#定义持久化文件存储位置【记得去创建一下目录】    
    
    dbfilename  redis.dump        #rdb持久化文件(此文件在/data/6380目录下)
    save 900 1                    #rdb机制 每900秒 有1个修改记录
    save 300 10                   #每300秒        10个修改记录
    save 60  10000                #每60秒内        10000修改记录




5.关闭redis服务端,准备重启或者使用kill
redis-cli -p 6380 -a bubu666 shutdown

6.使用新的支持rdb持久化的配置文件启动redis
redis-server redis-6380.conf

7.手动触发rdb持久化
127.0.0.1:6380> set name dsb
OK
127.0.0.1:6380> save
OK

8.让配置文件支持定期持久化
save 900 1                    #rdb机制 每900秒 有1个修改记录
save 300 10                   #每300秒        10个修改记录
save 60  10000                #每60秒内        10000修改记录


redis持久化之AOF(企业一般多用这个):
1.配置文件:
    [root@localhost redis-4.0.10]# vim redis-6380.conf 
    写入以下内容:
    port 6380    #redis端口
    daemonize yes  #后台运行redis
    pidfile /data/6380/redis.pid  #pid号码
    loglevel notice   #日志等级
    logfile "/data/6380/redis.log"  #日志文件存放路径
    requirepass bubu666  #redis的密码    
    dir /data/6380  #redis数据目录/#定义持久化文件存储位置【记得去创建一下目录】
    
    appendonly yes
    appendfsync everysec

2.启动
redis-server redis-6380.conf
3.写入数据
[root@localhost redis-4.0.10]# redis-cli -p 6380 -a bubu666
Warning: Using a password with '-a' option on the command line interface may not be safe.
127.0.0.1:6380> set name dsb
OK
127.0.0.1:6380> keys *
1) "name"

4.新终端中检查
[root@localhost redis-4.0.10]# cd /data/6380
[root@localhost 6380]# tail -f appendonly.aof 


##############################################

AOF持久化配置,两条参数
appendonly yes
appendfsync  always    总是修改类的操作
             everysec   每秒做一次持久化
             no     依赖于系统自带的缓存大小机制

#bind 10.0.0.10  127.0.0.1    #redis绑定地址

[root@localhost ~]# redis-server -v
Redis server v=4.0.10 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=b632d68350d21f18
redis持久化
Linux redis学习
1.安装redis的方式
    yum (删除这个yum安装的redis,我们只用源码编译安装的)
    rpm
    源码编译
2.删除原本的redis
    yum remove redis -y
3.源码安装redis
    1.下载redis源码
    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    2.解压缩
    tar -zxf redis-4.0.10.tar.gz
    3.切换redis源码目录
    cd redis-4.0.10.tar.gz
    4.编译源文件
    make 
    5.编译好后,src/目录下有编译好的redis指令
    6.make install 安装到指定目录
    7.默认在/usr/local/bin
    8.配置文件:
    [root@localhost opt]# cd redis-4.0.10/
    [root@localhost redis-4.0.10]# touch redis-6380.conf
    [root@localhost redis-4.0.10]# vim redis-6380.conf 
    写入以下内容:
    port 6380    #redis端口
    daemonize yes  #后台运行redis
    pidfile /data/6380/redis.pid  #pid号码
    loglevel notice   #日志等级
    logfile "/data/6380/redis.log"  #日志文件存放路径
    requirepass bubu666  #redis的密码
    dir /data/6380  #redis数据目录【记得去创建一下目录不然启动redis就报错了】
    
    
    9.新建文件
    [root@localhost redis-4.0.10]# mkdir -p /data/6380

    10.指定redis的配置文件,启动redis
    redis-server  redis-6380.conf
    
    [root@localhost ~]# ps -ef|grep redis
    [root@localhost ~]# netstat -tunlp
    
    11.连接
    [root@localhost ~]# redis-cli -p 6380
    127.0.0.1:6380> ping
    PONG
    127.0.0.1:6380> 
    
    12.加了密码以后(auth bubu666)
    [root@localhost redis-4.0.10]# redis-cli -p 6380
    127.0.0.1:6380> ping
    (error) NOAUTH Authentication required.
    127.0.0.1:6380> auth bubu666
    OK
    127.0.0.1:6380> ping
    PONG
    127.0.0.1:6380> 
    
    或者
    [root@localhost redis-4.0.10]# redis-cli -p 6380 -a bubu666
    127.0.0.1:6380> ping
    PONG
    127.0.0.1:6380> 
编译安装redis
编译安装python3
1.切换opt目录(这是一个约定)
cd /opt 
2.下载python3的源代码
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tgz
3.安装python前的库环境,非常重要
yum install gcc patch libffi-devel python-devel  zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

4.解压缩python3的源代码压缩文件
cd /opt/ 进入存在这个文件的目录
tar -xf Python-3.6.2.tgz 解压
5.cd Python-3.6.2/  进入源代码目录下,准备开始编译安装 
6.编译安装三部曲
第一曲:
cd Python-3.6.2/
#configure 这个脚本文件,只是为了释放makefile,用于指定python3安装到哪里
./configure    --prefix=/opt/python36  --with-ssl
        --prefix 这个参数用于指定python安装的路径
第二曲:
执行make开始编译python3.6的源代码
make

第三曲:
make install  生成/opt/python36

(第二曲和第三曲可以写成    make && make install)

7.配置环境变量
echo $PATH             #$PATH是有优先级顺序的
将/opt/python36/bin/放入环境变量,注意要添加到path的最前面
#变量的赋值只是临时有效
PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
#将这个参数,写入到Linux的全局变量配置文件中
vim /etc/profile     #打开这个全局变量文件,写入PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"到文件最后

8.退出(logout),重新加载全局变量.
9.which python3 确认是否正确安装
10.不要将系统默认的python 改成python3  这是一个大坑。
(因为Linux有很多工具,默认是用的python2,例如yum)


11.在Linux下安装django程序
pip3 install -i https://pypi.douban.com/simple django==1.11.16
pip3 install django==1.11.16
pip3 list

12.使用django命令创建项目
[root@localhost ~]# cd /opt
[root@localhost opt]# django-admin startproject mysite

13.修改mysite的settings.py中的ALLOWED_HOSTS
vim /opt/mysite/mysite/settings.py     #/查找
ALLOWED_HOSTS = ["*"]

14.启动项目
[root@localhost opt]# cd mysite/
[root@localhost mysite]# python3 manage.py runserver 0.0.0.0:9999

补充:
python3的管理工具是pip3 install flask
python2的是easy_install flask


[root@localhost ~]# python -V
Python 2.7.5
[root@localhost ~]# python --version
Python 2.7.5
[root@localhost ~]# python3 --version
Python 3.6.2
[root@localhost ~]# pip3 list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
Django (1.11.16)
pip (9.0.1)
pytz (2019.2)
setuptools (28.8.0)
You are using pip version 9.0.1, however version 19.2.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[root@localhost ~]# 
编译安装python3
###########################################
dns    /etc/resolv.conf

[root@localhost ~]# ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.101  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20c:29ff:fe53:9402  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:53:94:02  txqueuelen 1000  (Ethernet)
        RX packets 68  bytes 9208 (8.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 84  bytes 11947 (11.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 11  bytes 1220 (1.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11  bytes 1220 (1.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost ~]# vim /etc/sysconfig/net
netconsole       network          network-scripts/ 
[root@localhost ~]# vim /etc/sysconfig/network-scripts/if
ifcfg-eno16777736  ifdown-eth         ifdown-post        ifdown-Team        ifup-aliases       ifup-ipv6          ifup-post          ifup-Team          
ifcfg-lo           ifdown-ippp        ifdown-ppp         ifdown-TeamPort    ifup-bnep          ifup-isdn          ifup-ppp           ifup-TeamPort      
ifdown             ifdown-ipv6        ifdown-routes      ifdown-tunnel      ifup-eth           ifup-plip          ifup-routes        ifup-tunnel        
ifdown-bnep        ifdown-isdn        ifdown-sit         ifup               ifup-ippp          ifup-plusb         ifup-sit           ifup-wireless      
[root@localhost ~]# vim /etc/sysconfig/network-scripts/if
ifcfg-eno16777736  ifdown-eth         ifdown-post        ifdown-Team        ifup-aliases       ifup-ipv6          ifup-post          ifup-Team          
ifcfg-lo           ifdown-ippp        ifdown-ppp         ifdown-TeamPort    ifup-bnep          ifup-isdn          ifup-ppp           ifup-TeamPort      
ifdown             ifdown-ipv6        ifdown-routes      ifdown-tunnel      ifup-eth           ifup-plip          ifup-routes        ifup-tunnel        
ifdown-bnep        ifdown-isdn        ifdown-sit         ifup               ifup-ippp          ifup-plusb         ifup-sit           ifup-wireless      
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eno16777736   #打开网卡配置文件

HWADDR="00:0C:29:53:94:02"
TYPE="Ethernet"
BOOTPROTO="dhcp"    #动态获取ip协议
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="67dc0736-0a20-48c1-8576-31ae47670ff5"
ONBOOT="yes"   #必须将他改为ONBOOT="yes" 开机时读取这个网卡脚本

不能上网
1.网卡配置文件中必须将他改为ONBOOT="yes" 开机时读取这个网卡脚本
2.systemctl restart network


centos7 mariadb的学习
1.在Linux上安装软件的方式
yum安装 在线搜索rpm格式的软件包,进行自动的依赖关系处理,下载,安装
(阿里云的yum仓库,里面的软件都是阿里云运维工程师定义的)
yum install mysql -y
手动rpm包安装,需要手动解决N个软件依赖
rpm -ivh mysqlxx.rpm
源码编译安装(这种方式是企业应用最多的)
(可以自定制软件的版本,以及可以最优先的使用最新版本的软件)

2.yum源的配置(mysql的yum源)
    cd /etc/yum.repos.d/
    1.在线下载阿里云的yum仓库,以及epel仓库
    2.安装mysql的方式
    yum install mysql-server mysql -y
    3.安装mysql的方式也有2种,阿里云官方提供的mariadb软件包,版本可能太低。(下载网速很快,方便学习使用)
    4.企业里多半不会用阿里云的,因为版本低,安全性太低,会配置mariadb官方的yum仓储
        1.如下操作:(手动创建mariadb仓库文件,写入配置信息,安装最新版本mariadb)
        [root@localhost ~]# cd /etc/yum.repos.d/
        [root@localhost yum.repos.d]# touch Mariadb.repo
        [root@localhost yum.repos.d]# vim Mariadb.repo 
        写入如下配置:
        [mariadb]
        name = MariaDB
        baseurl = http://yum.mariadb.org/10.1/centos7-amd64
        gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
        gpgcheck=1
        [root@localhost yum.repos.d]# mysql -V
        mysql  Ver 15.1 Distrib 5.5.64-MariaDB, for Linux (x86_64) using readline 5.1
        [root@localhost yum.repos.d]# yum install mariadb-server mariadb -y
        2.启动
        systemctl start mariadb
        3.初始化mysql 
        mysql_secure_installation  
        【
        Set root password? [Y/n] y
        New password:  输入root管理员设置的数据库密码
        Re-enter new password: 再次输入密码
        Remove anonymous users? [Y/n] y 删除匿名账户
        Disallow root login remotely? [Y/n] n 允许root管理员从远程登录
        Remove test database and access to it? [Y/n] y  删除test数据库并取消对它的访问权限
        Reload privilege tables now? [Y/n] y   #刷新授权表,让初始化后的设定立即生效
4.配置数据库的中文支持
        s 查看数据库编码
        
        编辑mysql配置文件/etc/my.cnf,写入以下内容:    
        [mysqld]
        character-set-server=utf8
        collation-server=utf8_general_ci
        log-error=/var/log/mysqld.log
        [client]
        default-character-set=utf8
        [mysql]
        default-character-set=utf8
        5.在服务器上,修改了配置文件,都需要重启数据库服务
        systemctl restart mariadb
        6.查看具体库表的编码
        show create database myblog;
        show create table user;
    5.window去链接(报错需要授权配置)    
    mysql -uroot -p -h 192.168.0.101
    6.授权配置:配置mysql支持远程连接的sql语句
    授予root用户对所有的库表所有的权限,在所有的机器上操作,皆可登陆。
    MariaDB [(none)] > grant all privileges on *.* to root@'%' identified by '密码';
    #刷新权限
    MariaDB [(none)] > flush privileges;
    
    
mysql主从同步技术
1.环境准备,准备2台机器,一台master一台slave
    192.168.0.101  (主库)
    192.168.0.111  (从库)
【主库】
2.配置主库的环境
    1.#停mariadb
    systemctl stop mariadb

    2.#修改主库的配置文件,开启binlog功能
    vim /etc/my.cnf
    #修改内容
    #解释:server-id服务的唯一标识(主从之间都必须不同);log-bin启动二进制日志名称为mysql-bin 
      [mysqld]
      server-id=1
      log-bin=mysql-bin

    3.#启动mariadb
    systemctl start mariadb
    
    
    4.新建用于主从同步的用户tom,允许登录的从库是'192.168.0.111'
    create user 'tom'@'192.168.0.111' identified by '密码';
    #create user 'tom'@'%' identified by '密码';   
    
    5.授权tom一个slave的身份标识,在192.168.0.111机器上复制
    grant replication slave on *.* to 'tom'@'192.168.0.111';
    #grant replication slave on *.* to 'tom'@'%';
    
    6.锁表
    flush table with read lock;
    
    7.数据库信息导出
    mysqldump -uroot -p --all-databases > /opt/db.dump
    
    8.从主库把sql文件发给从库
    scp /opt/db.dump root@192.168.0.111:/opt/
    
    9.【从库配置】
    
    10.解锁
    unlock tables;
    
    11.验证主从同步是否正常。
    
【从库】
配置从库的环境
    1.编码:编辑mysql配置文件/etc/my.cnf,写入以下内容:    
            [mysqld]
            character-set-server=utf8
            collation-server=utf8_general_ci
            log-error=/var/log/mysqld.log
            [client]
            default-character-set=utf8
            [mysql]
            default-character-set=utf8
        
    2.修改Slave的/etc/my.cnf,写入
    [mysqld]
    server-id=3
    read-only=true

    (说明:设置server-id值并关闭binlog功能参数
    数据库的server-id在主从复制体系内是唯一的,Slave的server-id要与主库和其他从库不同,并且注释掉Slave的binlog参数。)

    3.启动
    systemctl start mariadb

    4.导入数据(之前从主库传过来的)
    mysql -uroot -p < /opt/db.dump
    
    5.在从库,通过一条命令,开启主从同步
    mysql > change master to master_host='192.168.0.101',


    6.配置复制的参数,Slave从库连接Master主库的配置
    【master_log_file和master_log_pos 通过show master status 查看】

    mysql > 
    change master to master_host='192.168.0.101',
    master_user='tom',
    master_password='tom密码',
    master_log_file='mysql-bin.000001',   
    master_log_pos=575;
    
    7.开启slave同步
    start slave;
    
    8.检查主从同步状态
    show slave statusG;
    保障都yes(注意关闭防火墙)
     Slave_IO_Running: Yes
     Slave_SQL_Running: Yes

    9.验证主从同步是否正常。

    
注意:如果你用的就是阿里云的yum源,安装mariadb的软件包名字就是如下:
yum install mysql-server mysql -y
如果你用的就是官方mariadb的yum源,
yum install mariadb-server mariadb -y

熟悉mariadb curd操作,mariadb主从同步,读写分离技术...    
安装mysql


学习运维架构技术乃王道
1.Nginx高可用负载均衡/缓存、限流/提升集群处理并发能力
2.mysql主从复制,读写分离
3.redis缓存加速与主从复制,哨兵,集群
4.异步消息/服务解耦之rabbitMQ消息队列
5.代码层优化/改进算法/多线程与内存优化
6.使用golang,Erlang等csp并发编程语言
7.docker容器时代


服务器介绍:
1.路飞的7台阿里云,腾讯云,亚马逊云,华为云
    数据都放在其他人的电脑上,安全性由别人掌控

2.公司有钱,有26台Dell实体服务器,vmware  esxi虚拟化的300+Linux
    公司有钱,自建机房(盖了一个厂房,里面专业托管服务器)
    有专业的公司,建造机房(世纪互联)
    机房都是有严格的标准,保护机器不断电,不损坏
    1.无静电
    2.无尘
    3.无湿度
    4.低温

Linux发行部:
Linux是一个名词,是系统的代表
1.红帽子公司  redhat Linux 收费
    -2045之前,外企
    -红帽Linux 资格认证证书
    rhcsa 红帽系统管理员
    rhce 红帽工程师
    rhca 红帽构架师
2.centos 免费版,社区版 centos7
3.Ubuntu 乌班图系统
4.suse 德国    Linux 收费


保证开发环境的一致性
1.手动解决
2.自动化解决
3.通过docker镜像
4.通过vmware系统模板镜像


Linux网络连接方式
桥接:
在一个局域网内,添加了一个新的机器

vmware就像是虚拟化的一个机房的服务器

远程连接
1.使用ssh命令
2.获取服务器的ip地址
3.window的xshell中输入:ssh root@192.168.0.101 远程连接Linux机器

Linux重要的目录
bin目录 有关bin的文件夹都是存放可执行文件的
etc目录存放配置文件的  /etc/my.conf   /etc/nginx.conf   /etc/redis.conf
    配置文件就是定制一堆参数,自己控制的参数
opt目录 存放第三方软件的安装路径的   /opt/redis   /opt/nginx   /opt/python36
root目录 存放超级用户的家目录
var目录 存放系统日志相关

Linux目录结构的操作
cd - 上一次的工作目录
cd ~ 当前登录用户的家目录
cd . 当前目录
cd .. 上一级目录

绝对路径:一切从根目录开始,就是一个绝对路径
相对路径:以当前位置为相对,找到路径

PATH变量是用于,当用户直接输入命令的时候,去查找的一个路径寻找点
当我们输入ls的时候,Linux回去PATH中寻找,哪里有ls


Linux命令学习:
ssh root@192.168.0.101
1.查看ip地址
ip a
ifconfig
2.linux目录分割是正斜杠/
3.w 那些用户在登录
4.whoami 我是谁
5.pwd 我在哪
6.更改目录
cd /
7.用于输出文件夹的内容
ls 
ll
ls -a 查看隐藏文件
ls -la
ls -lh 带文件大小
8.linux文件的颜色
浅蓝是软链接目录
蓝色是文件夹
白色是普通文件
绿色是可执行文件
9.创建目录
mkdir
mkdir -p ./a/b/c/d
mkdir -p ./bubu/{linux,python}
10.创建文件
touch
11.vi/vim写入内容
    a.此时进入了命令模式,输入键盘的i,进入编辑模式
    b.编辑模式下可以写入代码
    c.退出编辑模式按下Esc,此时就进入了底线命令模式
    d.输入:wq!
        :进入底线模式
        w 写入
        q 退出
        !强制的
    底线命令模式 :set nu 显示行号    
12.cat查看写入cat >>ceshi.txt <<EOF
[root@localhost /tmp/bubu 00:19:28]#cat >>ceshi.txt <<EOF
> ceshi
> 123
> EOF
[root@localhost /tmp/bubu 00:20:02]#cat ceshi.txt
ceshi
[root@localhost /tmp/bubu 00:20:09]#

cat /etc/passwd > ./passwd.txt 将/etc/passwd的内容写入到当前passwd.txt文件中

13.创建新用户
useradd bubu
passwd bubu
14.切换用户
su bubu
15.删除
rmdir 删除空文件夹
rm -rf * == rm -rf ./*  强制删除当前目录的所有内容
rm -rf /*  删除根(作死)
    -f递归删除文件夹
    -r强制性删除
    -i提示性操作,是否删除

16.ctrl+c 中断当前操作
17.which ls 
18.echo $PATH
19.hostname 查看主机名
20.hostnamectl set-hostname localhost
21.logout 退出重新登录查看
22.Linux命令提示符
[root@localhost ~]#
23.修改命令提示符
PS1变量控制

[root@localhost ~]# echo $PS1
[u@h W]$

修改命令提示符:
PS1='[u@h w 	]$'


24.软件时间date,硬件时间hwclock
ntpdate -u ntp.aliyun.com
25.clear
26.history

27.yum install tree -y 安装树状图命令
28.tree mysite/
29.echo 写入文件内容
echo 'hello' > ./test.txt
> 重定向覆盖写入符
>> 追加

30.拷贝 cp 目标文件 拷贝后的文件
cp my.py my.py.bak 

31.重命名命令,以及移动命令
mv 旧文件名 新文件名
mv 目标文件 移动后的路径
mv ../tmp/ceshi/txt ./

32.find 查找文件
find / -name test.txt  从根目录开始找,一个叫做test.txt的文件
find /opt -name '*.py'  从/opt目录下查找所有的.py文件
linux 管道符“|” 语法就是将第一条命令的结果传给第二条

33.过滤出python有关的进程
ps -ef | grep python
34.过滤出22端口的信息
netstat -tunlp| grep 22

35.过滤命令grep
grep nobody ./passwd.txt  从当前的passwd.txt文件中过滤出nobody的信息
grep all settings.py  过滤出django中settings.py 中allow_hosts的信息
grep all settings.py -n 过滤出allow_hosts的信息且输出行号
grep -v all settings.py  过滤出除allow_hosts之外的信息
grep -v all settings.py -n  过滤出除allow_hosts之外的信息且输出行号
cat settings.py | grep allow

36.head 
head -5 test.txt 
37.tail
tail -5 test.txt
tail -f test.txt 实时监控

37.alias别名
alias rm="rm -i"
alias rm="echo 求求你了,你可别坑我了!!!"

38.unalias rm 取消别名

39.远程传输文件,在两台Linux上
scp  想要操作的文件地址  存放的目标文件地址
scp  test.txt root@192.168.0.109:/tmp/
scp -r a root@192.168.0.109:/tmp/     -r递归传输文件夹

40.查看文件夹大小
方式1:ls -lh
方式2:du -h
du -sh /var/log/
    -s 合计文件夹大小
    -h 显示友好的单位换算

41.top命令(任务管理器)用于动态地监视进程活动和系统负载等信息 q退出
42.wget 下载
wget -r -p http://www.luffycity.com
43.Linux和window互相传递文件
    1.lrzsz
        sz test.txt(下载 从Linux传给window)
        rz test.txt(上传)
    2.xftp
    
44.reboot 重启
45.poweroff 关闭系统
46.free -m 查看内存
47.man grep 查看grep的帮助手册
48.防火墙
iptables -L #查看规则
iptables -F #清空防火墙规则
永久关闭防火墙,可能防火墙会阻挡你的Linux环境配置实验,为了方便,关闭它。
systemctl stop firewalld  #关闭防火墙服务
systemctl disable firewalld #设置开机禁用防火墙

49.tar -xf Python-3.6.2.tgz 解压
50.logout 退出账号


#######################################################################
用户权限相关
[root@localhost ~]# id       #返回用户的身份信息,当uid为0的时候,这个用户就是超级用户 
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@localhost ~]# id root
uid=0(root) gid=0(root) groups=0(root)

用户的存放文件:
/etc/passwd
/etc/shadow  存放用户密码的文件

用户的管理命令:
添加普通用户(只有root用户有这个权利)
[root@localhost ~]# useradd tom     #创建用户,这个用户的信息会存放到/etc/passwd
[root@localhost ~]# grep tom /etc/passwd  #查看用户信息,普通用户的id默认是从1000开始的
tom:x:1001:1001::/home/tom:/bin/bash
[root@localhost ~]# 

修改普通用户的密码
passwd 用户名

切换用户(必须加上中横线- 代表完全用户切换)
[root@localhost ~]# su - tom   
[tom@localhost root]$ 

添加用户组
groupadd it_dep

删除用户
userdel -rf tom
-f     强制删除用户
-r    同事删除用户以及家目录

sudo命令用来以其他身份来执行命令,预设的身份为root
1.编辑sudoers配置文件,添加tom用户信息  
vim /etc/sudoers    (/查找root   n查找下一个)
2.定位权限设置到
root    ALL=(ALL)       ALL
添加
root    ALL=(ALL)       ALL
tom     ALL=(ALL)       ALL
3.使用sudo命令,去执行Linux命令,解决权限不足
[tom@localhost ~]$ ls /root
ls: cannot open directory /root: Permission denied
[tom@localhost ~]$ sudo ls /root
[sudo] password for tom: 

anaconda-ks.cfg
4.sudo还提供了一个语法检测的命令 visudo
 

文件权限:
读取(vim)  查看(cat)   执行(xx.py   xx.sh)
通过解释器执行  ./xx.sh    或者  source  xx.sh    或者   . xx.sh  
文件夹的权限:
新增  修改  删除   进入目录

Linux软链接创建注意用绝对路径
ln -s 目标文件绝对路径  软链接绝对路径



tar命令,参数
-x 解压
-v 显示压缩解压过程
-f 指定压缩文件
-z 指定调用gzip命令
-c 压缩当前目录的所有内容:
-r 添加文件到已有的压缩文件中
tar -rf alltmp.tgz 新加的文件名

压缩当前目录的所有内容:
tar -cf alltmp.tgz ./*
tar -cf alltmp.tgz *
tar -cf alltmp.tar *

tar -zcf alltmp.tar.gz *


解压到当前目录
tar -xf alltmp.tgz 

查看命令帮助:
tar --help
man tar
linum 中文手册


进程查看
ps -ef 查看所有进程的状态
ps -ef | grep python

网络端口管理命令
netstat -tunlp | grep 8000

kill命令 杀死进程
kill pid    (pid通过ps -ef 查看)

一次性杀死多个匹配的进程,一个是pkill,一个是killall, 
如果没有killall就安装一下 yum install psmisc -y
killall python

查看磁盘空间
df -h

Linux的dns服务相关
1.dns服务指定配置文件,这个文件,告诉Linux去那解析dns域名,
有主备两个dns服务器ip地址
[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
domain www.tendawifi.com
search www.tendawifi.com
nameserver 192.168.0.1
[root@localhost ~]# 

2.Linux解析dns的命令
nslookup www.baidu.com #解析到这个域名对应的ip地址

3.Linux强制dns,或者本地dns域名解析
vim /etc/hosts
ip 自定义的域名

4.域名解析的流程,(一个域名从浏览器访问,解析过程是如何的)
    1.浏览器输入域名,浏览器首先会去当前机器的本地dns缓存中查找记录
    2.去hosts文件中查找是否写死了对应的记录
    3.去指定的dns服务器中寻找dns记录,如果找到了域名解析记录后
    4.将这个dns记录缓存到本机的缓存记录中
    5.下一次寻找域名,就去缓存中找

Linux的计划任务,也叫做定时任务,名字是crond
1.查看Linux本机的定时任务
crontab -l  #查看计划任务
2.编写自己的计划任务
crontab -e #编辑计划任务
分时日月周  命令绝对路径
* * * * * /user/bin/echo "666" >> /tmp/ceshi.txt

Linux系统服务管理命令
系统服务(Linux安装的软件名)
只有通过yum安装的软件才可以使用这个命令
systemctl 这是centos7系列的命令
service 这是centos6系统的服务管理命令

查看网络状态
systemctl status network

查看发行版
cat /etc/os-release 
Linux常用命令
pip3是管理python模块的工具,自动解决模块依赖
pip3 list
pip3 install flask 默认是去python官方下载,网速很慢
更改pip下载的源,加速下载,使用离咱们近的豆瓣源,163源或者清华源
pip3 install -i https://pypi.douban.com/simple flask


Linux安装软件包
rpm手动安装
yum工具自动化安装    效果等同于 pip3

1.理解yum源(阿里云的yum源  epel额外仓库)
yum源仓库的位置:cd /etc/yum.repos.d/,并且只能读出第一层的repo文件
yum仓库的文件都是以.repo结尾的

2.下载阿里云的.repo仓库文件,放到/etc/yum.repos.d/
    第一步:备份原本的仓库文件
    cd /etc/yum.repos.d/
    mkdir allbak
    mv * allbak
    
    1.下载第一个阿里云仓库文件
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
         -O 参数,指定一个下载地址,且改名
    2.配置第二个仓库文件 epel 额外仓库(redis,nginx,mongo,ipython)
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
    
    3.清空原本yum缓存
    yum clean all
    4.生成新的阿里云的yum缓存,加速下载预热数据(此步骤非必须)
    yum makecache


代码:    
1.cd /etc/yum.repos.d/
2.mkdir allbak
3.mv * allbak
4.wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
5.wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
6.yum clean all
7.yum makecache


yum安装nginx:
1.yum install nginx -y
2.systemctl start/restart/stop nginx
3.netstat -tunlp | grep 80 查看端口,过滤80端口的信息
4.iptables -F (清空防火墙规则) 
5.客户端:192.168.0.101:80 访问

/usr/share/nginx/html/index.html
yum remove nginx
配置yum源安装软件
virtualenv 是python解释器的分身
它是基于物理解释器,进行一个解释器分身,这个分身,可以用于运行各种python开发环境,
并且创建简单,删除销毁也简单,解决环境依赖灾难。
1.安装虚拟环境
pip3 install -i https://pypi.douban.com/simple virtualenv
2.通过virtualenv创建虚拟环境
mkdir /opt/allenv   #建立统一管理目录
cd /opt/allenv  #进入统一管理目录
virtualenv --no-site-packages --python=python3  venv1 #建立虚拟环境venv1
--no-site-packages 创建一个干净隔离的python环境
--python=python3 基于python3创建虚拟环境
venv1 虚拟环境文件夹的名字,自己定义
3.激活虚拟环境
cd /opt/allenv
通过source命令,读取激活脚本,激活虚拟环境
source /opt/allenv/venv1/bin/activate
4.激活虚拟环境后,检查以下几个步骤,是否正确激活
which pip3
which python3
5.检查虚拟环境是否干净隔离
pip3 list
6.退出虚拟环境的命令
deactivate



[root@localhost ~]# pip3 install -i https://pypi.douban.com/simple virtualenv
[root@localhost ~]# cd /opt
[root@localhost opt]# mkdir allenv
[root@localhost opt]# cd allenv
[root@localhost allenv]# virtualenv --no-site-packages --python=python3  venv1
Running virtualenv with interpreter /opt/python36/bin/python3
Already using interpreter /opt/python36/bin/python3
Using base prefix '/opt/python36'
New python executable in /opt/allenv/venv1/bin/python3  # 这个就是虚拟环境venv1的python3解释器
Also creating executable in /opt/allenv/venv1/bin/python
Installing setuptools, pip, wheel...
done.
[root@localhost allenv]# 
[root@localhost allenv]# ls
venv1
[root@localhost allenv]# cd venv1
[root@localhost venv1]# ls
bin  include  lib
[root@localhost venv1]# cd bin
[root@localhost bin]# ls
activate      activate.fish  activate_this.py  easy_install      pip   pip3.6  python3    python-config
activate.csh  activate.ps1   activate.xsh      easy_install-3.6  pip3  python  python3.6  wheel
[root@localhost bin]# source activate
(venv1) [root@localhost bin]# 
(venv1) [root@localhost bin]# which pip3
/opt/allenv/venv1/bin/pip3
(venv1) [root@localhost bin]# 
(venv1) [root@localhost bin]# pip3 list
Package    Version
---------- -------
pip        19.2.3 
setuptools 41.2.0 
wheel      0.33.6 
(venv1) [root@localhost bin]# which python3
/opt/allenv/venv1/bin/python3
(venv1) [root@localhost bin]# 
(venv1) [root@localhost bin]# echo $PATH
/opt/allenv/venv1/bin:/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
(venv1) [root@localhost bin]# pip3 install -i https://pypi.douban.com/simple django==2.0


确保开发环境的一致性:

解决方案:
1.通过命令保证环境的一致性,导出当前python环境的包
pip3 freeze > requirements.txt   

这将会创建一个 requirements.txt 文件,其中包含了当前环境中所有包及 各自的版本的简单列表。
可以使用 “pip list”在不产生requirements文件的情况下, 查看已安装包的列表。

2.上传至服务器后,在服务器下创建virtualenv,在venv中导入项目所需的模块依赖
pip3 install -r requirements.txt
virtualenv
虚拟环境之virtualenvwrapper:
1.因为virtualenv工具使用并不方便
2.安装virtualenvwrapper
pip3 install virtualenvwrapper
3.设置Linux的环境变量,每次启动就加载virtualenvwrapper
    1.打开文件
    vim ~/.bashrc  (这个文件是用户个人配置文件)
    2.写入以下几行代码 (export和source一样都是读取Linux shell 变量的命令)
    export WORKON_HOME=~/Envs   #设置virtualenv的统一管理目录
    export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages'   #添加virtualenvwrapper的参数,生成干净隔绝的环境
    export VIRTUALENVWRAPPER_PYTHON=/opt/python36/bin/python3     #指定python解释器
    source /opt/python36/bin/virtualenvwrapper.sh #这一步才是真正使用工具的步骤,执行virtualenvwrapper安装脚本
    3.退出当前会话,重新登录Linux
    logout
    4.重新登录,查看是否可以使用virtalenvwrapper
    5.确保可以使用后,学习这个工具的命令
        1.创建新的虚拟环境 
        mkvirtualenv django201
        mkvirtualenv django115
        2.切换不同的虚拟环境
        workon django201
        workon django115
        3.退出虚拟环境
        deactivate
        4.删除虚拟环境
        rmvirtualenv django116
        5.进入虚拟环境的家目录(直接进入到 site-packages 目录中)
        cdsitepackages
        6.列举所有的环境。
        lsvirtualenv
        7.显示 site-packages 目录中的内容。
        lssitepackages
virtualenvwrapper
运行crm
1.准备代码
2.上传代码到Linux中
    方式1:lrzsz(只能传单个的文件,必须是压缩包)
        yum install lrzsz -y # 安装传输工具
        sz test.txt(下载 从Linux传给window)
        rz test.txt(上传)
    方式2:xftp
3.解压
unzip crm.zip
4.用之前建好的虚拟环境去运行 :
workon django201        
5.启动
python3 /opt/crm/manage.py runserver 0.0.0.0:9000



上面第四步也可以新建虚拟环境去运行 :
1.mkvirtualenv myblog
2.解决环境依赖,少什么装什么
  pip3 install -i https://pypi.douban.com/simple django==2.0
  pip3 install -i https://pypi.douban.com/simple pymysql
  pip3 install -i https://pypi.douban.com/simple django-multiselectfield   [multiselectfield模块]
3.安装Linux的mysql数据库
在centos7中,mysql叫mariadb  安装mariadb的服务端和客户端
yum install mariadb-server  mysql -y 
4.启动mariadb数据库
[root@localhost ~]# systemctl start mariadb
5.检查数据库是否正常(下面几种方式都可以)
ps -ef|grep mariadb
netstat -tunlp |grep 3306
systemctl status mariadb
6.看settings的配置,DATABASES,ALLOWED_HOSTS
7.建数据库,导入数据
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# mysql -uroot -p
MariaDB [(none)]> create database myblog;
MariaDB [(none)]> use myblog;
MariaDB [myblog]> source /opt/myblog.sql;
MariaDB [myblog]> show databases;

8.运行
python3 /opt/myblog/manage.py runserver 0.0.0.0:9000
运行crm
运行路飞学城
1.下载代码
路飞学城django代码
wget https://files.cnblogs.com/files/pyyu/luffy_boy.zip
vue代码
wget https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip
2.解压
unzip 07-luffy_project_01.zip  
unzip luffy_boy.zip
3.先从后端代码开始,进入后端代码文件夹
4.新建虚拟环境
mkvirtualenv luffy
5.解决所需的依赖模块,准备一个模块版本文件:requirements.txt 这个文件可以手动创建写入如下依赖
(luffy) [root@localhost opt]# cd /opt/luffy/luffy_boy
(luffy) [root@localhost luffy_boy]# touch requirements.txt
(luffy) [root@localhost luffy_boy]# vim requirements.txt 
##############################
certifi==2018.11.29
chardet==3.0.4
crypto==1.4.1
Django==2.1.4
django-redis==4.10.0
django-rest-framework==0.1.0
djangorestframework==3.9.0
idna==2.8
Naked==0.1.31
pycrypto==2.6.1
pytz==2018.7
PyYAML==3.13
redis==3.0.1
requests==2.21.0
shellescape==3.4.1
urllib3==1.24.1
uWSGI==2.0.17.1
##############################
(luffy) [root@localhost luffy_boy]# ls
api  db.sqlite3  keys  luffy_boy  manage.py  requirements.txt  static  templates
6.安装所需的依赖模块
(luffy) [root@localhost luffy_boy]# pip3 install -i https://pypi.douban.com/simple -r requirements.txt 
7.看一看
pip3 list
8.运行
python3 manage.py runserver 0.0.0.0:8000  (注意端口得是8000,因为前端的vue发的就是8000)


9.新开一个终端开始前端(要在服务器上,编译打包vue项目,必须得有node环境)
1.准备node环境
下载node二进制包,此包已经包含node,不需要再编译
[root@localhost ~]# cd /opt
[root@localhost opt]# wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz
2.解压缩
[root@localhost opt]# tar -zxvf node-v8.6.0-linux-x64.tar.gz
3.进入node文件夹
[root@localhost opt]# cd node-v8.6.0-linux-x64/
[root@localhost node-v8.6.0-linux-x64]# ls
bin  CHANGELOG.md  etc  include  lib  LICENSE  README.md  share
[root@localhost node-v8.6.0-linux-x64]# cd bin
[root@localhost bin]# ls
node  npm  npx
[root@localhost bin]# pwd

/opt/node-v8.6.0-linux-x64/bin
4.配置环境变量
[root@localhost bin]# vim /etc/profile
PATH="/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/node-v8.6.0-linux-x64/bin"
5.读取全局配置文件,加载node的环境变量
[root@localhost bin]# source /etc/profile   #就不需要退出重新加载了
[root@localhost bin]# echo $PATH
/opt/python36/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/node-v8.6.0-linux-x64/bin
[root@localhost bin]# which node
/opt/node-v8.6.0-linux-x64/bin/node
6.检测node环境
[root@localhost bin]# node -v
v8.6.0
[root@localhost bin]# npm -v
5.3.0
[root@localhost bin]# 
【注意】进入vue代码包中,开始进行打包,注意修改vue的api请求接口地址!!
【注意】进入vue代码包中,开始进行打包,注意修改vue的api请求接口地址!!
【注意】进入vue代码包中,开始进行打包,注意修改vue的api请求接口地址!!
7.修改src/restful/api.js中Axios的请求地址 ##里面的127.0.0.1都换成你后端服务器的id地址 192.168.0.101
[root@localhost ~]# sed -i "s/127.0.0.1/192.168.0.101/g" /opt/luffy/07-luffy_project_01/src/restful/api.js  ##全局替换命令
8.进入vue目录(安装vue模块,默认去装package.json的模块内容,如果出现模块安装失败,手动再装)
[root@localhost bin]# cd /opt/luffy/07-luffy_project_01/
[root@localhost 07-luffy_project_01]# ls
build  config  index.html  package.json  package-lock.json  README.md  src  static
[root@localhost 07-luffy_project_01]# npm install
[root@localhost 07-luffy_project_01]# ls     #增加了node_modules
build  config  index.html  node_modules  package.json  package-lock.json  README.md  src  static  
9.打包vue项目,生成一个dist静态文件夹
[root@localhost 07-luffy_project_01]# npm run build
10.检查dist文件夹
[root@localhost 07-luffy_project_01]# ls
build  config  dist  index.html  node_modules  package.json  package-lock.json  README.md  src  static  #增加了dist
[root@localhost 07-luffy_project_01]# ls dist
index.html  static
11.只需要将vue的静态文件,发布到web我放弃,访问web服务器即可。
12.安装配置nginx web服务器,访问到vue的静态文件
[root@localhost ~]# yum install nginx -y
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# netstat -tunlp|grep nginx
[root@localhost ~]# find / -name index.html   # 192.168.0.101  看到的就是这个页面/usr/share/nginx/html/index.html
[root@localhost ~]# vim /etc/nginx/nginx.conf
###################
server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /opt/luffy/07-luffy_project_01/dist;   ##更改这的路径
        #root这个参数代表定义网页根目录,只要访问Nginx,Nginx就去这个根目录下寻找一个index.html的文件
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
###################
12.重启nginx服务才能生效
[root@localhost ~]# systemctl restart nginx
13.添加课程数据是存放到redis中的,需要安装redis
yum install redis -y
14.启动redis
[root@localhost ~]# systemctl start redis
[root@localhost ~]# netstat -tunlp |grep 6379
[root@localhost ~]# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> FLUSHDB  #手动清除数据
OK
127.0.0.1:6379> keys *
15.测试
http://192.168.0.101
运行luffy
#编辑:
vim /etc/bashrc 
#最下面添加:
export PS1="[[e[34;1m]u@[e[0m][e[32;1m]H[e[0m][e[31;1m] w[e[0m]]\$ "
#生效:
source /etc/bashrc
PS1设置样式

crm项目部署

激活虚拟python环境

#创建基于python3的虚拟解释器环境venv
virtualenv --no-site-packages --python=python3 venv
#激活python3虚拟环境
[root@yugo /data 11:11:30]#source venv/bin/activate
(venv) [root@yugo /data 11:11:35]#

安装uwsgi

(venv) [root@yugo /data 11:13:23]#pip3 install uwsgi

配置启动uwsgi.ini,启动uwsgi时候,用这个配置文件启动

(venv) [root@yugo /data 11:14:25]#cat uwsgi.ini
[uwsgi]
#使用nginx连接时使用
socket=0.0.0.0:8000
#不用nginx直接当做web服务器使用
#http=0.0.0.0:9000
#项目目录绝对路径
chdir=/data/Ace_crm
#wsgi文件路径,在项目底下
wsgi-file=Ace_crm/wsgi.py #指定解释器目录 home=/data/venv processes=4 threads=2 master=True pidfile=uwsgi.pid daemonize=uwsgi.log

配置nginx

配置nginx.conf,通过nginx反向代理将请求丢给django处理

(venv) [root@yugo /data 11:20:32]#cat /opt/nginx1-12/conf/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;
    keepalive_timeout  65;
    #定义负载均衡池,名字叫做django,池子中写入uwsgi发布django的socket地址
    upstream django {
    server 0.0.0.0:8000;
}
    server {
        listen       80;
        server_name  pythonav.cn;
        #访问nginx的根路径时,转发请求给uwsgi的8000端口,这里要和uwsgi.ini写的一致
        location / {
        include  /opt/nginx1-12/conf/uwsgi_params;
     #请求转发给upstream地址池里的uwsgi程序 uwsgi_pass
django; } location /static/ { alias /opt/nginx1-12/html/static/; } } }

热加载nginx服务,读取nginx.conf内容

(venv) [root@yugo /data 11:24:24]#/opt/nginx1-12/sbin/nginx -t
nginx: the configuration file /opt/nginx1-12/conf/nginx.conf syntax is ok
nginx: configuration file /opt/nginx1-12/conf/nginx.conf test is successful
(venv) [root@yugo /data 11:26:07]#/opt/nginx1-12/sbin/nginx -s reload

启动uwsgi,启动django

(venv) [root@yugo /data 11:26:54]#uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
(venv) [root@yugo /data 11:27:10]#ps -ef|grep uwsgi
root     15540     1  0 11:27 ?        00:00:00 uwsgi uwsgi.ini
root     15543 15540  0 11:27 ?        00:00:00 uwsgi uwsgi.ini
root     15544 15540  0 11:27 ?        00:00:00 uwsgi uwsgi.ini
root     15545 15540  0 11:27 ?        00:00:00 uwsgi uwsgi.ini
root     15546 15540  0 11:27 ?        00:00:00 uwsgi uwsgi.ini
root     15590 11958  0 11:27 pts/0    00:00:00 grep --color=auto uwsgi

#如果需要停止uwsgi可以使用ps -ef|grep uwsgi,找到pid杀掉
#更好的一个杀掉uwsgi的方式
killall -9 uwsgi

访问nginx的80端口,查看是否请求转发给django

http://pythonav.cn/login/
或者10.0.0.10/login

配置nginx的静态资源

为什么要配置静态资源?

配置静态资源目录是因为让静态资源通过nginx可以直接返回,不需要通过uwsgi,也就是让uwsgi只处理后端逻辑,不处理静态资源,优化性能

配置静态资源,django和nginx

#创建静态资源存放目录
[root@yugo /opt/nginx1-12/html 11:39:51]#mkdir -vp /opt/nginx1-12/html/static
mkdir: created directory ‘/opt/nginx1-12/html/static
#给目录添加权限
[root@yugo /opt/nginx1-12/html 11:40:57]#chmod  755 /opt/nginx1-12/html/static/

配置django的settings.py

DEBUG = False
ALLOWED_HOSTS = ['*']

# Static files (CSS, JavaScript, Images) # https:
//docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT= '/opt/nginx1-12/html/static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]

分割线--

收集django静态文件

python3 manage.py collectstatic
这一句话就会把以前放在app下static中的静态文件全部拷贝到 settings.py 中设置的 STATIC_ROOT 文件夹中

然后请求静态资源就会去nginx配置的 location /static {alias /opt/nginx1-12/html/static/ } 寻找

以上步骤完成后,访问服务器主机地址和端口,如果nginx.conf中配置的为80端口,则地址栏不需要输入端口,因为浏览器请求端口也是默认为80端口,非80端口的需要自己在ip后面添加

luffy项目部署(vue+uwsgi+nginx)

  • 路飞学城django代码:https://files.cnblogs.com/files/pyyu/luffy_boy.zip
  • vue代码:https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip

一、将代码搞到服务器上

在linux上直接下载
wget https://files.cnblogs.com/files/pyyu/luffy_boy.zip
wget https://files.cnblogs.com/files/pyyu/07-luffy_project_01.zip
在window上下载,通过lrzsz,或者xftp传输到linux服务器上

二、先从前端vue搞起

要在服务器上,编译打包vue项目,必须得有node环境

下载node二进制包,此包已经包含node,不需要再编译
wget https://nodejs.org/download/release/v8.6.0/node-v8.6.0-linux-x64.tar.gz
解压缩
tar -zxvf node-v8.6.0-linux-x64.tar.gz
进入node文件夹
[root@web02 opt]# cd node-v8.6.0-linux-x64/
[root@web02 node-v8.6.0-linux-x64]# ls
bin  CHANGELOG.md  etc  include  lib  LICENSE  README.md  share
[root@web02 node-v8.6.0-linux-x64]# ls bin
node  npm  npx
[root@web02 node-v8.6.0-linux-x64]# ./bin/node -v
v8.6.0
[root@web02 node-v8.6.0-linux-x64]# ./bin/npm -v
5.3.0

将node命令,添加至linux环境变量,修改/etc/profile,写入

PATH=$PATH:/opt/node-v8.6.0-linux-x64/bin

读取文件,生效PATH

source /etc/profile

测试path

[root@web02 node-v8.6.0-linux-x64]# node -v
v8.6.0
[root@web02 node-v8.6.0-linux-x64]# npm -v
5.3.0

node环境有了,安装node模块,以及打包node项目

进入vue源码目录
cd 07-luffy_project_01/
安装vue模块,默认去装package.json的模块内容,如果出现模块安装失败,手动再装
npm install 

此时注意,你本地写的vue代码,接口很可能连接的服务器地址有问题,注意Axios.POST提交的地址,一定得发送给django应用(如果用了nginx,就发送给nginx的入口端口)
超哥这里为了试验方便,将vue项目和django项目放在了一台服务器,通过nginx反向代理功能(8000端口),转发vue请求给django(9000)

准备编译打包vue项目,替换配置文件所有地址,改为服务器地址
sed -i 's/127.0.0.1/192.168.119.12/g' /opt/07-luffy_project_01/src/restful/api.js


确保vue的route模式是history
路径:opt/luffy/07-luffy_project_01/src/router/index.js

export default new Router({
linkActiveClass:'is-active',
mode: 'history',//改成history模式


此时打包vue项目,生成一个dist静态文件夹 npm run build
检查dist文件夹 [root@web02
07-luffy_project_01]# ls dist/ index.html static

至此vue代码就结束了,只需要让nginx配置,找到vue的index.html首页文件即可

nginx这里不做解释,编译安装好即可

server {
     #用户访问域名或者ip,默认是nginx的80端口
listen
80; server_name 192.168.119.12;
     #url匹配 / 也就是请求地址是192.168.119.12时,进入此location,返回vue的dist下index.html路飞学城首页 location
/ { root /opt/07-luffy_project_01/dist; index index.html; } }

三、配置后端代码,解决虚拟环境,保证项目干净隔离

激活虚拟环境venv1,在虚拟环境下,安装路飞项目所需的依赖模块

[root@web02 opt]# cat requirements.txt
certifi==2018.11.29
chardet==3.0.4
crypto==1.4.1
Django==2.1.4
django-redis==4.10.0
django-rest-framework==0.1.0
djangorestframework==3.9.0
idna==2.8
Naked==0.1.31
pycrypto==2.6.1
pytz==2018.7
PyYAML==3.13
redis==3.0.1
requests==2.21.0
shellescape==3.4.1
urllib3==1.24.1
uWSGI==2.0.17.1

这个路飞代码数据库用的是sqllite,不需要配置数据库了

购物车用都的是redis,因此要启动服务器的redis-server服务端

redis-server /etc/redis.conf

ps -ef|grep redis
redis-server *:6379

通过uwsgi启动路飞项目

[uwsgi]
# Django-related settings
# the base directory (full path)
chdir           = /opt/luffy_boy
# Django's wsgi file
module          = luffy_boy.wsgi
# the virtualenv (full path)
home            = /opt/venv1
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# the socket (use the full path to be safe
socket          = 0.0.0.0:9000
# clear environment on exit
vacuum          = true
#后台运行uwsgi
daemonize=yes
(venv1) [root@web02 opt]# uwsgi --ini luffy_boy/uwsgi.ini

四、配置nginx,此步重要

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  192.168.119.12;
        location / {
        root /opt/07-luffy_project_01/dist;
        index index.html;
    #这一条参数确保vue页面刷新时候,不会出现404页面
      try_files $uri $uri/ /index.html; } error_page
500 502 503 504 /50x.html; location = /50x.html { root html; } } server { listen 8000; server_name 192.168.119.12; location / { uwsgi_pass 0.0.0.0:9000; include /opt/nginx/conf/uwsgi_params; } location /static { alias /opt/static; } } }

原理图

项目访问 

测试账号密码

alex
alex3714

目前代码功能演示,演示流程:

  1. 登录alex账号
  2. 选择免费课程,django框架学习
  3. 添加课程到购物车,检查alex账号的购物车记录,添加成功后再redis有数据

docker部署路飞学城blog

部署需求分析:

复制代码
之前是将nginx、django、vue直接部署在服务器上,既然学了docker,试试怎么部署在docker中
1.环境准备   一台linux服务器 centos7   安装好docker systemctl start docker   vue代码   django后端代码 3.注意修改vue提交axaj请求的地址 修改vue接口代码文件/opt/07-luffy_project_01/src/restful/api.js vue.js需要发送请求给django后端接口,改成容器的ip地址 sed -i "s/127.0.0.1/172.17.0.3/g" /opt/07-luffy_project_01/src/restful/api.js 然后重新打包vue的静态文件,生成dist目录,提供给nginx
复制代码

第一步,准备nginx的运行容器

nginx容器构建目录如下

复制代码
nginx_docker  一级目录
    ├── CentOS-Base.repo  用于修改容器的yum源
    ├── dist         将本地的dist文件夹拷贝到容器内
    ├── Dockerfile      用于构建镜像
    ├── epel.repo      用于修改容器的yum源
    └── nginx.conf      将本地的nginx.conf配置文件,拷贝到容器内,生效nginx配置
复制代码

配置文件如下:

cat Dockerfile 内容如下
复制代码
[root@web02 nginx_docker]# cat Dockerfile
FROM centos
MAINTAINER yugo
ADD CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo
ADD epel.repo /etc/yum.repos.d/epel.repo
RUN yum clean all
RUN yum install nginx -y
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist /opt/dist
EXPOSE 80
ENTRYPOINT nginx -g "daemon off;"
复制代码

cat nginx.conf内容如下

复制代码
[root@web02 nginx_docker]# cat nginx.conf
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  luffy_nginx.cn;
        location / {
        root /opt/dist;
        index index.html;
        }
        }
server {
listen       8000;
        server_name  luffy_nginx.cn;
        location / {
    uwsgi_pass luffy_backend.cn:9000;
    include uwsgi_params;
        }
}
}
复制代码

构建nginx镜像

docker build -t luffy_nginx .

运行nginx镜像,产生容器实例

docker run -d -p80:80  luffy_nginx

查看产生容器的ip地址信息,进行dnsmasq域名解析

 docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器id

通过windows/Macos访问linux的ip地址,查看容器端口映射结果

此时已经配置好了nginx反向代理与vue的静态文件,开始配置后端代码!!!!

第二步、配置django后端容器

原文地址:https://www.cnblogs.com/bubu99/p/11594570.html