centos7,更新group时出错,原因及解决办法

[root@localhost source]# yum install group ‘System Management’
Failed to set locale, defaulting to C
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.neusoft.edu.cn
* extras: mirrors.ustc.edu.cn
* updates: mirrors.aliyun.com
No package group available.
No package System Management available.
Error: Nothing to do
没用,只有developer tools组能装上

https://access.redhat.com/solutions/1310043,参考这个链接

红帽企业linux7中yum的改动,软件包组“Office Suite and Productivity”仅仅作为一个选项包,默认是没有的,所以我们需要通过选项来安装可选包

如果要安装Graphical Administration Tools, System Administration Tools这些组包,需要运行下面的命令:
# yum groupinstall “Office Suite and Productivity” –setopt=group_package_types=mandatory,default,optional

elasticsearch学习笔记

ElasticSearch 官方中文手册
英文:https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html#_check_that_elasticsearch_is_running

中文:
mac或linux系统,从归档文件中安装Elasticsearch

elasticsearch为linux和mac提供.tar.gz的归档包,
这个包包含免费和订阅的功能。30天的试用期

注意:elasticsearch内建包含了OpenJDK。

1、下载和安装
#cd /home/source
#wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.3.2-linux-x86_64.tar.gz
#tar -zxvf elasticsearch-8.3.2-linux-x86_64.tar.gz
#cd elasticsearch-8.3.2
#pwd
目录/home/source/elasticsearch-8.3.2 将作为 $ES_HOME的值

2、开启系统的自动建立索引
部分商业特性自动建立索引。默认情况下,elasticsearch不需要额外步骤,启动后建立就被配置为自动建立索引。
如果你关闭了自动索引,你必须在配置文件elasticsearch.yml中配置active.auto_create_index,如下配置:
action.auto_create_index: .monitoring*,.watches,.triggered_watches,.watcher-history*,.ml*

重要:如果你使用Logstash或Beats,大多数你需要在;action.autocreate_index增加索引名字,如果你不能确认该写什么参数,你可以写个*,这样会自动建立所有的索引

3、从命令行运行elasticsearch
$./bin/elasticsearch
第一次启动Elasticsearch时,安全会被配置,下面的是自动生成的:
. 验证被打开,用户elastic是内建的超级管理员,密码自动生成
. HTTP传输层的TLS的证书和秘钥生成,TLS会被配置使用此证书和密钥
. 为Kibana生成一个登记了的token,有效期30分钟
可以在其它任何时间更改内置超级管理员的密码:$bin/elasticsearch-reset-password -u elastic
可以在其它任何时间更改Kibana实例的token:$bin/elasticsearch-create-enrollment-token -s kibana
可以在其它任何时间更改Elasticsearch nodes的token:$bin/elasticsearch-create-enrollment-token -s node
如果你有一个受密码保护的Elasticsearch keystore,会被提示输入keystore的密码
Elasticsearch默认会打印日志到控制台,并且记录把日志记录到日志目录<clustername>.log。elasticsearch初始化时会打印一些信息,初始化完成后在前端运行时,不再打印日志,除非有值得记录的一些东西发生。Elasticsearch运行时,可以通过http接口9200端口和ElasticSearch交互。

在注册新节点之前,在集群中通常需要额外的操作,比如绑定到localhost以外的地址或满足elasticsearch引导程序检查。 在此期间,自动生成的注册令牌可能会过期,这就是为什么注册令牌不会自动生成的原因。
此外,同一主机上的节点加入集群,不需要额外的配置。 如果希望其他主机上的节点加入集群,则需要设置transport.host,指定一个受支持的值(如取消transport.host:0.0.0.0的注释),或者指定一个绑定到服务器的某个ip地址。
要在集群中注册新节点,可以在集群中的任何现有节点上使用elasticsearch-create-enrollment-token工具创建一个注册令牌。 然后,您可以使用–enrollment-token参数启动一个新节点,以便它加入现有的集群。
a、在运行Elasticsearch的另一个终端中,在Elasticsearch的安装目录,运行elasticsearch-create-enrollment-token工具,为新节点生成注册令牌。
$bin/elasticsearch-create-enrollment-token -s node
复制注册令牌,注册新节点。
b、 从新节点的安装目录中,启动Elasticsearch,并通过–enrollment-token参数传递注册令牌。
$bin/elasticsearch –enrollment-token <entollment-token>
这样,Elasticsearch 会在config/certs目录中自动生成证书和密钥
c、其它新节点加入重复以上步骤即可

