分类目录归档:操作系统&运维&Shell

nginx规则笔记[转]

转自:https://www.cnblogs.com/qinyujie/p/8979464.html

1、location [=|~|~*|^~] /uri/ { … }

语法规则: location [=|~|~*|^~] /uri/ { … }

  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
  • ~ 开头表示区分大小写的正则匹配                     以xx结尾
  • ~* 开头表示不区分大小写的正则匹配                以xx结尾
  • !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。
location  = / {
  # 精确匹配 / ,主机名后面不能带任何字符串
  [ configuration A ] 
}
location  / {
  # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
  # 但是正则和最长字符串会优先匹配
  [ configuration B ] 
}
location /documents/ {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration C ] 
}
location ~ /documents/Abc {
  # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
  # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
  [ configuration CC ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
  [ configuration D ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配所有以 gif,jpg或jpeg 结尾的请求
  # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
  [ configuration E ] 
}
location /images/ {
  # 字符匹配到 /images/,继续往下,会发现 ^~ 存在
  [ configuration F ] 
}
location /images/abc {
  # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
  # F与G的放置顺序是没有关系的
  [ configuration G ] 
}
location ~ /images/abc/ {
  # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
    [ configuration H ] 
}
location ~* /js/.*/\.js

2、符号解释

=      开头表示精确匹配

^~      开头表示url以某个常规字符串开头,理解为匹配url路径即可,nginx不对url做编码,因此请求为/static/20%/aa,可以被规则 ^$ /static/ /aa 匹配到

~      区分大小写的正则匹配

~*      不区分大小写的正则匹配

!~ !~*    区分大小写不匹配及不区分大小写不匹配的正则

/       通用匹配,任何请求都会匹配到

location = / {多个location配置的情况下匹配顺序为首先匹配 = 其次匹配 ^~ 其次是按文件中的顺序的正则匹配,最后是交给 / 通用匹配。 当匹配成功的时候,停止匹配,按当前匹配规则处理请求。

   #规则A
}
location = /login {
   #规则B
}
location ^~ /static/ {
   #规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
   #规则D
}
location ~* \.png$ {
   #规则E
}
location !~ \.xhtml$ {
   #规则F
}
location !~* \.xhtml$ {
   #规则G
}
location / {
   #规则H
}

那么产生的效果如下:
访问根目录/, 比如http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用,而http://localhost/static/c.png 则优先匹配到规则C
访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,因为规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML不会匹配规则G,因为不区分大小写。规则F,规则G属于排除法,符合匹配规则但是不会匹配到,所以想想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,因为以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为反向代理服务器存在。

所以实际使用中,个人觉得至少有三个匹配规则定义,如下:
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
这里是直接转发给后端应用服务器了,也可以是一个静态首页

第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* .(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
第三个规则就是通用规则,用来转发动态请求到后端应用服务器
非静态文件请求就默认是动态请求,自己根据实际把握
毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass http://tomcat:8080/
}

3、rerite语法

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://seanlook.com/a/we/index.php?id=1&u=str 只对/a/we/index.php重写。语法rewrite regex replacement [flag];

如果相对域名或参数字符串起作用,可以使用全局变量匹配,也可以使用proxy_pass反向代理。
表明看rewrite和location功能有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,可以proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
执行server块的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件;循环超过10次,则返回500 Internal Server Error错误。

server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ “^star\.igrow\.cn$&quot {
rewrite ^(.*) http://star.igrow.cn$1 redirect;
}
}

4、flag标志位

last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。这里 last 和 break 区别有点难以理解:
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能组织继续执行后面的rewrite指令

5、if指令与全局变量

语法为if(condition){…},对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行,if条件(conditon)可以是如下任何内容:

当表达式只是一个变量时,如果值为空或任何以0开头的字符串都会当做false
直接比较变量和内容时,使用=或!=
~正则表达式匹配,~*不区分大小写的匹配,!~区分大小写的不匹配

1、下面是可以用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行

2、下面是可以用作判断的全局变量

 

if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
} //如果UA包含"MSIE",rewrite请求到/msid/目录下
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
    set $id $1;
 } //如果cookie匹配正则,设置变量$id等于正则引用部分
