2022年4月 - HelloJXL

2022年4月

迁移禅道

最近把公司内网的禅道迁移到外网,由于不想装apache,所以没有采用一键安装的方式,采用了nginx+fastcgi的方式安装,数据还原完成后不知道为何找不到备注了,并且访问地址必须为:地址+zendaopms/www才行,看上去非常别扭,网上查大部分都是通过nginx反向代理apache的地址,或者是直接根目录访问,因为后面还有别的业务要用,所以想配置成/zentao这种访问方式,查了半天,最终在官方的问答里找到了配置方式,nginx采用如下配置:

location ~ ^/zentao/.+\.php$ {
   root /opt/zentao/www;
   fastcgi_index index.php;
   fastcgi_pass unix:/run/php/php7.0-fpm.sock;
   if ( $fastcgi_script_name ~ ^/zentao/(.*\.php) ) {
       set $cginame $1;
   }
   fastcgi_param SCRIPT_FILENAME $document_root/$cginame;
   include fastcgi_params;
}

location ~ ^/zentao($|/.*) {
      alias /opt/zentao/www/$1;
      index index.php index.html index.htm;
}

最初也猜想到需要用alias切换到实际目录,但是少了一些配置,一直提示not found。只要是采用fastcgi的方式应该都可以用这种方式配置,因此记录下来备忘,在此也非常感谢原作者。

引用地址:https://www.zentao.net/ask/4621.html

解决MySQL无法通过root登录的问题

起因
周五的时候,同事在解决由于导入视图没有权限的问题时,不知道动了哪个地方,造成root权限在本机上无法登录,明明密码是正常的,但是依旧被denied,同时提示的是root@%没有权限,众所周知这是为了配置了远程访问,但是无奈任何账号都登录不进去,只好先用无密码进行登录了。

无密码登录
通过网上查找,找到两种方法:

  1. 通过在[mysqld]下添加skip-grant-tables配置,并重启服务即可,试了一下好像不起作用,暂时没有这种方法。
  2. 先停止原有的MySQL服务,通过sudo mysqld_safe --skip-grant-tables &命令进行启动,但是会提示访问不到var/run/mysqld权限而失败,可以通过手动创建该目录,然后chown mysql:mysql /var/run/mysqld对该目录进行权限设置,再次启动后应该就成功了。

重设root权限
初步怀疑可能没有没有授权,保险起见,重新设置一下密码,流程跟忘记密码类似,具体操作如下:

use mysql;
update user set authentication_string=password('YOURSUPERSECRETPASSWORD') where user='root';
flush privileges;

退出后,kill掉MySQL进程,重启MySQL服务应该可以通过root登录了。

重设赋权权限
当时进去之后以为问题结束了,可是当用普通账号登录时依旧提示没有权限,直接用root权限登录,对普通账号进行赋权却依旧提示被拒绝,后来通过搜索发现Grant_priv权限全部为N,那就好办了,操作如下:

-- 查看所有用户的赋权权限
select Host,User,Grant_priv from user;
-- 修改指定用户的赋权权限,具体以实际用户为准
update user set Grant_priv='Y' where user='root';
flush privileges;

注销root用户并重新登录应该就可以了,以防万一也可以先重启服务。

结束

至此问题终于解决完毕,操作过程中如果权限不足也可以先执行flush privileges再执行sql语句试试。

参考链接:
https://www.techandme.se/reset-mysql-5-7-root-password/

PostgreSQL数据库配置

由于阿里云即将到期了,打算迁移到腾讯轻量云,通过代理200多一点到手,还可以升级一下配置,迁移的过程中顺便记录一下Postgresql的安装过程,以便当前博客的开发用。

安装

官方给的教程已经很详细了,这里不再过多介绍。

Red Hat系参考这里

Debian系参考这里

Windows参考这里

其它的也都可以在官网找到,主要记录一下安装后的一系列操作。

进行数据库初始化

#初始化db
/usr/pgsql-12/bin/postgresql-12-setup initdb

创建数据库及用户

#切换到postgres用户
su postgres

#执行psql连接postgresql
psql

#创建testDb数据库
create database testDb;

#创建用户名为:test,密码为:test123的用户,
CREATE USER test WITH PASSWORD 'test123';

#赋予testDb数据库的所有权限给test用户
GRANT ALL PRIVILEGES ON DATABASE testDb TO test;

开放远程访问

  1. 查找配置文件所在位置

    #用上面的方式进入psql命令下,并执行下面语句
    select name,setting from pg_settings where name = 'config_file';
    #或下面获取所有的配置
    select name,setting from pg_settings where category='File Locations';
  2. 修改监听地址为外网地址或所有地址(用*代替)

    #修改/var/lib/pgsql/12/data/postgresql.conf
    listen_addresses = '*'
  3. 增加连接方式

    #修改/var/lib/pgsql/12/data/pg_hba.conf增加下面配置
    host    all             all             0.0.0.0/0               md5
  4. 重启postgresql服务

    systemctl restart postgresql-12

psql操作命令

\h:查看SQL命令的解释,比如\h select。

?:查看psql命令列表。

