项目部署

项目部署

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访问,可将[email protected]替换成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文件夹访问权限
      
      
          Order allow,deny
          Allow from all
      
      = 2.4>
          Require all granted
      
      
      
    • 重启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
      
          Require all granted
      
      
      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
      
      
      
      Require all granted
      
      
      
      • WSGIScriptAlias <通过什么url可以访问你的django服务,一般设置为根目录/>
      • WSGIPythonHome <你的python虚拟环境所在目录>
      • WSGIPythonPath <你的django项目根目录>
      • 标签内的路径是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
        
        
        
        Require all granted
        
        
        
        Alias /static/ /usr/local/www/djangoProject/dist/static/
        
        
        Require all granted
        
        
        • 注意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
      

你可能感兴趣的:(项目部署)