使用樱花VPS,从CentOS7的配置到Django的部署

当我尝试使用Django创建网站时,遇到了一些困难,尤其是在部署和静态文件(CSS/js)的反映方面。但是,很难找到一个集中的信息源。

我整理了在CentOS7上设置〜部署Django教程网站并使静态文件生效的步骤。

※ 假设您已经完成了在Django教程网站上创建的示例应用程序(投票应用程序),因此在进行本教程之前请确保您已经掌握了相关技能。
※ 由于我平时并不是一个专职网页开发人员,所以如果有任何问题或者错误,请您指正。

环境

    • MacOS X 10.11.6

 

    • CentOS 7 (さくらVPS)

 

    • Apache 2.4.6

 

    • Python 3.6

 

    Django 2.0

CentOS的設置

基本设置参考了CentOS7.x基本设置备忘录。

    作業用ユーザの作成
[root@hogehoge ~]# useradd username
[root@hogehoge ~]# passwd username
    作成したユーザをwheelグループに追加し、sudoコマンドを許可
[root@hogehoge ~]# usermod -G wheel username
[root@hogehoge ~]# visudo
## Same thing without a password
# %wheel  ALL=(ALL)       NOPASSWD: ALL
ここの行の#を外す

[root@hogehoge ~]# vi /etc/pam.d/su
#auth           required       pam_wheel.so use_uid
ここの行の#を外す

使用创建的username用户登录,并使其能够使用sudo su命令等。

    sshの設定

先创建一个目录。

[username@hogehoge ~]$ mkdir /home/username/.ssh
[username@hogehoge ~]$ chmod 700 /home/username/.ssh

在Mac上创建了一个密钥。本次选择指定为/Users/username/.ssh/id_rsa_django。

$ ssh-keygen -C 'for_django'
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa): /Users/username/.ssh/id_rsa_django
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
...

VPSに公開鍵持って行く
$ scp ~/.ssh/id_rsa_django.pub username@[VPSのIPアドレス]:/home/username/.ssh

在VPS上设置公钥。

[username@hogehoge ~]$ cd /home/username/.ssh
[username@hogehoge .ssh]$ cat id_rsa_django.pub >>  authorized_keys
[username@hogehoge .ssh]$ chmod 600 authorized_keys

在Mac上可以进行SSH连接。
(如果在/Users/username/.ssh/config中预先进行设置,SSH连接会更加方便。)

$ ssh -i id_rsa_django username@[VPSのIPアドレス]

顺便说一下,在这个时候,如果在服务器设置上遇到了问题,我会多次重新安装CentOS7来解决。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
...略

似乎出现了这种错误。通过ssh-keygen -R 123.456.789.33(主机IP)来解决。参考:在SSH连接时遇到“WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”并被拒绝连接。

    sshdの設定
[username@hogehoge ~]$ sudo vi /etc/ssh/sshd_config

# 以下変更点
# ポート番号を変更
Port 22(任意の数字)
# rootログイン不可
PermitRootLogin no
# pass無し不許可
PermitEmptyPasswords no
# 鍵認証許可
PubkeyAuthentication yes
# pass認証不可
PasswordAuthentication no

# 設定を反映
[username@hogehoge ~]$ sudo systemctl restart sshd.service

    firewallの設定変更

防火墙的启动和自动启动设置

[root@hogehoge ~]# systemctl start firewalld.service
[root@hogehoge ~]# systemctl enable firewalld
[root@hogehoge ~]# systemctl status firewalld

允许通过http、https和ssh进行外部访问。

[root@hogehoge ~]# firewall-cmd --permanent --add-service=http
[root@hogehoge ~]# firewall-cmd --permanent --add-service=https
[root@hogehoge ~]# firewall-cmd --permanent --add-port=1234(任意のポート番号)/tcp
[root@hogehoge ~]# systemctl restart firewalld

如果要启用SELinux,则还需要进行额外的设置。
参考链接:如何在CentOS7上更改sshd的端口号。

虽然基础,但是暂时的服务器设置大致如下。

在CentOS上安装Python和Django。

    Python3とDjangoのインストール

我们将在CentOS上安装Python。我们假设您要使用Python3.6。
→ 参考:使用yum在CentOS7上安装Python3的步骤

[username@hogehoge ~]$ sudo yum install -y https://centos7.iuscommunity.org/ius-release.rpm
[username@hogehoge ~]$ sudo yum search python36
[username@hogehoge ~]$ sudo yum install python36u
    venv仮想環境作成
[username@hogehoge ~]$ python3.6 -m venv venv

# activate
[username@hogehoge ~]$ cd venv/bin
[username@hogehoge ~]$ . activate
(venv)[username@hogehoge ~]$
    Django2.0のインストール
(venv)[username@hogehoge ~]$ pip install Django==2.0

部署