if ($request_method = POST) {
    return 405;
} //如果提交方法为POST,则返回状态405(Method not allowed)。return不能返回301,302
if ($slow) {
    limit_rate 10k;
} //限速,$slow可以通过 set 指令设置
if (!-f $request_filename){
    break;
    proxy_pass  http://127.0.0.1; 
} //如果请求的文件名不存在,则反向代理到localhost 。这里的break也是停止rewrite检查
if ($args ~ post=140){
    rewrite ^ http://example.com/ permanent;
} //如果query string中包含"post=140",永久重定向到example.com
location ~* \.(gif|jpg|png|swf|flv)$ {
    valid_referers none blocked www.jefflei.com www.leizhenfang.com;
    if ($invalid_referer) {
        return 404;
    } //防盗链
}

例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php

6、防盗链

location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}

7、根据文件类型设置过期时间

location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}

8、常用变量

$args : #这个变量等于请求行中的参数,同$query_string
$content_length : 请求头中的Content-length字段。
$content_type : 请求头中的Content-Type字段。
$document_root : 当前请求在root指令中指定的值。
$host : 请求主机头字段,否则为服务器名称。
$http_user_agent : 客户端agent信息
$http_cookie : 客户端cookie信息
$limit_rate : 这个变量可以限制连接速率。
$status  请求状态
$body_bytes_sent 发送字节
$request_method : 客户端请求的动作,通常为GET或POST。
$remote_addr : 客户端的IP地址。
$remote_port : 客户端的端口。
$remote_user : 已经经过Auth Basic Module验证的用户名。
$request_filename : 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme : HTTP方法(如http,https)。
$server_protocol : 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr : 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name : 服务器名称。
$server_port : 请求到达服务器的端口号。
$request_uri : 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri : 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri : 与$uri相同。

CentOS 7 编译安装Redis和RediSearch

安装Redis

安装gcc
yum install gcc

从 https://redis.io/ 下载最新的代码,解压进入

执行: make 报如下错误:
找不到“jemalloc/jemalloc.h”,我们换一种分配内存的方式
make MALLOC=libc

把redis安装到: /usr/local/redis6 目录
make PREFIX=/usr/local/redis6 install

把配置文件复制到/etc/redis.conf
cp redis.conf /etc/redis.conf

把 protected-mode yes 改成 protected-mode no
注释掉:bind 127.0.0.1 -::1

安装RediSearch

下载 代码,解压,报错

make setup
deps/readies/mk/main:6: *** GNU Make version is too old. Aborting.。 停止。

去https://www.gnu.org/software/make/ 下载最新的代码,解压,

./configure
make

生成的可执行文件make会在当前目录,后面直接用这个make就行了,不用安装,

去RedisSearch目录
../make-4.3/make setup
../make-4.3/make build

修改redis.conf,增加:loadmodule /usr/local/redis6/bin/redisearch.so

启动Redis
redis-server /etc/redis.conf

CentOS安装Samba和mac、win10连接

安装samba
yum -y install samba

关防火墙:
systemctl stop firewalld.service

关SELinux
setenforce 0
查看Selinux
getenforce
返回的结果分为三种:Enforcing,Permissive和Disabled。其中,Enforcing-代表记录警告且阻止可疑行为;Permissive-代表仅记录安全警告但不阻止可疑行为;Disabled表示被禁用。

如果不关的话,会导致能登录,但无法访问的情况。

修改smb.conf,增加下面的节点

[share]
        path = /data/share/office
        comment = xxxxx
        public = yes
        writable = yes
        browseable = yes
        guest ok = no
        valid users = office,ben
        available = yes

增加用户office
useradd office
useradd ben
这里不用为他们指定密码

设置samba的密码
smbpasswd -a office
smbpasswd -a ben
必须要先加用户,不然会出现:Failed to add entry for user xxxxx. 的错误

设置目录的权限:
chown office:office /data/share/office

同一时间,只能以一个用户连接上smb服务器,如果需要切换用户,需要先断开,在windows下,可以用net use断开:
net use \\1.1.1.1\xxx /del

 

CentOS安装多PHP环境

