如何从零开始架设一个网站

从开发一个最简单的server,到用supervisor部署,然后配置nginx,到绑定域名到主机。

使用flask开发一个最简单的server

flask使用起来非常简单,几行代码就能写好一个server。
新建一个文件,命名为app.py,键入以下命令

1
2
3
4
5
6
7
8
9
10
11
12
13
#! coding=utf-8
from flask import Flask

app = Flask(__name__)


@app.route('/')
def index():
return "<p>this is my server</p>"


if __name__ == '__main__':
app.run("0.0.0.0")

执行python app.py, 打开浏览器,输入localhost:5000,如果看到this is my server,就表示我们的server运行起来了。
(如果不成功,就先执行pip install flask)

只是一个web应用,想要成为一个server,这里使用gunicorn作为中间层
在本目录下新建一个文件wsgi.py,代码如下:

1
2
3
4
5
6
#! coding: utf-8
from werkzeug.contrib.fixers import ProxyFix

from app import app

app.wsgi_app = ProxyFix(app.wsgi_app)

ProxyFix主要为了取得真实的IP,这里可以不理
此时执行以下命令

gunicorn -w 4 -b 127.0.0.1:4000 wsgi:app

(需要安装 gunicorn 等)
-w 4是运行4个worker,也可以加-k gevent,运行无阻塞的server。此时再访问浏览器,如果正常,则说明我们已经写好了一个server

使用supervisor守护进程

supervisor的安装就不再详述了。
在/etc/supervisord.d/ 下新建一个little_server.ini, 代码如下:
(我把代码放到服务器的/var/www文件夹下, 服务器的Python环境应该用virtualenv)

[program:little_server]
command=gunicorn -w 4 wsgi:app -b 0.0.0.0:5000
directory=/var/www/little_server
autostart=true
autorestart=true
stopsignal=QUIT
user=ubuntu
stdout-logfile=/var/log/little_server_stdout.log
stderr-logfile=/var/log/little_server_stderr.log

如果没有这个文件夹,那就需要初始化supervisor
user换成服务器的真实用户名,stdout是系统输出日志,err则是报错信息(log信息也会到这里面来)

执行supervisor -c /etc/supervisor.conf reload, 如果没有报错,则说明server正在运行

访问服务器的ip加端口号5000加以验证

绑定域名

域名的绑定服务提供商很多,购买域名的地方通常会提供方便的方法。这里我用的是Dnspod
按照指示,到购买域名的地方,把name server指向Dnspod
到Dnspod,增加域名解析,记录值填上服务器的ip地址,大概是这样的

Dnspod 设置

主机记录指的是域名前的字符串,比如www.example.com
@ 指的是域名example.com

  • 则是泛指的域名

绑定结束之后,等待一两天即可生效

使用nginx做服务器代理

浏览器默认访问80端口,可是服务器的80端口就一个,这就需要我们把其他端口上的web应用,代理到80端口上
nginx的安装在这里也不赘述,配置文件放在/etc/nginx/site-available/下。每次创建一个配置,都要在site-enable下创建一个软连接

首先 sudo service nginx start,然后访问服务器的ip,看到了nginx的欢迎页,说明成功了。

拷贝一份default,命名为little_server(或者干脆新建一个,干净清爽),输入以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80;
server_name 0x01.pw www.0x01.pw;

location / {
proxy_pass http://127.0.0.1:5000/;
proxy_read_timeout 120;
proxy_redirect off;
proxy_set_header Host $http_host;
access_log /var/log/nginx/little-server.log;
error_log /var/log/nginx/little-error.log;
}
}

这里省略了很多的http header 的转发
执行 sudo nginx -t && service nginx reload, 这个是安全启动,如果测试不通过,不会reload。


当访问自己的域名,看到网页上呈现自己的内容,那种成就感真是无与伦比。
这个教程只是实现一个最简单的server,省略了很多可以优化的配置,还需要在长期的运维时,不停的改进。