使用樱花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>
您可以以相同的方式使用共享的静态文件。