yum install epel-release
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install yum-utils
yum install -y php73-php-fpm php73-php-cli php73-php-bcmath php73-php-gd php73-php-json php73-php-mbstring php73-php-mcrypt php73-php-mysqlnd php73-php-opcache php73-php-pdo php73-php-pecl-crypto php73-php-pecl-mcrypt php73-php-pecl-geoip php73-php-recode php73-php-snmp php73-php-soap php73-php-xmll
systemctl enable php73-php-fpm
systemctl start php73-php-fpm

安装的配置文件路径:
/etc/opt/remi/php73/

安装路径:
/opt/remi/php83/root/usr/

启动fpm服务
systemctl restart php80-php-fpm

设置为自动运行
chkconfig php80-php-fpm on

CentOS升级curl
rpm -ivh http://www.city-fan.org/ftp/contrib/yum-repo/rhel7/x86_64/city-fan.org-release-2-1.rhel7.noarch.rpm

yum update curl –enablerepo=city-fan.org -y

 

PHP里用SoapClient出现”Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL”处理

在一台很老的服务器上,调用bing的接口时,出现如下错误,以前都是好好的:

PHP Fatal error:  Uncaught SoapFault exception: [WSDL] SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://adinsight.api.bingads.microsoft.com/Api/Advertiser/AdInsight/v13/AdInsightService.svc?singleWsdl' : failed to load external entity "https://adinsight.api.bingads.microsoft.com/Api/Advertiser/AdInsight/v13/AdInsightService.svc?singleWsdl"

后面发现Curl也不行,报:Peer certificate cannot be authenticated with known CA certificates 错误。

wget也不行,也报:ERROR: cannot verify certificate。

现在看来是由于系统的根证书无效了(系统太老应该是很多年前的机器了),所以无法判断microsoft的证书的有效性,按如下操作就可以了:

cd /etc/pki/tls/certs
wget https://curl.haxx.se/ca/cacert.pem
cat cacert.pem >> ca-bundle.crt

思路是去下载一个新的可信证书串(上面是curl的,也可以找一个其它的),把这个串放到系统的可信证书后面去。

如果是在php程序里用curl的话,不用设置操作系统的,可以试试把 https://curl.haxx.se/ca/cacert.pem 下载下来后,再设置php.ini的curl设置

[curl]
curl.cainfo=/path/to/downloaded/cacert.pem

 

Git记录

删除本地分支
git branch -D test –没合并也删除
git branch -d test — 没合并删除不了

删除远程分支
git push origin :feature/ttkh

查看本地分支:git branch
查看远程分支:git branch -r
查看所有分支:git branch -a

切换远程分支:git checkout -b myRelease origin/Release

git remote add origin https://github.com/wu347771769/learngit.git

把某历史版本打出分支
git checkout -b xxx/xxx 5f4648474fb38c75b69dce0db9c4d4ec1b1e6b74

合并到master分支:
git checkout master
git merge issue1234

把本地分支推送到远程分支
新建远程分支前端 CSS.md
git push origin hotfix/liyan-190905:hotfix/liyan-190905

远程已有remote_branch分支但未关联本地分支local_branch且本地已经切换到local_branch
git push -u origin/remote_branch

远程已有remote_branch分支并且已经关联本地分支local_branch且本地已经切换到local_branch
git push

处理更新不下来,分支冲突的情况
[www@xxx]$ git pull
error: ‘refs/remotes/origin/hotfix’ exists; cannot create ‘refs/remotes/origin/hotfix/business-button’
From gitlab.xxxx.com:Project/backend/gocashback-api
! [new branch] hotfix/business-button -> origin/hotfix/business-button (unable to update local ref)
error: some local refs could not be updated; try running
‘git remote prune origin’ to remove any old, conflicting branches
[www@xxxt]$ git remote prune origin
Pruning origin

指定本地分支和远程某个分支的关系
git branch –set-upstream-to=origin/branch_remote branch_local
查看本地的分支是和哪个远程分支关联的
git branch -vv

提交错误后,回滚
https://blog.csdn.net/BigData_Mining/article/details/88179370

Redash笔记

安装