\l:列出所有数据库。

\c [database_name]:切换到数据库,默认为当前用户对应的默认数据库。

\d:列出当前数据库的所有表格。

\d [table_name]:列出某一张表格的结构。

\du:列出所有用户。

\e:打开文本编辑器。

\conninfo:列出当前数据库和连接的信息。

\password:设置密码

\q:退出psql

关于连接方式

查了一下,这里大概记录一下:
TYPE
该项为连接方式,有四种:local 、host、hostssl、hostnossl local 这条记录匹配通过 Unix 域套接字进行的联接企图, 没有这种类型的记录,就不允许 Unix 域套接字的联接。 host 这条记录匹配通过TCP/IP网络进行的联接尝试.他既匹配通过ssl方式的连接,也匹配通过非ssl方式的连接。 注意:要使用该选项你要在postgresql.conf文件里设置listen_address选项,不在listen_address里的IP地址是无法匹配到的。因为默认的行为是只在localhost上监听本地连接。 hostssl 这条记录匹配通过在TCP/IP上进行的SSL联接企图。要使用该选项,服务器编译时必须使用--with-openssl选项,并且在服务器启动时ssl设置是打开的

DATABASE
指定连接的数据库,all代表所有数据库,也可以指定数据库名,replication表示匹配一条replication连接,它不指定一个特定的数据库,一般在流复制中使用,比如主从复制。

USER
为连接的用户,all代表所有用户,也可以指定用户。

ADDRESS
为指定匹配的客户端的地址,可以是一个主机名或一个IP地址范围,本选项只能在连接方式是host,hostssl或者hostnossl的时候指定。

METHOD
为认证方式,主要有以下几种:

trust 无条件地允许联接,这个方法允许任何可以与PostgreSQL 数据库联接的用户以他们期望的任意 PostgreSQL 数据库用户身份进行联接,而不需要口令。

reject 联接无条件拒绝,常用于从一个组中"过滤"某些主机。

md5 要求客户端提供一个 MD5 加密的口令进行认证,这个方法是允许加密口令存储在pg_shadow里的唯一的一个方法。

password 和"md5"一样,但是口令是以明文形式在网络上传递的,不建议在外网用这种方式。

gss 使用GSSAPI认证用户,只适用于 TCP/IP 连接。

sspi 使用SSPI认证用户,只适用于 Windows 连接。

peer 获取客户端的操作系统的用户名并判断他是否匹配请求的数据库名,这只适用于本地连接。

ldap 使用LDAP服务进行验证。

radius 使用RADIUS服务进行验证。

cert 使用SSL服务进行验证。

pam 使用操作系统提供的可插入的认证模块服务 (Pluggable Authentication Modules)(PAM)来认证。

关于certbot的简单用法

最近一直在用Certbot进行Let's Encrypt的证书管理,这里大概记录一下常用的吧。

签发证书

直接通过Auth插件

安装完certbot之后直接可以通过以下代码就可以了,目前只使用过一次,虽然方便但是貌似后面续期的时候不太好用

certbot --nginx

通过webroot

目前大部分通过这种方式进行,可能自己用的不太深入吧,说一下nginx的相关配置吧,需要先添加以下配置,注意一下自己的主目录

location ~ /.well-known/acme-challenge/ {
            allow   all;
            root /usr/share/nginx/html;
            default_type    "text/plain";
    }
    location = /.well-known/acme-challenge/ {
            return 404;
    }

然后执行以下代码获取证书

certbot certonly --webroot -w /usr/share/nginx/html/ -d www.exmaple.com

然后再配置一下nginx的证书配置即可

ssl_certificate /etc/letsencrypt/live/www.exmaple.com/fullchain.pem;
ssl_certificate_key     /etc/letsencrypt/live/www.exmaple.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/www.exmaple.com/chain.pem;
ssl_protocols   TLSV1.1 TLSV1.2;
ssl_prefer_server_ciphers       on;
ssl_ciphers     AES256+EECDH:AES256+EDH:!aNULL;

然后在443的端口中也添加一下well-known那段配置,方便后面续期。

查看当前证书

可能有时会签好几个证书,那么可以通过以下代码查看已签发的证书

certbot certificates

删除证书

保险起见先吊销证书

certbot revoke --cert-name www.exmaple.com

成功之后进行删除

certbot delete --cert-name www.exmaple.com

续期证书

可以通过crontab添加定时任务进行证书的续期,使用renew命令进行续期,renew会使用之前成功的操作方式进行续期

certbot renew

添加crontab时注意certbot所在的路径,最好带上全路径(可以通过which certbot找到路径),避免找不到certbot而失败,执行crontab -e添加一下代码

0 5 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

以上的命令大部分都是在debian上进行的,可能其它系统可不通过,需要注意。

nginx反代cookie丢失问题

之前配置nginx的时候遇到过cookie丢失了,但是又想不起来了,后来查到了就记一下吧:

location / {
       proxy_pass http://127.0.0.1:8080;
       proxy_set_header Host $host:$server_port;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Real-PORT $remote_port;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Cookie $http_cookie;
    }

这里记录一下,省的以后再忘了。