项目部署

项目部署

CentOS 7开机没有ip地址

  • 方法一:输入sudo dhclient获取ip

  • 方法二:修改配置文件vim /etc/sysconfig/network-scripts/ifcfg-ens33的ONBOOT=no为ONBOOT=yes

              然后service network restart即可,这样每次重启都会自动获取ip
    

1.MySQL部署

1.1 下载MySQL官方yum仓库

wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm

1.2 安装仓库

yum -y install mysql57-community-release-el7-10.noarch.rpm

1.3 安装MySQL服务器

yum -y install mysql-community-server

1.4 启动MySQL服务器

systemctl start  mysqld.service
  • 查看MySQL服务器运行状态

    systemctl status mysqld.service
    
  • 让MySQL开机自启

    systemctl enable mysqld.service
    

1.5 查看MySQL初始随机密码

sudo grep "password" /var/log/mysqld.log
oszHsM/k=53B

1.6 输入初始随机密码登录MySQL

mysql -uroot -p
  • 此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库

1.7 修改初始密码

ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';
  • 初次设置密码时由于密码等级是MEDIUM,所以需要设置的密码复杂一些,若想修改密码等级,可先设置好密码后,通过以下步骤进行

  • 输入以下SQL语句查看密码等级

    SHOW VARIABLES LIKE 'validate_password%';
    
  • 设置密码等级为LOW

    SET global validate_password_policy=LOW;
    

1.8 开启MySQL的远程访问

grant all privileges on *.* to 'root'@'192.168.0.1' identified by 'password' with grant option;
  • 若要开启所有ip访问,可将root@192.168.0.1替换成root@%

  • 更改远程访问用户的密码

    SET PASSWORD FOR root@'%'=PASSWORD('newpassword');
    
  • 开启远程访问权限后就可以在win10上用数据库管理软件进行可视化操控数据库,很方便

1.9 刷新特权

flush privileges; 
exit

1.10 开放3306端口给其他主机访问数据库

sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent

sudo firewall-cmd --reload

1.11 修改mysql的默认编码为utf8

  1. 编辑mysql配置文件

    sudo vim /etc/my.cnf
    
  2. 在开头加上如下内容

    [client]
    default-character-set=utf8
    
  3. socket=/var/lib/mysql/mysql.sock的下一行加上以下内容

    character-set-server=utf8
    collation-server=utf8_general_ci
    
  4. 重启mysql服务

    service mysqld restart
    
    • 可在进入mysql后输入status查看编码是否更改成功

2.配置虚拟环境(virtualenvwrapper)

2.1 安装virtualenvwrapper

# 更换软件源
# 阿里源 pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
# 豆瓣源 pip3 config set global.index-url https://pypi.douban.com/simple/

sudo pip install virtualenvwrapper

2.2 创建虚拟环境的保存目录

mkdir $HOME/.virtualenvs

2.3 修改配置shell配置文件

export WORKON_HOME=$HOME/.virtualenvs
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/bin/virtualenvwrapper.sh
source ~/.bashrc
  • 如果这时出现了这个错误

    -bash: /usr/local/bin/virtualenvwrapper.sh: No such file or directory

    则说明找不到virtualenvwrapper.sh脚本,可以通过which命令查看脚本所在路径,然后替换到配置文件第三行的source处

    which virtualenvwrapper.sh
    --> /usr/local/bin/virtualenvwrapper.sh
    
    export WORKON_HOME=$HOME/.virtualenvs
    VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
    source /usr/local/bin/virtualenvwrapper.sh
    
  • 修改完后再重新source一下即可

    source ~/.bashrc
    

2.4 创建python虚拟环境

  1. 先确定要使用的python版本的可执行程序所在路径

    which python3
    --> /usr/bin/python3
    
  2. 然后创建虚拟环境

    mkvirtualenv -p /usr/bin/python3 虚拟环境名
    
  3. 激活虚拟环境

    workon 虚拟环境名
    
  4. 退出虚拟环境

    deactivate
    
  5. 虚拟环境中安装依赖包

    pip install -r requirements.txt
    
    • requirements.txt文件是通过在开发环境中的命令:pip freeze > requirements.txt得到的在开发环境中所用到的依赖包,生成的文件名可以自定义,不一定要用requirements.txt

3.Django修改数据库为MySQL

3.1 修改settings.py的数据库引擎

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

3.2 创建数据库

CREATE DATABASE mydatabase
  • mydatabase换成自己设定的数据库名

3.3 安装python的mysql模块

pip install mysqlclient
  • 如果出现mysql_config未找到命令报错,则先安装相应的依赖库

    yum install mysql-devel gcc gcc-devel python-devel
    
  • 再安装mysqlclient即可


4. 配置apache + mod-wsgi

4.1 安装apache

yum install httpd httpd-devel

4.2 安装mod-wsgi并部署django