在这里,我们将部署可以通过Django官方网站的教程创建的投票应用程序。

    必要なライブラリをインストール
[username@hogehoge ~]$ sudo yum install httpd-devel
[username@hogehoge ~]$ sudo yum install python36u-mod_wsgi

我认为在Django2.0的教程中,文件夹结构如下。

sample
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── polls
    ├── __init__.py
    ├── admin.py
    ├── apps.py
    ├── models.py
    ├── static
    ├── templates
    ├── tests.py
    ├── urls.py
    └── views.py

在settings.py文件的ALLOW_HOSTS中指定IP地址(使用*表示允许所有)。也可以使用要公开的网站的域名,如www.example.com等。

ALLOWED_HOSTS = ['*']

在VPS上创建一个名为django_sample的目录,并将sample目录放置在其中。这次我们将其上传到GitHub并使用git clone进行克隆。

[username@hogehoge ~]$ mkdir django_sample
[username@hogehoge ~]$ cd django_sample
[username@hogehoge django_sample]$ git clone https://github.com/userid/sample.git(仮)

# この様なディレクトリ構造になる。
username
├── django_sample
    └── sample
        ├── db.sqlite3
        .
        .
    DjangoのApache用の設定

请参考公式网站上关于如何使用Django与Apache和mod_wsgi一起的说明进行配置。首先创建/etc/httpd/conf.d/django.conf文件,内容如下:

WSGIScriptAlias / /home/username/django_sample/sample/mysite/wsgi.py
WSGIPythonPath /home/username/django_sample/sample:/home/username/venv/lib/python3.6/site-packages
<Directory /home/username/django_sample/sample/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIScriptAlias配置在URL根目录的设置是以斜线/开头的。
如果设置为/mysite,那么http://123.456.789.33(假设)/mysite/将成为根URL。

使用WSGIPythonPath指定应用程序的根目录和虚拟环境的库目录。

由于本次的应用程序放在用户目录中,所以需要编辑/etc/httpd/conf.d/userdir.conf文件。
→参考:在CentOS 7上安装Python3并运行Django。

<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    UserDir enable

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    #
    #UserDir public_html
</IfModule>

更改用户目录权限

[username@hogehoge ~]$ cd /home
[username@hogehoge home]$ sudo chmod 755 username

重新启动httpd。

[username@hogehoge ~]$ sudo service httpd restart

我认为通过访问该临时的根URL http://123.456.789.33,您可以确认其是否正常运作。

对DB的访问权限

需要更改对db.sqlite3数据库文件的权限,否则在访问admin页面等地方时会出现无法访问数据库文件的错误。

我试过各种方法,最终通过给予其他权限来解决了问题,但我认为这种做法并不是很好,所以如果有其他方法,请告诉我,我会非常感激。

[username@hogehoge ~]$ cd django_sample
[username@hogehoge django_sample]$ sudo chmod 757 sample
[username@hogehoge django_sample]$ cd sample
[username@hogehoge sample]$ sudo chmod 756 db.sqlite3
[username@hogehoge ~]$ sudo service httpd restart

静态文件的反映

此外,我认为还包括管理页面,可能没有应用CSS和JavaScript,因此需要从Apache或其他Web服务器配置文件发送静态文件。这可以通过使用manage.py collectstatic命令将静态文件收集到STATIC_ROOT,并配置Web服务器在STATIC_URL处公开STATIC_ROOT来完成配置。

我們將參考Django官方網站的文件分發方式來進行設定。首先要編輯settings.py文件,將以下內容添加到文件的底部。

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

接下来,在/etc/httpd/conf.d/django.conf文件中添加以下内容。
这样,就能通过http://123.456.789.33(假设)/static/访问静态文件。

Alias /static/ /home/username/django_sample/sample/static/

<Directory /home/username/django_sample/sample/static>
Require all granted
</Directory>

将settings.py中的DEBUG设置为False。

DEBUG = False

完成上述设置后,使用collectstatic命令,static文件将被收集并在/home/django_sample/sample/static目录下反映出来。

(venv) [username@hogehoge sample]$ ./manage.py collectstatic
(venv) [username@hogehoge sample]$ sudo service httpd restart

我认为通过以上步骤,您可以验证教程中的投票应用程序是否正确反映了静态文件。

補充:當多個應用程序中存在共同的靜態文件時

如果在common文件夹下的static文件中,使用在polls/polls2/polls3应用程序中。

sample
├── db.sqlite3
├── manage.py
├── mysite
│   ├── __init__.py
│   ...
├── polls
├── polls2
├── polls3
└── common
    └── static
        ├── css
        ├── js
        ├── images

在settings.py文件中,您需要按照以下方式进行记录STATICFILES_DIRS。

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'common/static/'),
)
{% load static %}
<script src="{% static 'js/common.js' %}"></script>

您可以以相同的方式使用共享的静态文件。

广告
将在 10 秒后关闭
bannerAds