参考:https://github.com/getredash/setup
Mac上由于运行setup.sh有问题,需要手动的执行,包括以下几步
一、参考setup.sh建议env文件

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
POSTGRES_PASSWORD=upGYF9nPSdUMErOynCeKP6VCkMPzwnCh
REDASH_COOKIE_SECRET=NiTTuwP6XcvWxjO1RQc3lKfQFAG9C0dL
REDASH_SECRET_KEY=0cYKX4YAcY2ERYBJTt4gK8nS1op5yB8K
REDASH_DATABASE_URL=postgresql://postgres:upGYF9nPSdUMErOynCeKP6VCkMPzwnCh@postgres/postgres

二、把docker-compose.xml下载下来,并修改env对应的目录。
三、初始化
“`
docker-compose run –rm server create_db
“`

四、运行
“`
docker-compose up -d
“`

文档地址:https://redash.io/help/

把一个查询当成一个数据源,需要建立一个Query DataSource,再按下面一个查询写:
“`
select * from query_1;
// 上面的以query_开始后面的数据,是查询的id
“`

在Redash里更新数据,需要手动的commit

select @max_order_id:=`value` from redash_var where `var_name`='max_order_id';
select @max_order_id_new:=max(id) from `order`;

replace into redash_var (`var_name`, `value`) values ('max_order_id', @max_order_id_new);
commit;
select * from `order` where id>@max_order_id;

用Api获取结果
http://111.111.111.111:88/api/queries/3/results?api_key=xxx
post传json

{
"parameters": {
"BeginDate": "2021-01-01",
"EndDate": "2021-01-05"
},
"max_age": 1800
}

 

 

Mac操作系统PHP、MySQL等开发环境相关笔记

Mac使用

brew使用命令
https://www.cnblogs.com/miker-lcy/archive/2004/01/13/13622391.html

加入–verbose可以显示详情
brew update –verbose

安装和使用

brew install [email protected]
启动php-fpm
brew services start [email protected]

安装扩展

到指定的版本目录下,如7.4,则到:/usr/local/opt/[email protected]/bin 目录下
./pecl install redis
如果是php5.6,则要指定版本:
./pecl install https://pecl.php.net/get/redis-4.3.0.tgz
配置文件路径:
/usr/local/etc/php/8.0

如果要自己编译安装如memcache,可以从pecl上下载下来,
tar zxvf xxx.tgz后,
/usr/local/opt/[email protected]/bin/phpize
要注意下面的命令,是指定了php-config版本的
./configure –with-zlib-dir=/usr/local/Cellar/zlib/1.2.11 –with-php-config=/usr/local/opt/[email protected]/bin/php-config
make
make install
vi /usr/local/etc/php/5.6/php.ini ,加入:
extension=”memcache.so”

VSCode安装断点调试

安装xdebug扩展,在配置文件里加入:

[XDebug]
zend_extension="xdebug.so"
xdebug.mode=debug
xdebug.log_level=0
xdebug.start_with_request=yes
xdebug.client_host="127.0.0.1"
xdebug.client_port="9180"

上面的:zend_extension=”xdebug.so” 可能在安装扩展的时候已经被加上了,这里我是放在一起方便管理。
xdebug.log_level=0,如果不加这一行的话,在命令行下cli运行时,会报下面的错误:
Xdebug: [Step Debug] Could not connect to debugging client. Tried: 127.0.0.1:9180 (through xdebug.client_host/xdebug.client_port) 🙁

安装多个版本

如果要同时安装多个版本,可以先安装旧版本,再设置:
export HOMEBREW_NO_INSTALL_CLEANUP=TRUE
后,安装新版本(用install xxx.rb),这样旧版本就不会被移除掉,我们就可以用switch来切换了。

查看版本
“`
brew list –version icu4c
“`

### 退回旧版本
https://stackoverflow.com/questions/55826221/install-icu4c-version-63-with-homebrew
锁住某个包不更新
“`
brew pin 包名
“`

### 多个php版本
https://www.cnblogs.com/jingxiaoniu/p/11132807.html

### 多个版本间的切换
“`
brew switch icu4c 64.2
“`
安装PHP多版本和使用

 

