咸鱼

咸鱼是以盐腌渍后,晒干的鱼

0%

wappalyzer,可以大概知道一个网站的服务器软件,使用的js库等信息。
原理的话,应该是网站响应的header信息。

以下是手动屏蔽固定的IP,还有一些方法可以自动将IP屏蔽待以后需要再研究。

1. 假设nginx的配置中有如下一个server

1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name localhost;

location / {

root /var/www/localhost;
index index.html index.htm;
}
}

2. 如果现在我需要屏蔽两个IP,加入以下三行到server节点中:

1
2
3
4
# allow 一定要在 deny 前面
allow all;
deny 123.123.123.123;
deny 123.123.123.124;
阅读全文 »

很多嵌入式设备都有接入网络的功能,那么在Linux下的C,用什么HTTP库比较合适呢?嵌入式设备资源都比较紧张,大的库肯定不是一个好的选择。
由于不是专业的,只能找到以下库:

  • libcurl
    curl-7.56.1.zip 大小是5.27MB,里面包含了supporting HTTP, HTTPS, FTP, FTPS, GOPHER, TFTP, SCP, SFTP, SMB, TELNET, DICT, LDAP, LDAPS, FILE, IMAP, SMTP, POP3, RTSP and RTMP. 所以能精简出来HTTP是没有5.27MB那么大。

    而且一般linux系统都带有curl的库,c语言可以直接引入curl的头文件。

    libcurl基本知识post和get请求

    c/c++调用libcurl库发送http请求的两种基本用法

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include<stdio.h>
    #include<curl/curl.h>
    #include<stdlib.h>

    int main(int argc, char *argv[])
    {
    CURL *curl; //定义CURL类型的指针
    CURLcode res; //定义CURLcode类型的变量,保存返回状态码

    if(argc!=2)
    {
    printf("Usage: file <url>;\n");
    exit(1);
    }

    curl = curl_easy_init(); //初始化一个CURL类型的指针

    if(curl!=NULL)
    {
    //设置curl选项.其中CURLOPT_URL是让用户指定url.argv[1]中存放的命令行传进来的网址
    curl_easy_setopt(curl,CURLOPT_URL, argv[1]);
    //调用curl_easy_perform执行我们的设置.并进行相关的操作.在这里只在屏幕上显示出来.
    res = curl_easy_perform(curl);
    //清除curl操作.
    curl_easy_cleanup(curl);
    }

    return 0;
    }
    1
    2
    3
    #编译和运行
    $ gcc test_curl.c -o test -lcurl
    $ ./test www.baidu.com
  • Tinyhttpd
    ​Tinyhttpd 是J. David Blackstone在1999年写的一个不到 500 行的超轻量型 Http Server

  • Boa
    ​Boa是一个非常小巧的web服务器,其可执行代码只有约60Kb

  • ghttp
    官网没有下载了,但根据其他下载站来看,只有144KB,要源码可以去github搜一下。封装示例

  • C++ client for making HTTP/REST requests

  • C++ Requests: Curl for People

  • tbox的http模块

  • 自己拼包

  • 无意中发现的一个库,里面封装了一些 HTTPClient 和其他IO的库

  • C++ client for making HTTP/REST requests

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
root@bogon:~# screenfetch
./+o+- root@bogon
yyyyy- -yyyyyy+ OS: Ubuntu 16.04 xenial
://+//////-yyyyyyo Kernel: x86_64 Linux 4.4.0-97-generic
.++ .:/++++++/-.+sss/` Uptime: 2d 9h 14m
.:++o: /++++++++/:--:/- Packages: 1004
o:+o+:++.`..```.-/oo+++++/ Shell: bash 4.3.48
.:+o:+o/. `+sssoo+/ CPU: 2x Intel Core i7-7500U CPU @ 2.904GHz
.++/+:+oo+o:` /sssooo. RAM: 638MiB / 974MiB
/+++//+:`oo+o /::--:.
\+/+o+++`o++o ++////.
.++.o+++oo+:` /dddhhh.
.+.o+oo:. `oddhhhh+
\+.++o+o``-````.:ohdhhhhh+
`:o+++ `ohhhhhhhhyo++os:
.o:`.syhhhhhhh/.oo++o`
/osyyyyyyo++ooo+++/
````` +oo+++o\:
`oo++.
root@bogon:~#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
root@bogon:~# linuxlogo
_,met$$$$$gg.
,g$$$$$$$$$$$$$$$P.
,g$$P"" """Y$$.".
,$$P' `$$$.
',$$P ,ggs. `$$b:
`d$$' ,$P"' . $$$ ,#.
$$P d$' , $$P ##: :## :###:
$$: $$. - ,d$$' ##' `## `#'
$$; Y$b._ _,d$P' __ ## __ ## __ _ __ _
Y$$. `.`"Y$$$$P"' ,####:## ,######. ##.#####. :### ,######. ###.####:
`$$b "-.__ ,##' `### ##: :## ###' `### ##' #: `## `###' `##:
`Y$$b ## `## ## ## ##' `## ## ___,## ##: `##
`Y$$. ## ## #######: ## ## ## .####### ##' ##
`$$b. ## ## ##' ## ## ## ##' `## ## ##
`Y$$b. ##. ,## ## ## ,## ## ## ## ## ##
`"Y$b._ :#:._,### ##:__,## ##:__,##' ,##. ##.__:##. ## ##
`"""" `:#### ### ######' `######' #### `#####"## ## ##

Linux Version 4.4.0-97-generic, Compiled #120-Ubuntu SMP Tue Sep 19 17:28:18 UTC 2017
Two 2.9GHz Intel i7 Processors, 1.9GB RAM, 11616 Bogomips Total
bogon

root@bogon:~#

阅读全文 »