4、检查Elasticsearch的运行
发送一个https的请求到本地端口9200来测试elasticsearch状态
$curl –cacert $ES_HOME/config/certs/http_ca.crt -u elastic https://localhost:9200
上面的$ES_HOME,也就是/home/source/elasticsearch-8.3.2

5、Run as daemon
$./bin/elasticsearch -d -p pid
日志会记录在$ES_HOME/logs/
pkill -F pid
注意:elasticsearch的tar.gz包,不包含systemd模块,如果希望以服务运行,那就使用rpm包

6、命令行配置Elasticsearch
elasticSearch默认读取$ES_HOME/config/elasticsearch.yml配置,yml中可以配置所有的参数,参数参考这里https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html
命令行也支持所以参数,使用-E参数,如
$./bin/elasticsearch -d -Ecluster.name=my_cluster -Enode.name=node_1
小技巧:通常,关于集群的配置都会放在yml配置中,而特点于节点的配置会放在命令行,如node.name,节点名

7、客户端连接elasticsearch
首次启动Elasticsearch时,会自动为HTTP层配置TLS。 生成CA证书并存储在磁盘上:
$ES_HOME/config/certs/http_ca.crt
该证书的十六进制SHA-256指纹也输出到终端。 任何连接到Elasticsearch的客户端,如Elasticsearch客户端、Beats、独立的Elastic Agents和Logstash,都必须验证他们是否信任Elasticsearch用于HTTPS的证书。 Fleet Server和Fleet-managed Elastic agent会自动配置为信任CA证书。 其他客户端可以使用CA证书的指纹或CA证书本身建立信任。
如果已完成自动配置,仍可获取安全证书的指纹信息。 您还可以将CA证书复制到您的计算机并配置您的客户端以使用它。

8、使用CA指纹
复制Elasticsearch启动时输出到终端的指纹值,并配置客户机在连接到Elasticsearch时使用该指纹建立信任。
如果已经完成自动配置,仍然可以通过以下命令获取安全证书的指纹信息。 路径为自动生成的HTTP层CA证书。
$openssl x509 -fingerprint -sha256 -in config/certs/http_ca.crt
该命令将返回安全证书,包括指纹。 颁发者应该是 Elasticsearch security auto-configuration HTTP CA。

9、使用CA 证书
如果您的库不支持验证指纹的方法,Elasticsearch节点自动生成的CA证书位于以下目录中:
$ES_HOME/config/certs/http_ca.crt
复制http_ca。 并将您的客户端配置为在连接到Elasticsearch时使用这个证书来建立信任。

10、目录说明
存档发行版是完全独立的。 默认情况下,所有文件和目录都包含在$ES_HOME中——解压缩时创建的目录。
这非常方便,因为您不需要创建任何目录就可以开始使用Elasticsearch,而卸载Elasticsearch就像删除$ES_HOME目录一样简单。 但建议修改config目录、data目录和logs目录的默认位置,以免后续删除重要数据。
home -> $ES_HOME
bin -> 可执行脚本目录,包含elesticsearch,用于启动node和elasticsearch-plugin,用于安装插件
conf -> 配置文件目录,包含elasticsearch.yml $ES_PATH_CONF,实际目录是$ES_HOME/config
conf -> 传输层和http层生成的密钥和证书的位置 $ES_HOME/config/certs
data -> 分配在节点上的每个索引/分片的数据文件的位置 $ES_HOME/data
logs ->
plugins -> 插件文件所在目录,一个插件一个子目录 $ES_HOME/plugins
repo -> 共享文件存储位置。 可容纳多个位置。 文件系统存储库可以放在这里指定的任何目录的任何子目录中。