开放已经放弃的包
执行以下命令,不然找不到php5
brew tap exolnet/homebrew-deprecated
上面的功能已经失效,可以删除改用下面的 2022年
brew untap exolnet/homebrew-deprecated
brew tap shivammathur/php
brew reinstall [email protected]

/usr/local/Cellar/php/7.4.12/bin/php

brew –prefix php

ln -s /usr/local/opt/[email protected]/lib/libcrypto.1.0.0.dylib /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib
ln -s /usr/local/opt/[email protected]/lib/libssl.1.0.0.dylib /usr/local/opt/openssl/lib/libssl.1.0.0.dylib

 

手动安装brew各版本
https://stackoverflow.com/questions/55826221/install-icu4c-version-63-with-homebrew/55828190#55828190

在/usr/local/opt下面有一堆的软连接,指向到/usr/local/Cellar不同的版本

If you need to have [email protected] first in your PATH run:
echo ‘export PATH=”/usr/local/opt/[email protected]/bin:$PATH”‘ >> ~/.zshrc
echo ‘export PATH=”/usr/local/opt/[email protected]/sbin:$PATH”‘ >> ~/.zshrc

For compilers to find [email protected] you may need to set:
export LDFLAGS=”-L/usr/local/opt/[email protected]/lib”
export CPPFLAGS=”-I/usr/local/opt/[email protected]/include”

安装openssl1.0
php5.6需要openssl1.0,但现在已经升级了,参照下面来安装。
https://stackoverflow.com/questions/59337838/openssl-1-0-2m-on-macos

但在安装的时候,可能会出现:
NoMethodError: undefined method `prefer_64_bit?’ for OS::Mac:Module

做法比较粗野,把openssl.rb文件里那一行删除掉就行了,直接用64的那一行。

openssl1.0和1.0安装的时候,/usr/local/opt下的符号会指向相同的目录,需要修改。

根据前缀删除redis key
redis-cli -h 1.1.1.1 -n 5 keys “ss1:en-US:cp*” | xargs redis-cli -h db-gocashback-redis.gocashback.com -n 5 del

Linux操作记录

Linux隧道端口映射和转发

1.本地ssh可以登录远程服务器,(密码或者秘钥)
2.远程数据库需要赋权限给隧道端的ip
命令:

ssh -NCPfg [email protected] -L 3388:192.168.1.1:3306

参数:
-C 使用压缩功能,是可选的,加快速度。
-P 用一个非特权端口进行出去的连接。
-f 一旦SSH完成认证并建立port forwarding,则转入后台运行。
-N 不执行远程命令。该参数在只打开转发端口时很有用(V2版本SSH支持)
-g 表示远程机器可以连接到这个端口
这里的[email protected]是连接远程服务器的用户名和IP
-L 3388:192.168.1.1:3306 这里表示建立的隧道,3388是本机端口,通过3388和远程服务器建立隧道,192.168.1.1是内网ip,可以用127.0.0.1,当然也可以用外网ip,这里要注意数据库要给这个ip赋权,因为隧道连接实际上就是数据库连接的这个ip ,后面的是远程数据库的端口
这个命令在本地运行
运行这个命令会在本地机器上开启3388端口
ss和nestat 和lsof可以看到,开启了127.0.0.1:3388
连接:
本地装好mysql客户端
mysql -u用户名 -P 3388 -h127.0.0.1 -p密码
恭喜你登陆了

ssh -NCPfg -itmp [email protected] -L 3388:127.0.0.1:3306

防火墙
https://blog.csdn.net/s_p_j/article/details/80979450

CentOS Rinetd安装

这东西在大负载使用的时候,会存在问题,最好是用nginx来做代理
下载rpm包
https://centos.pkgs.org/7/nux-misc-x86_64/rinetd-0.62-9.el7.nux.x86_64.rpm.html

rpm -ivh rinetd-0.62-9.el7.nux.x86_64.rpm

0.0.0.0 6379 db-gocashback-redis.gocashback.com 6379

systemctl start rinetd

防火墙操作

https://blog.csdn.net/s_p_j/article/details/80979450

服务操作

查看服务列表:systemctl list-unit-files
设置开机启动:systemctl enable postfix.service
取消开机启动:systemctl disable postfix.service
systemctl status/start/stop/restart postfix.service

 

安装SQUID代理

yum install squid

vim /etc/squid/squid.conf

设置指定的ip可用
acl localnet src x.x.x.x/32

设置ip隐藏
forwarded_for delete
via off
follow_x_forwarded_for deny all
request_header_access X-Forwarded-For deny all

systemctl enable squid.service
systemctl start squid.service

SSH通过跳板机登录/执行命令

ssh 
root@目标主机IP 
-i 登录目标主机的Key 
-o ProxyCommand='ssh -A ops@跳板机IP -i 登录跳板机Key -W %h:%p -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
-o UserKnownHostsFile=/dev/null 
-o StrictHostKeyChecking=no 
"需要在目标主机上执行的命令"

UserKnownHostsFile 忽略ssh目录下的known_hosts文件
StrictHostKeyChecking 不要询问是否接受key的提示
ProxyCommand 通过该参数里的命令建立通道
上面2处的-i指定的private key都是当前主机目录下的key

PS命令

查看进程树
pstree -ap 进程id

查看进程的运行时间
ps -eo pid,lstart,etime,cmd | grep nginx

 

看phpfpm在干什么

strace -p `curl -s http://127.0.0.1/fpm_status?full | grep -C 2 "Finishing" | grep "pid" | awk '{print $2}' | awk 'END {print}'`

 

