前段时间管局又搞我了。我在国外,接不了电话……算了不讲了。反正就是博客又因为备案的原因挂了🙃。趁着挂了的机会,我把博客数据库从SQLite迁到了MySQL。这里写写上线指南吧。

先提一嘴,我的计网专业课就没怎么听懂,水平无限接近于无。前端是艺媒学院的老教授教的,讲错请指正(不过好像也没人看👀)。

MySQL篇

Django连接到MySQL网上有很多博文了,我在这里讲讲遇到的坑。

MySQL超级烦人的security policy

刚装完MySQL很有可能Django根本连不上MySQL。这个时候的锅很可能就是security policy了。注意三点:

  1. 创建一个和当前Linux账号同名的MySQL账号,用这个账号登录MySQL不要用root;
  2. 检查一下新创建账号的权限;
  3. 检查MySQL打开远程连接没有。

如果这几点都注意的话应该是没得问题的。

MySQL编码问题

Django连接到MySQL我看的是这篇博文。这里的坑是在于创建的数据库自动选的Latin编码导致没有办法输入中文。添加博文的时候NGINX会报500错误。如果你已经掉进坑里了,可以手动修改数据库编码或者是在创建数据库之前就指定utf8编码。

现在的遗留问题是,这样还是没得方法写入emoji。可恶,我好爱emoji。

installing mysqlclient error

这是在python3 manage.py makemigrations的时候会遇到的错误。采用鸵鸟政策解决,直接pass哈哈哈。我参考了这里

首先找到你的Django安装位置下db/backends/mysql/base.py文件,把下面这句注释掉:

raise ImproperlyConfigured(
       'mysqlclient 1.3.13 or newer is required; you have %s.'
       % Database.__version__
   )

然后在上面加一句pass,改完之后是这样的:

if version < (1, 3, 13):
   pass
   '''
   raise ImproperlyConfigured(
       'mysqlclient 1.3.13 or newer is required; you have %s.'
       % Database.__version__
   )
   '''

然后修改db/backends/mysql/operations.py文件。改

 query = query.decode(errors='replace')

 query = query.encode(errors='replace')

这样这个问题就解决了。

MySQL密码明文保存问题

一位和我一样细心☺️的网友发现了这个问题,MySQL的密码和账号是直接写在settings.py里的,这样真的没问题吗?我在这里找到了解决方法。大概就是先把密码写成环境变量:

 export MYSQL_PASSWORD=1234

然后在数据库配置里用环境变量的方式写密码:

 'PASSWORD': os.getenv('MYSQL_PASSWORD'),

NGINX+HTTPS+Gunicorn篇

我的博客上线主要参考的是追梦人物的博文。这里补充怎么搞上HTTPS。

申请证书

这篇文章去搞个免费证书,下载下来。下载下来的文件有两个,xxxx.pemxxxx.key,把这两个文件上传到你的服务器随便哪里。我传到了/etc/nginx/cert这个文件夹里。

NGINX配置

我们主要修改追梦人物博文中的NGINX配置文件,其他步骤照旧。

转发80端口至443端口

我们监听80端口,并把它转发到443端口:

server{
    listen 80;
    server_name starmountain.ink;
    rewrite ^(.*)$ https://${server_name}$1 permanent; 
}

监听443端口

我是这么写的。其中要改的地方就是

  1. server_name写你自己的服务器地址;
  2. ssl_certificatessl_certificate_key写你自己的pem文件和key文件的位置。
  3. location写你自己映射的文件夹/端口。
server {
    charset utf-8;
    listen 443;
    server_name starmountain.ink; 

    ssl on;
    ssl_certificate /etc/nginx/cert/starmountain.ink.pem;
    ssl_certificate_key /etc/nginx/cert/starmountain.ink.key; 

    location / { 
        proxy_set_header Host $host;
        proxy_pass http://unix:/tmp/starmountain.ink.socket;
    }

    location /static { 
        alias 你的static文件夹; 
    }
}