11、证书和密码安全
安装Elasticsearch时,将在Elasticsearch配置目录中生成以下证书和密钥,用于将Kibana实例连接到您的Elasticsearch集群,并对节点间通信进行加密。 这里列出的文件供参考。
http_ca.crt 用于对这个Elasticsearch集群的HTTP层证书进行签名的CA证书。
http.p12 包含此节点HTTP层的密钥和证书的密钥存储库。
transport.p12 包含集群中所有节点的传输层密钥和证书的密钥存储库。
http.p12和运输。 p12是有密码保护的pkcs# 12密钥存储库。 Elasticsearch将这些密钥库的密码作为安全设置存储。 要检索密码,以便检查或更改密钥存储库内容,请使用bin/elasticsearch-keystore工具。
使用如下命令找回http.p12的密码:
$bin/elasticsearch-keystore show xpack.security.http.ssl.keystore.secure_password
使用如下命令找回transport.p12的密码:
bin/elasticsearch-keystore show xpack.security.transport.ssl.keystore.secure_password

 

 

 

 

 

 

 

 

 

 

 

1、安装,设置监听ip后,启动出错

| ERROR: [2] bootstrap checks failed. You must address the points described in the following [2] lin

[1]: max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
编辑 /etc/security/limits.conf,追加以下内容;

#* soft core 0
#* hard rss 10000
* soft nofile 65536
* hard nofile 65536

此文件修改后需要重新登录用户,才会生效

