申请免费SSL证书并配置Nginx绑定WordPress

SSL证书就是遵守 SSL协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能。

目前,网上也有一些有效时间较长的免费的证书,以SSL FOR FREE为例

申请好后,下载完成将得到3个文件ca_bundle.crt、certificate.crt以及私钥private.key,值得注意的是,如果我们要把证书配置到Nginx,按照官方说法,则需要把ca_bundle.crt、certificate.crt文件合并。

我们先把文件上传到服务器,然后执行如下命令

cat certificate.crt ca_bundle.crt

然后,我们把得到的新文件certificate.crt和私钥private.key放到Nginx对应的证书目录上,然后,修改nginx的配置文件,以我的网站为例,(location反向代理的跳转部分可以忽略)

server {
	listen 80;
	server_name www.tzqutao.top tzqutao.top;
	return 301 https://$host$request_uri; 
}

server {
    listen 443 ssl;
    server_name www.tzqutao.top tzqutao.top;
    ssl_certificate      /var/log/nginx/certificate.crt; 
    ssl_certificate_key  /var/log/nginx/private.key;
    
    access_log  /var/log/nginx/www.tzqutao.top.access.log;
    error_log /var/log/nginx/www.tzqutao.top.error.log;
    location / {
        proxy_pass http://172.17.0.3;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

此处,我们需要确保服务器对外的80端口和443端口是通畅的,如果Nginx是在DOCKER中,则还要保证容器的端口和本地80端口和443端口是有存在映射的,完成之后,重启Nginx即可

下面,我们来具体说明WordPress网站,如何启用Https,证书安装好后,我们进入到WordPress根目录的\wp-includes\functions.php,找到代码 require( ABSPATH . WPINC . ‘/option.php’ );大概在第8行。在下方添加以下代码:

add_filter('script_loader_src', 'agnostic_script_loader_src', 20,2); function agnostic_script_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); } 
add_filter('style_loader_src', 'agnostic_style_loader_src', 20,2); function agnostic_style_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); }

打开网站根目录\wp-config.php文件找到代码,在下方添加如下代码:

*
* @package WordPress
*/

$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

此时,我们登录到WordPress后台,把WordPress站点地址修改为HTTPS的路径,就完成了HTTP到HTTPS的迁移

Amazon Linux系统Docker定时重启

我们部署完DOCKER容器之后,有时候需要定时设定重启时间用来回收容器的内存资源,如果当前服务器是亚马逊OS系统的,可以使用以下方法

首先,我们先安装crontab,所谓crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。有点像WINDOS系统中的定时任务

sudo yum install cronie

启动并设置crond服务开机自启:

sudo systemctl start crond
sudo systemctl enable crond

然后,我们可以配置当前用户的crontab文件:

crontab -e

格式如下:比如,我们想每日凌晨一点重启容器WordPress、mystifying_hoover、mathapp,就可以按照下面的写法

0 1 * * * /usr/bin/docker restart mystifying_hoover
0 1 * * * /usr/bin/docker restart wordpress
0 1 * * * /usr/bin/docker restart mathapp

保存并退出编辑器。系统会自动安装新的crontab文件。验证计划任务是否已经正确安装

crontab -l

看到下面的结果,说明已经定时任务已经启用,下面3个容器会在凌晨1点重启

随机返回二次元老婆

今天在网上,发现一个非常有意思的API,很适合我这个二次元爱好者:“获取二次元图片接口”,API地址文档如下:https://docs.loliapi.com/,于是,基于此,我有了一个有趣的想法,开发了一个小页面:随机5秒钟换新老婆。具体代码如下:

