Rootop 服务器运维与web架构

2021-09-01
发表者 Venus
请求头参数带下划线,后端无法接收(underscores_in_headers)已关闭评论

请求头参数带下划线,后端无法接收(underscores_in_headers)

如果在请求头中有下划线的参数时,nginx则会默认屏蔽此头信息。


比如 access_token 之类的想用来做身份认证时,就不能用下划线,要用中线 – 替代。

可以在server{}段中添加参数,允许下划线,但是不推荐:

underscores_in_headers on;

这样nginx就会接受带下划线的请求头(nginx默认配置是off)。

提及此原因的说明在此:
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/?highlight=underscores#missing-disappearing-http-headers
Missing (disappearing) HTTP Headers
If you do not explicitly set underscores_in_headers on;, NGINX will silently drop HTTP headers with underscores (which are perfectly valid according to the HTTP standard).
This is done in order to prevent ambiguities when mapping headers to CGI variables as both dashes and underscores are mapped to underscores during that process.

2021-09-01
发表者 Venus
使用ipip地址库屏蔽城市已关闭评论

使用ipip地址库屏蔽城市

ipdb和geoip2模块非常相似,前者为国内公司做的ip地址库,后者为国外搞的。不过免费版都不是非常精准。
模块地址:https://github.com/vislee/ngx_http_ipdb_module

[root@MiWiFi-RA69-srv ~]# yum install json-c json-c-devel
nginx编译时加上参数:
--add-module=/home/ngx_http_ipdb_module-master