linux shell 常用操作

用awk分析nginx日志

BEGIN {
#FS = "\t"
print("start...\n")
}

/deploy\.php(.*?)302/ {
print $1
}

END {
print("end.\n")
}

awk -f awk access.log 

BEGIN {
   pos = 1
   isupdate = 0
   title = ""
}

/Table_map: `55shantao_prod`\.`product_sku_data`/ {
   title = NR":"$0
}

/UPDATE `55shantao_prod`\.`product_sku_data`/ {
   print NR":"title
   print NR":"$0
   isupdate = 1
}


{
if (isupdate == 1 && pos < 28) {
   print NR":"$0
   pos = pos + 1
} else {
   pos = 1
   isupdate = 0
}
}

输出百度抓取的POST的ID和时间

more www.bianhua8.com.log | grep "Baiduspider" | grep "/post/" | awk 'BEGIN{FS=" "}{match($0, /\[(.+)\].+?post\/([0-9]+)/, m);print NR""m[1]"\t"m[2];}'

把找出执行时间大于多少ms的日志,注意:下面的match只支持在gawk里使用,有的linux默认是gawk,但在mac下面,需要安装gawk才支持,不然会报错。

more access.log-20210630 | awk '{match($0,/urt="([0-9\.]+)"/, m)}m[1]>0.1{print m[1]"\t"$7}' | grep -v "search"

tail -f xxxx.com.access.log | awk '{match($0,/urt="([0-9\.]+)"/, m)}m[1]>0.5{print $4"]\t" m[1]"s\t"$7}'

找出最近访问次数多的ip

tail -n 50000 /data/log/nginx/www.xxx.com.access.log | awk -F' ' '{print $1}' | sort | uniq -c | sort -n

 

grep取上下几行:
-B 前几行
-C 上下几行
-A 后几行

gerp用正则匹配
grep -E ‘xxxx’
但正则好像不能用\d之类的,只能用[0-9]这样

去重
cat xx.txt | sort | uniq

去重并统计行数按倒序排
cat xx.txt | sort | uniq -c | sort -r

curl显示请求时间
curl -o /dev/null -s -w 'dns解析时间:%{time_namelookup}\n连接时间:%{time_connect}\n开始传输时间:%{time_starttransfer}\ntotal:%{time_total}\n速度:%{speed_download}\n' "http://localhost/404.html"

切换用户

su xxx,切换到某用户
sudo -i,切换到管理员
sudo -u nginx php xxx.php,以某个用户运行,像一些无法登录的用户可以以这种方式执行
sudo -su nginx,可以切换到该用户去,并一直在那个用户

查看运行时间久的进程

ps aux | grep " cli.php " | sort -k 10 -n

查看网络连接状态

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

上面的$NF表示是最后一列的内容, NF表示最后一列的索引, END 是各个{}块之间需要的