技术 · 2023年1月4日

Nginx+PHP+SSL +Docker+ Discourse搭建过程

一、创建一个虚拟服务器
本网站采用Linode 1服务,配置为1Core CPU,2GB RAM,系统为Ubuntu 18.04 LTS X64默认设置。

更新服务器系统:

apt-get update
apt-get upgrade --show-upgraded

二、安装php fastcgi processing manager,其中包括核心php依赖项:

apt install php-fpm

三、申请SSL证书
首先在服务器端利用openssl生成证书密钥:

openssl req -new -newkey rsa:2048 -nodes -keyout yourdomain.key -out yourdomain.csr

在生成证书密钥过程中需要输入申请者信息:

Common Name(通用名称):您要保护的完全限定域名或 URL
如果您申请的是通配符证书,请在要添加通配符的通用名称左边添加星号 (*),例如 *.coolexample.com。

Organization(组织):您的企业依法注册的名称。如果您要以个人身份注册,请输入证书申请人的姓名。

Organization Unit(部门):(如果有)输入 DBA(Doing Business As,经营部门)名称。

City or Locality(城市或地区):您的组织机构注册或所在的城市。请勿使用缩写。

State or Province(州或省):您的组织机构所在的州或省。请勿使用缩写。

Country(国家/地区):您的组织机构依法注册所在国家/地区的国家/地区代码,使用国际标准化组织的两字母格式。

如果您不想为该 SSL 输入密码,则可以将“密码”字段保留为空。但是,这样做可能会带来额外的风险。

生成的证书文件(yourdomain.key和yourdomain.csr)会保存在 服务器 /root 目录下。

在文本编辑器中打开 .CSR文件,然后复制所有文本。
将整个 CSR 粘贴到SSL 服务提供商的注册表格中。待证书提供商签发证书后下载签发证书。

如果下载的证书里面有两个crt,需要进行证书合并操作,文件名请根据实际情况进行修改:

cat 53f58e3ac2172cd5.crt gd_bundle-g2-g1.crt > domain.crt

最后,将所有证书文件存入/var/discourse/shared/standalone/ssl/目录中。

四、安装nginx

apt install nginx

1.添加站点
nginx站点的默认配置文件在 /etc/nginx/sites-available/default,首先复制一份并为此文件命名为你想要的名字:

cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

需要将刚刚建立的配置文件软链接至 sites-enabled`目录下:

ln -s /etc/nginx/sites-available/dotcom /etc/nginx/sites-enabled/dotcom

现在我们可以删除nginx原来的默认配置文件了:

rm /etc/nginx/sites-available/default
rm /etc/nginx/sites-enabled/default

2.用vim或nano文本编辑器中打开刚才建立的站点配置文件。复制如下内容到该文件中:

server {
    listen 80;
    listen [::]:80;
    server_name hug.app;
    return 301 https://$host$request_uri;
}

server {

    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com;

    ssl on;
    ssl_certificate /var/discourse/shared/standalone/ssl/ssl.crt;
    ssl_certificate_key /var/discourse/shared/standalone/ssl/ssl.key;
    ssl_dhparam /var/discourse/shared/standalone/ssl/dhparams.pem;
    ssl_session_tickets off;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;

    http2_idle_timeout 5m; # up from 3m default

    location / {
    proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
    proxy_set_header Host $http_host;
    proxy_http_version 1.1;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;
    }
}

测试配置文件是否有错误:

nginx -t

重新加载新配置,并重新启动nginx:

service nginx reload
service nginx restart

五、安装Docker / Git

apt-get install ruby git
wget -qO- https://get.docker.com/ | sh

六、安装Discourse
创建一个/var/conversation文件夹,将官方的Discourse Docker复制到其中:

sudo -s
mkdir /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse

修改Discourse配置
首先将默认配置文件拷贝到containers目录下:

cp samples/standalone.yml containers/app.yml

用vim或nano文本编辑器打开app.yml文件:

vim containers/app.yml

找到下面字段,添加或修改为以下内容:

templates:
- "templates/cron.template.yml"
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ratelimited.template.yml"
- "templates/web.socketed.template.yml"

#- "templates/web.ssl.template.yml"
#- "templates/cron.template.yml"
#- "templates/web.letsencrypt.ssl.template.yml"

expose:
#- "80:80" # http 注释掉本端口以免与nginx冲突
#- "443:443" # https 注释掉本端口以免与nginx冲突

params:
db_shared_buffers: "2GB"

DISCOURSE_HOSTNAME: 'discourse.example.com'

DISCOURSE_DEVELOPER_EMAILS: 'user@example.com'
DISCOURSE_SMTP_ADDRESS: smtp.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: user@example.com
DISCOURSE_SMTP_PASSWORD: "pa$$word"
DISCOURSE_SMTP_ENABLE_START_TLS: true # (optional, default true)
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none

run:
- exec: rails r "SiteSetting.notification_email=' user@example.com'"

修改完成后保存app.yml配置文件,然后手动重新加载新的配置:

./launcher rebuild app #引导需要2-8分钟来建立你的新配置
./launcher start app #启动程序

至此已经顺利配置完所有内容,快来测试你的Discourse站点吧!