4.2.1 源码方式安装与部署

  1. 下载源码

    # 源码发布页
    https://github.com/GrahamDumpleton/mod_wsgi/releases
    
    # 本wiki编写时的最新mod-wsgi下载链接
    https://github.91chifun.workers.dev/https://github.com//GrahamDumpleton/mod_wsgi/archive/refs/tags/4.7.1.tar.gz
    
    # 下载方式
    wget url
    
  2. 解压

    tar xvfz mod_wsgi-X.Y.tar.gz
    
  3. configure

    ./configure --with-python=/usr/local/bin/python
    
    • 建议用--with-python指定要使用的python版本,一旦configure确认python版本后,之后使用mod-wsgi就要使用相应的python或相应的虚拟环境,不能切换为别的python版本,如需要切换,就要重新编译安装mod-wsgi指定不同的python版本
  4. make && make install

  5. 先用官网示例的一个简单wsgi案例看看能不能正常运行mod-wsgi

    # 把这行加到httpd.conf最后一行
    LoadModule wsgi_module modules/mod_wsgi.so
    
    • 新建一个目录存放示例wsgi文件

      # 假设在/usr/mysite下存放wsgi文件
      sudo mkdir /usr/mysite
      cd /usr/mysite
      vim mysite.wsgi
      
      #! /usr/mysite/mysite.wsgi
      
      def application(environ, start_response):
          status = '200 OK'
          output = b'Hello World!'
      
          response_headers = [('Content-type', 'text/plain'),
                              ('Content-Length', str(len(output)))]
          start_response(status, response_headers)
      
          return [output]
      
    • 修改httpd.conf,将wsgi文件挂载到网站中

      #! /etc/httpd/conf/httpd.conf
      
      WSGIScriptAlias /mysite /usr/mysite/mysite.wsgi
      # 第一个参数/mysite是浏览器访问wsgi服务器时的url -- 第二个参数是wsgi文件所在位置
      
      # 给mysite文件夹访问权限
      <Directory /usr/mysite>
      <IfVersion < 2.4>
          Order allow,deny
          Allow from all
      </IfVersion>
      <IfVersion >= 2.4>
          Require all granted
      </IfVersion>
      </Directory>
      
    • 重启apache服务器,浏览器访问即可

      apachectl restart
      
    • 如果mod-wsgi安装正确并且可以运行,那浏览器会出现Hello World!

    • 如果遇到Forbiden,请检查mysite的文件所属用户和用户组是否与apache运行时的用户一致,不一致就会导致无法访问

      # 查看apache运行用户
      ps -ef | grep apache
      
      # 查看mysite所属用户和用户组
      ls -l /usr
      # 或
      ll /usr
      
    • 如果遇到Internal Server Error,可以查看apache错误日志文件

      sudo tail -f /var/log/httpd/error_log
      # -f参数是让tail命令循环运行,当文件内容变化时,就会自动运行tail命令查看末尾10行日志信息,调试的时候用该命令很方便
      
      • 这里我遇到的问题是fopen()错误,就是apache无法打开我的wsgi文件,我已经确保文件所属用户与apache运行用户一致,甚至直接把wsgi文件和父目录都设置成了777权限依然无效,后来查到原因是CentOS 7默认是开启了SELinux的,只需要把SELinux的运行模式改为Permissive即可

        sudo vim /etc/selinux/config
        
        #! /etc/selinux/config
        
        # 将SELINUX = enforcing改为SELINUX = permissive
        SELINUX = permissive
        
        • 改完后需要重启CentOS
    • 为了方便对不同app使用不同的配置来挂载网站,可以在apache安装目录下创建一个conf_available(文件名随意,自己能认出来是干嘛用的就行)

      sudo mkdir /etc/httpd/conf_available
      

      然后把刚刚配置mysite的写在httpd.conf中的文件内容删除,在conf_available中创建一个mysite.conf,内容就是刚刚删除的那些,再把这个mysite.conf硬链接到/etc/httpd/conf.d目录下即可

      #! /etc/httpd/conf_available/mysite.conf
      
      LoadModule wsgi_module modules/mod_wsgi.so
      
      WSGIScriptAlias /mysite /opt/mysite.wsgi
      
      DocumentRoot /opt
      <Directory /opt>
          Require all granted
      </Directory>
      
      sudo ln /etc/httpd/conf_available/mysite.conf /etc/httpd/conf.d
      

      这样做的好处是以后想要配置多个django项目时,如果某个项目不想配置,想清除掉相应配置时,不需要到httpd.conf中找到相应的配置项删除了,直接把创建在conf.d的硬链接删除即可,需要添加新配置时,在conf_available中创建,然后硬链接到conf.d目录下,就像热插拔硬件一样,即插即用

  6. 部署django

    1. 在conf_available中创建django.conf配置文件

      cd /etc/httpd/conf_available
      sudo vim django.conf
      
      #! /etc/httpd/conf_available/django.conf
      
      LoadModule wsgi_module modules/mod_wsgi.so
      
      WSGIScriptAlias / /usr/local/www/djangoProject/djangoProject/wsgi.py
      WSGIPythonHome /home/plasticine/.virtualenvs/booking
      WSGIPythonPath /usr/local/www/djangoProject
      
      <Directory /usr/local/www/djangoProject/djangoProject>
      <Files wsgi.py>
      Require all granted
      </Files>
      </Directory>
      
      • WSGIScriptAlias <通过什么url可以访问你的django服务,一般设置为根目录/> <django的wsgi.py文件路径>
      • WSGIPythonHome <你的python虚拟环境所在目录>
      • WSGIPythonPath <你的django项目根目录>
      • <Directory>标签内的路径是wsgi.py所在路径(不包括wsgi.py文件本身)
    2. 创建硬链接到conf.d目录下

      sudo ln /etc/httpd/conf_available/django.conf /etc/httpd/conf.d/
      
    3. 重启apache服务器

      apachectl restart
      
      • 如果查看错误日志文件遇到Unable to stat Python home /home/plasticine/.virtualenvs/booking. Python interpreter may not be able to be initialized correctly.这种虚拟环境没有权限打开的问题,在django.conf配置文件中最顶部添加下面两行修改下apache的运行用户为虚拟环境所属相应用户,比如我的虚拟环境booking的所属用户是plasticine,那么就这样改

        User plasticine
        Group plasticine
        

        然后再重启apache即可,到此为止我的apache成功让django运行起来了

    4. 配置静态文件

      • 静态文件让apache处理,所以需要告诉apache,我的django项目的静态文件路径在哪里,首先切换到django的manage.py所在目录,收集静态资源文件

        python manage.py collectstatic
        
      • 收集静态文件之前记得现在settings.py中设置STATIC_ROOT,表示把静态文件保存在该目录下,这里我的静态资源路径是/usr/local/www/djangoProject/dist/static

      • 收集静态文件完毕之后修改django.conf,如下配置

        #! /etc/httpd/conf_available/django.conf
        
        User plasticine
        Group plasticine
        
        LoadModule wsgi_module modules/mod_wsgi.so
        
        WSGIScriptAlias / /usr/local/www/djangoProject/djangoProject/wsgi.py
        WSGIPythonHome /home/plasticine/.virtualenvs/booking
        WSGIPythonPath /usr/local/www/djangoProject
        
        <Directory /usr/local/www/djangoProject/djangoProject>
        <Files wsgi.py>
        Require all granted
        </Files>
        </Directory>
        
        Alias /static/ /usr/local/www/djangoProject/dist/static/
        
        <Directory /usr/local/www/djangoProject/dist/static>
        Require all granted
        </Directory>
        
        • 注意static的url连接的目录需要是这样的

          Alias /static/ /usr/local/www/djangoProject/dist/static/
          

          最后的斜杠不能丢!不能写成

          Alias /static/ /usr/local/www/djangoProject/dist/static
          
  - 为了正常使用预约服务,可以添加相应的url链接到相应的html,在django.conf中添加如下配置

    ```shell
    Alias /polls /usr/local/www/djangoProject/dist/static/polls.html
    Alias /data /usr/local/www/djangoProject/dist/static/data.html
    Alias /putcap /usr/local/www/djangoProject/dist/static/putcap.html
    ```