spring-boot-admin 分为两部分,server和client。
其中,server是监控端,client是被监控端,client就是我们的应用项目。

Server

  1. 创建一个springboot项目,创建项目时选择ops-actuator
  2. 添加依赖,版本保持最新(参考网上教程写demo时,版本是1.3.2,一直启动不起来)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server</artifactId>
    <version>1.5.0</version>
    </dependency>
    <dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui</artifactId>
    <version>1.5.0</version>
    </dependency>
  3. 配置
1
2
3
4
5
server.port=8090
spring.application.name=Spring Boot Admin Web
spring.boot.admin.url=http://localhost:${server.port}
spring.jackson.serialization.indent_output=true
endpoints.health.sensitive=false
  1. 在SpringBootAdminWebApplication上面添加注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package com.example.admin;

    import de.codecentric.boot.admin.config.EnableAdminServer;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication
    @EnableAdminServer
    public class SpringbootDemoAdminServerApplication {

    public static void main(String[] args) {
    SpringApplication.run(SpringbootDemoAdminServerApplication.class, args);
    }
    }
  2. 启动,如果跑起来了就OK了。

  3. 浏览器访问 http://localhost:8090
    效果:
    111111111111111.png

阅读全文 »

  • 配置文件pom.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <packaging>war</packaging>
    -----------------------------------完美分割线
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
    </dependency>
    -----------------------------------完美分割线
    <build>
    <finalName>testJenkins</finalName>
    </build>
  • application.properties
    1
    2
    3
    4
    5
    # context-path 和 pom.xml的build-finalName 一致
    server.context-path=/testJenkins

    #如果有指定端口,可以去掉。
    #server.port=9990
  • 编写启动类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class TomcatServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

    //Application.class就是springboot的 @SpringBootApplication 类
    return application.sources(Application.class);
    }
    }
  • 命令打包
    1
    mvn package
    参考了此文

Bean 声明注解

  • @Service 业务逻辑层

  • @Component 组件

  • @Repository 数据访问层

  • @Controller Spring mvc 展现层

  • @Configurable 声明当前类是一个配置类!!!

  • @ComponentScan(“com.reachauto.cxn.book.test”)

    1
    2
    设置自动扫描包下面所有的
    @Service @Component @Repository @Controller
  • @EnableAsync

    1
    开启异步任务支持
  • @PropertySource(“classpath:demo.properties”)

    1
    2
    3
    4
    5
    6
    @Component
    @PropertySource("classpath:demo.properties")
    public class Demo {

    @Value("${kk.name}")
    private String aaa;
  • @EnableScheduling 注解开启对计划任务的支持

Bean 注入注解

  • @Autowired Spring 提供
  • @Resource JSR-250
    
  • @Value("xxxx") 注入普通字符串
    
  • @Value("${xxx.xxx}") 注入配置文件中字符串
    
  • @PostConstruct 标注在方法上,在构造函数执行完毕后执行
    
  • @PreDestroy Bean 标注在方法上,销毁前执行
    
  • @Async 异步方法表明,若是在class上则全是
    
  • @Scheduled 声明方法是计划任务
    
  • @Conditional() 条件注解,当满足某条件时
    

Spring MCV

阅读全文 »

如果header有下划线,是不转发的,如果一定要下划线,要在配置 http{} 加入 underscores_in_headers on;

参考

如果使用Nginx做反向代理到本地的SpringBoot服务,那么SpringBoot服务获取的远程 地址IP是nginx的,如何获取客户端的IP呢?

有一简单的方法是通过设置一个自定义Header来实现。

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name 127.0.0.1:80;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://127.0.0.1:8282/api/;
}
}

SpringBoot内获取客户端的真实IP

1
2
3
4
5
6
7
// HttpServletRequest

//这里其实是nginx的IP,则本地。
String nginxIP = request.getRemoteAddr();

//自己设置的自定义Header,为请求clicent端的IP。
String clientIP = request.getHeader("X-Real-IP");

1. 最简单的全局日志

全部server的日志都记录再统计一个log文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
http {

...

##
# Logging Settings
##

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;


server{
***
}

server{
***
}

...
}

2. server局部日志

每个server单独分配一个log文件,可以避免不同server之间的日志混淆,可以更加清晰的分析日志。

阅读全文 »

本文是对知乎的问答进行感兴趣知识提取,内容太多,以下是不完全提取,阅读原文 传送门

直播Android主播端解决方案

github

他推流用的是 JavaCV 库 ,JavaCV 是一款开源的视觉处理库,基于GPLv2协议,对各种常用计算机视觉库封装后的一组jar包,其中就有ffmpeg,可以直接拿来作为推流用。

视频直播解决方案
Android使用FFMpeg实现推送视频直播流到服务器
如何在网页端和移动端播放Rtmp和hls视频流

阅读全文 »

https://github.com/judasn/Linux-Tutorial

目录(Contents)

压缩打包

tar

1
2
3
4
5
6
# 仅打包(不压缩)
$ tar -cvf /tmp/etc.tar /etc
# gzip格式压缩( z参数 .tar.gz 或 .tgz)
$ tar -czvf /tmp/etc.tar.gz /etc
# bzip2格式压缩(j 参数 .tar.bz2)
$ tar -cjvf /tmp/etc.tar.bz2 /etc

zip 打包目录

1
$ zip -r -o -9  test.zip test/
阅读全文 »

情景

很多文章,很多用户,用户把喜欢的文章添加在账户下,方便查看自己的收藏记录,但是文章不在本地数据库。

一对多

三张表(用户表,收藏文章表,用户-收藏文章的中间表),一个用户对应多个收藏记录,用户实体类维护关系。
一个收藏记录只能被一个用户所添加,所有每次收藏,都要生成新的收藏记录。

缺点:

阅读全文 »