去ipip.net下载免费版的地址库文件(https://www.ipip.net/product/ip.html#ipv4city)
最后更新时间是2019年7月,版本还是挺老了。

以下部分在http{}段配置:

ipdb /home/www/ipipfree.ipdb;
ipdb_language CN;

# 定义map
map $ipdb_city_name $allowed_city {
default yes;
"北京" no;
"上海" no;
}

以下部分在server{}段配置:

server
{
    listen 80;
    server_name www.test.com;
    index index.html;
    root /home/www/www.test.com;

	location /
	{	
		if ($allowed_city = "no")
		{
		  return 403;
		}
	}
	
	# 提供一个查询接口
	location /ip
	{
		# ipdb_specifies_addr $http_addr;
		# ipdb_language EN;
		default_type application/html;
		add_header Content-Type "text/plain;charset=utf-8";
		return 200 "country_name:$ipdb_country_name, city_name:$ipdb_city_name,raw_info:$ipdb_raw";
	}
		
    access_log  off;
    error_log  /dev/null;
}

关于模块中更多的内置变量,可以去看github中文档。

2021-08-30
发表者 Venus
linux suid sgid已关闭评论

linux suid sgid

suid、sgid实现的是让普通用户、或者属组提升权限为这个文件的所有者。
# 创建一个空文件
[root@rootop ~]# touch a
[root@rootop ~]# ll
total 4071212
-rw-r–r– 1 root root 0 Jul 23 15:49 a

# 设置SetUID
[root@rootop ~]# chmod 4777 a
[root@rootop ~]# ll
total 4071212
-rwsrwxrwx 1 root root 0 Jul 23 15:49 a

# 设置SetGID
[root@rootop ~]# chmod 2777 a
[root@rootop ~]# ll
total 4071216
-rwxrwsrwx 1 root root 0 Jul 23 15:49 a

# 设置Stick Bit,粘滞位。
[root@rootop ~]# chmod 1777 a
[root@rootop ~]# ll
total 4071216
-rwxrwxrwt 1 root root 0 Jul 23 15:49 a

# 等同于chmod u+s a 实现suid添加
# 等同于chmod g+s a 实现sgid添加
# 等同于chmod o+t a 实现stick bit添加

有时在权限位会出现大S和小s(或者是大T和小t)情况,这是由于用户、组、其它,没有执行(x)权限,添加特殊权限的时候就会变成大写S(或者大写T)。
[root@rootop ~]# chmod u+s b
[root@rootop ~]# ll
total 0
-rwSr–r– 1 root root 0 Aug 30 13:25 b

[root@rootop ~]# touch c
[root@rootop ~]# chmod u+s c
[root@rootop ~]# chmod o+t c
[root@rootop ~]# ll
-rwSr–r-T 1 root root 0 Aug 30 13:25 c

2021-08-27
发表者 Venus
自动安装anaconda(conda)已关闭评论

自动安装anaconda(conda)

想实现自动安装anaconda(conda)python多版本环境,就用了expect实现自动应答。
脚本如下:

#!/usr/bin/expect
set timeout -1
spawn sh Anaconda2-2019.10-Linux-x86_64.sh
expect "press ENTER to continue"
send "\r"

expect "from Microsoft Corporation"
send "q"

expect "Do you accept the license terms"
send "yes\r"

expect "/root/anaconda2"
send  "/usr/local/anaconda2\r"

expect "by running conda init"
send "no\r"

expect eof

[root@MiWiFi-RA69-srv ~]# chmod 777 conda.sh
[root@MiWiFi-RA69-srv ~]# ./conda

测试通过。

最后发现anaconda支持静默安装。。。

# Anaconda 静默安装
官文:https://conda.io/projects/conda/en/latest/user-guide/install/macos.html#install-macos-silent
-b: Batch mode with no PATH modifications to shell scripts. Assumes that you agree to the license agreement. Does not edit shell scripts such as , , , etc..bashrc.bash_profile.zshrc

-p: Installation prefix/path.

-f: Force installation even if prefix already exists.-p

# 静默安装方法

[root@MiWiFi-RA69-srv ~]# sh Anaconda2-2019.10-Linux-x86_64.sh -b -p /usr/local/anaconda2/

conda版本下载归档:
https://repo.anaconda.com/archive/

2021-08-16
发表者 Venus
skywalking链路追踪已关闭评论

skywalking链路追踪

把skywalking收集的数据存到elasticsearch中。
下载es版skywalking:
https://mirrors.bfsu.edu.cn/apache/skywalking/8.6.0/apache-skywalking-apm-es7-8.6.0.tar.gz

# 这里用docker启动es和kibana(仅用于展示es)
[root@ecs-791d ~]# docker run -dit --name es -v /etc/localtime:/etc/localtime -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
[root@ecs-791d ~]# docker run -dit --name kibana -v /etc/localtime:/etc/localtime --link es:elasticsearch -p 5601:5601 kibana:7.6.2

 

# 配置skywalking指定es存储
[root@ecs-791d config]# cat /home/skywalking/config/application.yml 
storage:
selector: ${SW_STORAGE:elasticsearch7}
关于es的ip端口信息,自行修改。

# 监听的端口12800和11800也在config/application.yml 中修改
core:
  selector: ${SW_CORE:default}
  default:
    restHost: ${SW_CORE_REST_HOST:0.0.0.0}
    restPort: ${SW_CORE_REST_PORT:12800}
    gRPCHost: ${SW_CORE_GRPC_HOST:0.0.0.0}
    gRPCPort: ${SW_CORE_GRPC_PORT:11800}

 

	
# skywalking 图形界面
修改webapp目录下的 webapp.yml ,端口可以自定义。
server:
  port: 40000

 

# 启动服务端
[root@ecs-791d skywalking]# cd bin
[root@ecs-791d bin]# sh startup.sh 

# 启动后会监听3个端口
[root@ecs-791d skywalking]#  netstat -tnlp | grep -E "40000|12800|11800"
tcp6       0      0 :::11800                :::*                    LISTEN      26762/java          
tcp6       0      0 :::12800                :::*                    LISTEN      26762/java          
tcp6       0      0 :::40000                :::*                    LISTEN      26832/java   

注意skywalking web管理界面没有身份认证功能,可以用nginx代理 + baseAuth
(看github老版本上有认证,未测。)

# java应用端配置
skywalking目录下的 agent 目录为应用端会用到的jar包配置等

java -javaagent:./agent/skywalking-agent.jar -Dskywalking.agent.service_name=admin -Dskywalking.collector.backend_service=127.0.0.1:11800 -jar admin.jar

PS:
skywalking-agent.jar路径要正确,最好写完整路径。
-Dskywalking.agent.service_name=admin admin为skywalking界面中会显示的应用名

参考官方文档:https://skywalking.apache.org/docs/main/v8.6.0/readme/