<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width; height=device-height;">
        <title>5秒随机返回老婆</title>
        <style>
            body {
                display: flex;
                justify-content: center;
                align-items: center;
                min-height: 100vh;
                margin: 0;
            }
            img {
                max-width: 100%;
                height: auto;
            }
        </style>
        <script type="text/javascript">
            window.onload = function() {
                setInterval(function(){
                    change();
                },5000);
            }
            function change()
            {
                var time=new Date().getTime();
                const img = document.getElementById("targImg");
                const randomImage = "https://www.loliapi.com/acg/?time="+time;
                
                // 更新图片src
                img.src = randomImage;
                img.alt = randomImage;
            }
        </script>
    </head>
    <body>
        <img id="targImg" src="https://www.loliapi.com/acg/?time=11" alt="https://www.loliapi.com/acg/?time=11">
    </body>
</html>

实现后,效果还是非常赞的,很适合我这个宅男

下面,我们看看预览的效果:点此地址跳转

再次,特别感谢网友:LoliApi

Linq多条件字段的多表连接

假设,我们有一个类StationCat,它的具体属性如下:

public class StationCat
{
    public string CustomerModel { get; set; }

    public string baj_cZZLINE { get; set; }

    public string IssuePosition { get; set; }

    public string fact { get; set; }

    public int InputCount { get; set; }

    public int RepCount { get; set; }

    public string S_NM { get; set; }
}

此时,我们有2个由这个类实例化出的实体数组SWAPMaterials和StationCats,当我们想要把SWAPMaterials左连接到StationCats时,条件为SWAPMaterials表中元素的CustomerModel、baj_cZZLINE、S_NM与StationCats表元素对应的属性相等,那我们应该按照如下方式写LINQ

var resSWAPMaterials = (from p in SWAPMaterials
join StationCat in StationCats on new { p.CustomerModel, p.baj_cZZLINE,p.S_NM } equals new { StationCat.CustomerModel,StationCat.baj_cZZLINE,StationCat.S_NM } into p_StationCat
from StationCat_join in p_StationCat.DefaultIfEmpty()
select new StationCat()
{
    CustomerModel = p.CustomerModel,
    baj_cZZLINE = p.baj_cZZLINE,
    IssuePosition = p.IssuePosition,
    fact = p.fact,
    RepCount = p.RepCount,
    S_NM = p.S_NM,
    InputCount = StationCat_join == null ? 0 : StationCat_join.InputCount
}).ToList();

到此,我们就实现了Linq多条件字段的多表连接

使用HTTP请求方式访问.Net的WebServer服务

.Net的WebServer服务,是一项已经过时的技术,随着技术迭代,当前跨平台的通讯,更多使用用JSON格式数据,发起HTTP请求来实现,但是,有时候,我们为了和老的.NET的WebServer框架通讯,不得不处理和面对的问题

WebServer服务,其实说白了,就是用XML的格式来处理通讯问题,我们可以试着写一个.Net的WebServer服务,文件名如下:WMI.asmx

/// <summary>
/// WMI 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。 
[System.Web.Script.Services.ScriptService]
public class WMI : System.Web.Services.WebService
{
    [WebMethod(EnableSession = true)]
    public string WMI01(string Par)
    {
        try
        {
            //业务逻辑
            returnOK;
        }
        catch (Exception ex)
        {
            //处理异常信息
            return "存在异常信息";
        }
        finally
        {
            //如不记录就 就注释以下内容
        }
    }
}

此时,我们可以运行程序,预览页面效果,接下来,我们在向这个server地址提交http请求的时候,可以使用以下方法:

一、在HTTP头信息上,加上“Content-Type”,值为“text/xml; charset=utf-8”

二、撰写XML格式的请求对象文本,注意,<Par>节点就是WebServer的参数节点,<WMI01>节点就是WebServer的控制器中对应的方法函数

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <WMI01 xmlns="http://tempuri.org/">
      <Par>让我们试试看</Par>
    </WMI01>
  </soap:Body>
</soap:Envelope>

最后,我们可以在POSTMAN程序下试试,预览下请求结果,发现<WMI01Result>节点,就是我们程序返回的处理结果