在一台 win10 服务器上,需要搭建多个各不相干的 wiki 系统,用于不同小组访问。眼下最便捷的 wiki 系统,就是 dokuwiki 了,官方自带微型 apache 服务器、纯文本保存内容、无需数据库,直接运行就好了。
Dokuwiki的一个弱点是无法很好利用 Markdown 语法的便利性,因此又考虑在同一台服务器上搭建一个支持 Markdown 语法的 wiki。经了解,django-wiki 支持。
到 DokuWiki 的官方下载页面(https://download.dokuwiki.org),给 Include Web-Server
选项打钩,去掉 Languages
列表中除了中文之外的其他所有语言,Popular Plugins
选项中的内容,根据实际需求选择,然后点击 Download
即可。
将下载到本地的压缩包解压的合适位置(譬如 d:\Public\DokuWiki1
下),然后运行自带的 run.cmd
,访问 http://127.0.0.1:8800 ,看是否成功
利用上述步骤下载的压缩包,复制一份到另一目录(譬如 d:\Public\DokuWiki2
下),修改其中 server\conf
目录下的 httpd.conf 文件,将端口号改为 8802
,然后运行自带的 run.cmd
,访问 http://127.0.0.1:8802,看是否成功。
至此,两个 DokuWiki 已安装好。
安装 python 3.7
修改 pip 的镜像指向。新建 C:\Users\Administrator\pip\pip.ini
文件,并添加下述内容:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host=mirrors.aliyun.com
安装 django-wiki 模块。 打开 CMD 窗口,直接运行 pip install wiki
即可。若不想将相关模块全局安装,可利用 python -m venv venv
命令新建虚拟环境、激活之后,再运行 pip install
相关命令。
新建 django-wiki 项目。进入 d:\public
目录,运行 django-admin.exe startproject django-wiki
修改 django-wiki 的配置。修改 d:\public\django-wiki\django-wiki\settings.py
文件,首先改 INSTALLED_APPS
参数,添加如下模块:
'django.contrib.sites.apps.SitesConfig',
'django.contrib.humanize.apps.HumanizeConfig',
'django_nyt.apps.DjangoNytConfig',
'mptt',
'sekizai',
'sorl.thumbnail',
'wiki.apps.WikiConfig',
'wiki.plugins.attachments.apps.AttachmentsConfig',
'wiki.plugins.notifications.apps.NotificationsConfig',
'wiki.plugins.images.apps.ImagesConfig',
'wiki.plugins.macros.apps.MacrosConfig',
其次,修改 TEMPLATES
参数,在 context_processors
处,添加如下内容
'sekizai.context_processors.sekizai',
最后,添加如下内容在 settings.py
的末尾:
SITE_ID = 1
STATIC_ROOT = 'D:\Public\django-wiki\mywiki\static' #用于生产环境下存储静态文件
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
from django.urls import reverse_lazy
LOGIN_REDIRECT_URL = reverse_lazy('wiki:get', kwargs={'path': ''})
LANGUAGES = [
('en-us', 'English'),
('zh-hans', 'Chinese'),
]
创建数据库表格。进入 d:\public\django-wiki
目录,运行 python manage.py migrate
添加管理员。运行 python manage.py createsuperuser
,为网站创建一个管理员
修改项目 url 的处理规则。将新建项目自带的 urls.py 改为如下内容:
from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
path('notifications/', include('django_nyt.urls')),
path('', include('wiki.urls')),
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
至此,整个项目即可通过 python manage.py runserver 8001
命令,在http://127.0.0.1:8001
地址处看到效果
最后,我们利用专业的 wsgi 服务器来部署 django-wiki。经了解 3,windows 环境下的 wsgi 服务器用 waitress 最简单,如果在 linux 环境下,也可以用 gunicorn、uWSGI 等。当然,不怕麻烦的可以考虑使用 apache 加上 mod_wsgi 来实现。
d:\public\django-wiki\django-wiki\settings.py
修改 DEBUG、ALLOWED_HOSTS 变量DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1','localhost']
d:\public\django-wiki\
目录下,运行 python manage.py collectstatic
pip install waitress
,当前最新版本 1.3.1。安装完毕后,可以发现在 python 的目录下多了 waitress-serve.exe 文件。若使用虚拟环境,则可在虚拟环境目录下找到它 venv\Scripts\waitress-serve.exe
。waitress-serve --listen 127.0.0.1:8804 django-wiki.wsgi:application
即可启动服务器。 4至此,多个 wiki 系统已经安装完毕。我们需要提供一个快捷的手段,以便一次性启动他们。
另外,前面安装的两套 DokuWiki 一个问题,就是需要维持一个黑色的 CMD 窗口以便运行 apache 服务器。一旦关闭那个 CMD 窗口, apache 服务器进程就被关闭了。而 waitress-serve 命令也需要在 CMD 窗口下运行。这个问题可以通过“隐藏批处理窗口“相关技巧来解决。
打开 Dokuwiki 自带的 run.cmd 文件,可以看到核心语句就是一句 start /B mapache.exe
,因此我们可以单独写一个批处理文件,一次性启动两个 apache 进程和 waitress。新建 start_Dokuwikis.cmd
文件于d:\Public
下,内容如下: 5
@echo off
rem 下面这两句,实现了无窗口的脚本启动。其中第二句在第一次运行时会退出,再带着参数 h 运行第二次,此时就跳转到真正的代码处
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("%~nx0 h",0)(window.close)&&exit
:begin
rem 启动两个小型 apache 服务器
cd D:\Public\DokuWiki1\server
start /B mapache.exe
cd D:\Public\DokuWiki2\server
start /B mapache.exe
rem 若有python虚拟环境,可使用下面这一句
rem call D:\public\django-wiki\venv\Scripts\activate.bat
cd D:\Public\django-wiki
waitress-serve --listen 127.0.0.1:8804 django-wiki.wsgi:application
到 nginx 官方下载最新版(编写此文时为 1.16.1
)的 windows 系统包,直接解压到 D:\Public\nginx
下即可,然后打开 cmd 窗口,运行 start d:\public\nginx\nginx.exe
即可。然后修改 nginx\conf\nginx.conf
文件6
...
include server_wiki_1.conf;
include server_wiki_2.conf;
include server_django-wiki.conf;
server {
listen 80;
server_name *.abc.org;
...
在nginx\conf
目录下,新建 server_wiki_1.conf
文件,内容大致如下:
server {
listen 80;
server_name wiki1.abc.org;
charset utf-8;
location /{
proxy_pass http://127.0.0.1:8800;
}
access_log logs/private_wiki.log;
}
再新建server_wiki_2.conf
文件,内容与此大同小异,就是修改一下对应的域名与端口号而已。
最后新建 server-django-wiki.conf
文件,内容如下:
server {
listen 18099;
server_name wiki3.xacourt.org;
charset utf-8;
location /media/ {
root D:/Public/django-wiki/mywiki/;
try_files $uri =404;
}
location /static/ {
alias D:/Public/django-wiki/mywiki/static/;
}
location / {
proxy_pass http://127.0.0.1:8804;
}
access_log logs/server_django-wiki.log;
}
现在,我们用 nginx.exe -t
来测试一下配置文件是否有问题,没问题的话,运行 nginx.exe -s reload
即可加载最新配置文件。此时试试 wiki1.abc.org
、 wiki2.abc.org
、wiki3.abc.org
几个域名,看看是否均正常访问。