[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

编辑 /etc/sysctl.conf,追加以下内容:

vm.max_map_count=655360

2,报错:[2022-07-23T18:44:55,440][ERROR][o.e.i.g.GeoIpDownloader ] [localhost.localdomain] exception during geoip databases update
org.elasticsearch.ElasticsearchException: not all primary shards of [.geoip_databases] index are active
at org.elasticsearch.ingest.geoip.GeoIpDownloader.updateDatabases(GeoIpDownloader.java:134) ~[ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.ingest.geoip.GeoIpDownloader.runDownloader(GeoIpDownloader.java:274) [ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.ingest.geoip.GeoIpDownloaderTaskExecutor.nodeOperation(GeoIpDownloaderTaskExecutor.java:102) [ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.ingest.geoip.GeoIpDownloaderTaskExecutor.nodeOperation(GeoIpDownloaderTaskExecutor.java:48) [ingest-geoip-8.3.2.jar:8.3.2]
at org.elasticsearch.persistent.NodePersistentTasksExecutor$1.doRun(NodePersistentTasksExecutor.java:42) [elasticsearch-8.3.2.jar:?]
at org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingAbstractRunnable.doRun(ThreadContext.java:769) [elasticsearch-8.3.2.jar:?]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:26) [elasticsearch-8.3.2.jar:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) [?:?]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) [?:?]
at java.lang.Thread.run(Thread.java:833) [?:?]

因为他启动时会去更新地图的一些数据库,这里直接禁掉即可,用到时再说,配置文件conf/elasticsearch.yml,增加配置

1
ingest.geoip.downloader.enabled: false

 

 

 

 

 

 

curl:测试语句
1、curl –user elastic:xEjB13-nuDEGVNLhCvhm -XGET ‘https://localhost:9200/dangjian_articles/_source/506’ –tlsv1.2 -k

2、curl –user elastic:xEjB13-nuDEGVNLhCvhm -XGET ‘https://localhost:9200/_cat/health?v‘ –tlsv1.2 -k    获取健康状态

3、curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -XGET ‘https://localhost:9200/_cat/indices‘ –tlsv1.2 -k  获取所有索引

curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -X PUT ‘https://localhost:9200/test/_doc/1’ -d ‘{“user”:”zhangsan”,”uid”:”8888″}’ –tlsv1.2 -k

curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -X GET ‘https://localhost:9200/twitter/_doc/ZYtFTYIBk4Inmlc-1jup?pretty’ –tlsv1.2 -k

 

curl –user elastic:xEjB13-nuDEGVNLhCvhm -H “Content-Type:application/json” -X POST ‘https://localhost:9200/twitter/_create/4′ -d ‘{“user”:”GBX2″,”uid”:4,”city”:”shijiazhuang”,”province”:”Hebei”,”country”:”China”,”DOB”:”2008-06-05″}’ –tlsv1.2 -k    如果id存在,则冲突,不能增加,如果id不存在,则能增加

 

 

 

 

 

 

 

 

 

 

 

其它:

Lucene全文检索就是对文档中全部内容进行分词,然后对所有单词建立倒排索引的过程
lucene是一套用于全文检索和搜寻的开源程序库
lucene可以用来制作搜索引擎产品
放一张图说明倒排索引:

php中的双引号

双引号可以解析变量,单引号不会对字符做任何处理,包括转义字符也是原样显示

在双引号下,可用’\n’或’\r\n’来换行

例子:

$fields_options = unserialize($fields['setup']);
//dump($fields_options);die();
$a = explode("\n",trim($fields_options['options']));
dump($a);
die();

如果使用单引号,则换行符不能解析

 

js,jquery,toggle方法的点击切换

                <ul class="zj_tab2">
                    {foreach $category_list as $k=>$v}

                    <li {if $v['id']==48}id="sun_cate1" class="active" style=""{/if}>
<!--                    <a href="/index/index/{$v['actions']}/type/{$v['id']}">{$v['name']}</a>-->
<!--                    <a href="javascript:void(0)">{$v['name']}</a>-->
                    {$v['name']}{if $v['id']==48}&nbsp;>{/if}
                    {if $v['id']==48}
                        {if !empty($sun_category)}
                            <ul id="sun_cate" class="hid zj_tab2">
                                {volist name="sun_category" id="sun"}
                                <li>{$sun.name}</li>
                                {/volist}
                            </ul>
                        {/if}
                    {/if}
                    </li>
                    {/foreach}
                    <script>
                            $("#sun_cate1").on("click", function()
                            {
                                $("#sun_cate").toggle(
                                    function(){
                                        console.log('bbbbb');
                                        $(this).addClass("hid");
                                    },
                                    function(){
                                        console.log('aaaaa');
                                        $(this).removeClass("hid");
                                    }
                                )
                            })
                    </script>

php的curl例子,摘自runoob.com

https://www.runoob.com/php/php-ref-curl.html

<?php
function geturl($url){
        $headerArray =array("Content-type:application/json;","Accept:application/json");
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_HTTPHEADER,$headerArray);
        $output = curl_exec($ch);
        curl_close($ch);
        $output = json_decode($output,true);
        return $output;
}


function posturl($url,$data){
        $data  = json_encode($data);    
        $headerArray =array("Content-type:application/json;charset='utf-8'","Accept:application/json");
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST,FALSE);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        curl_setopt($curl,CURLOPT_HTTPHEADER,$headerArray);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return json_decode($outputtrue);
}


function puturl($url,$data){
    $data = json_encode($data);
    $ch = curl_init(); //初始化CURL句柄 
    curl_setopt($ch, CURLOPT_URL, $url); //设置请求的URL
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST,"PUT"); //设置请求方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//设置提交的字符串
    $output = curl_exec($ch);
    curl_close($ch);
    return json_decode($output,true);
}

function delurl($url,$data){
    $data  = json_encode($data);
    $ch = curl_init();
    curl_setopt ($ch,CURLOPT_URL,$put_url);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");   
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output,true);
}

function patchurl($url,$data){
    $data  = json_encode($data);
    $ch = curl_init();
    curl_setopt ($ch,CURLOPT_URL,$url);
    curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PATCH");  
    curl_setopt($ch, CURLOPT_POSTFIELDS,$data);     //20170611修改接口,用/id的方式传递,直接写在url中了
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output);
    return $output;
}
?>