4.2.2 pip方式安装与部署(推荐,使用简单)

  1. 首先workon激活项目所使用的虚拟环境

    workon booking
    
  2. pip安装mod-wsgi

    pip3 install mod_wsgi
    
  3. 修改django的settings.py

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'mod_wsgi.server',   # 添加这一项
    )
    
  4. 收集静态资源文件

    python manage.py collectstatic
    
  5. 生成单独的一个apache服务器

    python manage.py runmodwsgi --setup-only --port=80 \
        --user plasticine --group plasticine \
        --server-root=/etc/mod_wsgi-express-80
    
    • --user和--group写你自己django项目所属用户即可
    • --server-root是生成的apache服务器保存的目录

    这里可能会提示没有mod_wsgi-express-80这个文件夹,可以先创建该文件夹,并修改权限为0777,方便待会python manage.py runmodwsgi命令将文件写入

    sudo mkdir /etc/mod_wsgi-express-80
    sudo chmod 0777 /etc/mod_wsgi-express-80
    
  1. 切换到server-root的目录运行apache

    cd /etc/mod_wsgi-express-80
    sudo ./apachectl start
    
    • 如果遇到80端口被占用,那可能是你有别的apache服务器正在运行,或者别的web服务器占用了,可以这样做

      sudo netstat -tnlp
      

      看看80端口正在被哪个进程使用

      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
      tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1470/master         
      tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      782/rpcbind         
      tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1171/sshd           
      tcp6       0      0 ::1:25                  :::*                    LISTEN      1470/master         
      tcp6       0      0 :::3306                 :::*                    LISTEN      1250/mysqld         
      tcp6       0      0 :::111                  :::*                    LISTEN      782/rpcbind         
      tcp6       0      0 :::80                   :::*                    LISTEN      18796/httpd (mod_ws 
      tcp6       0      0 :::22                   :::*                    LISTEN      1171/sshd
      

      这里可以看到,我的80端口已经有进程占用了,那可以用下面的命令指定PID杀死它

      sudo kill 18796
      
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容