1. 安装Apache

#sudo su root #切换为root用户
sudo apt update
sudo apt install apache2
# 验证Apache是否运行
sudo systemctl status apache2
#写完配置文件需要激活:
sudo a2ensite example.com

#测试配置文件是否有任何语法错误:
sudo apachectl configtest

#如果没有错误,会有以下输出:
Syntax OK

#重启 Apache 服务,使修改生效:
sudo systemctl restart apache2

#最终,想要验证一切都按照预期工作,在你的浏览器中打开http://example.com

2. 安装Flask,wsgi-py3,编写app

#安装flask:
pip install flask

#安装wsgi服务(不然不能执行app.wsgi, 且"WSGIScriptAlias / /var/www/blog/blog.wsgi"不能生效,因为不识别WSGIScriptAlias变量):
apt-get install libapache2-mod-wsgi-py3

#创建Flask APP文件.即网站内容。此处省略。

3. 配置mod-wsgi

vi /etc/apache2/sites-available/example.cn.conf 
#文件内容如下:
<VirtualHost *:80>
    ServerName example.cn
    ServerAlias www.example.cn
    ServerAdmin webmaster@example.com
#    DocumentRoot /var/www/example.cn/public_html
    WSGIDaemonProcess flaskw  user=ubuntu   group=www-data  threads=5
    WSGIScriptAlias /  /var/www/example.cn/flask/app.wsgi
    WSGIProcessGroup flaskw
    WSGIScriptReloading On
    WSGIApplicationGroup flaskw
    Alias  /static  /var/www/example.cn/public_html
    <Directory /var/www/example.cn/public_html>
WSGIScriptReloading On
        Options -Indexes +FollowSymLinks
        AllowOverride All

    </Directory>

    ErrorLog /var/www/example.cn/log/error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
#配置app.wsgi文件
vim /var/www/example.cn/app.wsgi

#输入以下内容:
import sys
import os

activate_this = '/var/www/blog/venv/bin/activate_this.py'
with open(activate_this) as file_:
        exec(file_.read(),dict(__file__=activate_this))

sys.path.insert(0, '/var/www/blog')


dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
if os.path.exists(dotenv_path):
    load_dotenv(dotenv_path,override=True)


from app import create_app

application = create_app()

4. app运行的创建虚拟环境

cd /var/www/blog
python -m venv env
虚拟环境env/bin/中默认没有activate_this.py文件。需要创建。代码如下:
try:
    __file__
except NameError:
    raise AssertionError(
            "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))")

import sys
import os

base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
        if item not in prev_sys_path:
                    new_sys_path.append(item)
                    sys.path.remove(item)
sys.path[:0] = new_sys_path

~
"activate_this.py" 24L, 742C                                                                                                               1,1           All

激活虚拟环境

source env/bin/activate

安装依赖包

pip install -r requirements.txt

5. 确认/etc/apache2/里的ports.conf文件里面80端口和443端口是否打开。

Listen 80

<IfModule ssl_module>
        Listen 443
</IfModule>

<IfModule mod_gnutls.c>
        Listen 443
</IfModule>

6. 配置SSL证书

创建存放证书的文件夹

sudo mkdir /etc/apache2/ssl_certs

把下载的证书文件存放到该文件夹下面

常用命令:
cp filename dir 复制文件到指定文件夹
rm filename 删除文件 
rm -r dir 删除文件夹
mv filename dir 移动文件到指定目录
root_bundle.crt    # 证书文件
xxx.xxx.xxx.crt # 证书文件
xxx.xxx.xxx.key # 私钥文件

配置证书

首先确保配置基本的/etc/apache2/sites-available/000-default.conf这个文件能访问站点。 在/etc/apache2这个目录下,有两个有关的目录sites-available和sites-enabled,我们进入sites-enabled目录下可以发现,里面有一个文件000-default.conf。 实质上sites-enabled/000-default.conf这个文件是/etc/apache2/sites-available/000-default.conf这个文件的软链接。 我们要配置另 ssl 证书,要依靠另一个文件,也就是default-ssl.conf,首先我们需要设置一个软链接,把这个文件链接到sites-enabled这个文件夹中:

ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf

然后去修改这个文件000-default-ssl.conf,因为已经做了软链接,其实这时候修改000-default-ssl.conf或default-ssl.conf都一样。

这个文件没有做任何修改前长这样子(去除自带的注释之后):

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on

        SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

    </VirtualHost>
</IfModule>

然后把下载好的证书(3个文件)传到你自定义的目录中

然后我们需要修改一下,修改成这样:

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin 你的邮箱

        DocumentRoot /var/www/你的目录
        ServerName 你的域名

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on
        # 注意,需要添加这三行
        SSLCertificateFile 你自定义的路径/2_xxx.xxx.xxx.crt
        SSLCertificateKeyFile 你自定义的路径/3_xxx.xxx.xxx.key
        SSLCertificateChainFile 你自定义的路径/1_root_bundle.crt

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>
    </VirtualHost>
</IfModule>

重要的三个参数的作用如下表:

配置文件参数 说明
SSLEngine on 启用 SSL 功能
SSLCertificateFile 证书文件
SSLCertificateKeyFile 私钥文件
SSLCertificateChainFile 证书链文件

改好之后保存。

然后这时,我们加载一下 Apache2 的 SSL 模块:

sudo a2enmod ssl   #加载模块
sudo service apache2 restart # 重启服务

这时,在浏览器输入https://你的域名应该已经可以通过 https 的方式来访问网站了,这时浏览器那里应该也已经有了一个绿色的小锁。

但是,但是…这还不够,因为我们如果不主动输入https://的话,直接输入域名,还是会直接跳转到 80 端口的普通的 http 方式访问,所以我们需要强制使用 https 来访问

强制使用https 我们只需要打开/etc/apache2/sites-available/000-default.conf这个文件,在你的这个标签内随便一个地方加上三行:

RewriteEngine on
RewriteCond   %{HTTPS} !=on
RewriteRule   ^(.*)  https://%{SERVER_NAME}$1 [L,R]

然后保存,然后启动 Apache2 的重定向:

sudo a2enmod rewrite

然后再重启 Apache2,至此大功告成:

sudo service apache2 restart

然后,打开浏览器直接输入域名,就会自动跳转到 https 的方式。

7. 配置多域名+多站点

原理跟上面一样。

1. 在/var/www/文件夹下面创建其他站点的文件夹。
2. 每个站点创建APP文件,即站点程序文件。
3. 每个站点根目录创建虚拟空间venv,并添加/venv/bin/activate_this.py文件。
4. 激活该虚拟空间并安装依赖包。
5. 根目录创建app.wsgi文件。内容根据各站点进行修改。
6. 创建各站点对应的apache2设置文件,包含带SSL文件名和不带SSL文件名的.conf文件。同上面一样,文件名可根据各域名设置,内容根据各个站点实际情况进行设置。
7. 上传各域名的SSL证书到/etc/apache2/ssl_cert文件夹下面。并在各自对应的.conf文件中指定证书的路径。
8. 基本上就大功告成了。重启apache,再打开网站看看是否成功了。

9. 设置默认的python版本

Ubuntu默认的python版本是python2x. 要设置成python3.x,方法为: 首先查看安装了哪些Python:

ls /usr/bin/python*

#/usr/bin/python   /usr/bin/python2.7         /usr/bin/python2-config  /usr/bin/python3.6         /usr/bin/python3.6m         /usr/bin/python3-config  /usr/bin/python3m-config
#/usr/bin/python2  /usr/bin/python2.7-config  /usr/bin/python3         /usr/bin/python3.6-config  /usr/bin/python3.6m-config  /usr/bin/python3m        /usr/bin/python-config

查看当前默认版本:

python --version
Python 2.7.17

移除当前默认链接:

sudo rm /usr/bin/python

新增你需要指定的版本链接:

sudo ln -s /usr/bin/python3.6 /usr/bin/python

重新查看当前默认版本,已经修改成功:

python --version
Python 3.6.9