php中的的isFile和is_file方法

SplFileInfo类
SplFileInfo::isFile($fullpathfilename)
参数必须是全路径

一下是image类的open方法返回的结果,tp5中的image类

object(think\Image)#33 (3) {
  ["im":protected] => resource(88) of type (gd)
  ["gif":protected] => NULL
  ["info":protected] => array(4) {
    ["width"] => int(4096)
    ["height"] => int(3072)
    ["type"] => string(4) "jpeg"
    ["mime"] => string(10) "image/jpeg"
  }
}

apache跑php程序,超时中断问题,300s

apache2.4
php以fcgi方式运行

Apache虚拟主机配置如下:
Timeout 3600
FcgidIOTimeout 3600
FcgidIdleTimeout 3600
IPCConnectTimeout 3600
IPCCommTimeout 3600
FcgidBusyTimeout 3600   #这个默认是300s,这个修改为1小时

php文件中定义:

ini_set('max_execution_time', 3600);
//ini_set('memory_limit', '2048M');

施测可以解决

php连接数据库,不用thinkphp框架

<?php
/**
 * Created by PhpStorm.
 * User: yanjin
 * Date: 2021/6/26
 * Time: 10:04
 */
$dbms='mysql';     //数据库类型
$host='localhost'; //数据库主机名

$dbName='spider';    //使用的数据库
$user='root';      //数据库连接用户名
$pass='root';          //对应的密码
$dsn="$dbms:host=$host;dbname=$dbName";


try {
    // $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
    // echo "连接成功<br/>";
    /*你还可以进行一次搜索操作
    foreach ($dbh->query('SELECT * from FOO') as $row) {
        print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
    }
    */
    // $dbh = null;
    $dbh = new PDO($dsn, $user, $pass);
    $dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE , PDO::FETCH_ASSOC );
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}
//默认这个不是长连接,如果需要数据库长连接,需要最后加一个参数:array(PDO::ATTR_PERSISTENT => true) 变成这样:
// $db = new PDO($dsn, $user, $pass, array(PDO::ATTR_PERSISTENT => true));

tp5,第二个数据库连接

public function index()
{
    $db =
        [
            // 数据库类型
            'type'          => 'mysql',
            // 服务器地址
            'hostname'       => 'rm.mysql.rds.aliyuncs.com',
            //'hostname'       => 'rm.mysql.rds.aliyuncs.com',
            // 数据库名
            'database'       => 'kehu',
            // 用户名
            'username'       => 'kehu',
            // 密码
            'password'       => 'SHpw',
            // 端口
            'hostport'       => '3306',
            // 连接dsn
            'dsn'           => '',
            // 数据库连接参数
            'params'         => [],
            // 数据库编码默认采用utf8
            'charset'        => 'utf8',
            // 数据库表前缀
            'prefix'         => '',
            // 数据库调试模式
            'debug'             => true,
            // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
            'deploy'         => 0,
            // 数据库读写是否分离 主从式有效
            'rw_separate'     => false,
            // 读写分离后 主服务器数量
            'master_num'      => 1,
            // 指定从服务器序号
            'slave_no'       => '',
            // 自动读取主库数据
            'read_master'     => false,
            // 是否严格检查字段是否存在
            'fields_strict'       => true,
            // 数据集返回类型
            'resultset_type'   => 'array',
            // 自动写入时间戳字段
            'auto_timestamp'   => false,
            // 时间字段取出后的默认时间格式
            'datetime_format'  => 'Y-m-d H:i:s',
            // 是否需要进行SQL性能分析
            'sql_explain'     => false,
        ];
    
    $list = Db::connect($db)
        -> name('rockphp_live_kj')
        -> where('id', '>', 0)
        -> order('id', 'DESC')
        //-> page($page, 50)
            -> limit(12)
        -> select();
    
    //dump($list);die();
    //$list = json_encode($list,true);
    $this->assign('list',$list);
    return view();
}