分类 Linux 下的文章

本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

Nginx 是一个 HTTP Server,类似的项目有 Apache、Httpd、IIS 等

1) Nginx VS Apache

  • Nginx
    • 轻量
    • 并发高:异步非阻塞,Apache 是阻塞的,默认只能同时处理 256 个请求(256 进程)
    • 高度模块化:模块编写成本低
  • Apache
    • URI Rewrite 出色
    • 模块历年沉淀,泛而全
    • 稳定、Bug 少

2) Configuration https://github.com/WarsFeng/Nginx_Configuration

基于阿里翻译的文档整理:https://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

# user nginx; # 进程运行用户
user nginx nginx; # 进程运行用户和用户组
worker_processes auto; # 进程数 auto/x 建议 CPU 线程数 + 1
worker_rlimit_nofile 65535; # 单进程最多打开的文件描述符数,由于请求分配不会均匀,建议直接设成与 ulimit -n 一致
#error_log /var/log/nginx/error.log; # 全局错误日志
error_log /var/log/nginx/error.log info; # 全局错误日志 日志类型[ debug | info | notice | warn | error | crit ]
pid /run/nginx.pid; # 进程文件

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf; # 导入其他位置配置文件

events {
    # 参考事件模型, 各类型 OS 支持的模型不同, Linux 推荐 epoll
    # [ kqueue | rtsig | epoll | /dev/poll | select | poll ]
    use epoll; 
    # 单进程最大连接数,Linux 受 Kernel sys.fs.file-max 限制
    # 修改: ulimit -SHn 65535
    worker_connections 10240;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;

    # Gzip
    gzip                on; # 开启 Gzip 压缩输出
    gzip_min_length     1k; # 设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于2k的字节数,小于2k可能会越压越大。
    gzip_buffers 4      16k;# 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。 例如 4 4k 代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。 4 8k 代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。 如果没有设置,默认值是申请跟原始数据相同大小的内存空间去存储gzip压缩结果。
    gzip_http_version 1.0; # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_comp_level 2; # 压缩级别,1-10,数字越大压缩的越好,也越占用CPU时间
    #gzip_types text/html
    gzip_types text/plain application/x-javascript text/css application/xml; # 压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_disable "MSIE [1-6]\."; # E6及以下禁止压缩
    gzip_vary on; # 给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本

    # Sendfile
    sendfile            on; # 是否调用 sendfile 函数传输文件,当磁盘 IO 压力大时可以适当关闭
    tcp_nopush          on; # 在 Linux/Unix 中优化 TCP 传输,依赖 sendfile 选项
    tcp_nodelay         on; # 将小包组成大包, 提高带宽利用率(Nagle 算法)
    autoindex off; # 开启列表访问,通常结合 fancyindex 美化目录样式
    keepalive_timeout   65; # 长连接超时时间
    types_hash_max_size 2048; # 影响散列表的冲突率,与内存占用成正比,当报错 "无法构建types_hash" 时酌情修改

    # 浏览器只识别 mime_type 来展示内容,Nginx 可以处理响应文件拓展名与 mime_type 之间的关联
    include             /etc/nginx/mime.types; # 引入 mime_type 关联表
    default_type        application/octet-stream; # 默认 mime_type 类型
    #charset utf-8; # 默认编码
    client_max_body_size 20M; # 请求体 Max 大小,通常用于上传文件大小限制

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf; # 引入外部配置文件,通常用于网站之间解耦合,即一个网站一个配置文件

    server {
        listen       80 default_server; # 监听端口,default 即请求 80 端口时默认匹配此 Server
        listen       [::]:80 default_server; # IPV6 监听
        server_name  _; # 监听域名/主机名
        root         /usr/share/nginx/html; # Server 主目录,在 location 没有匹配时会继续匹配此 Path 下的文件
        index index.html index.htm index.jsp; # 默认页面匹配
        #charset utf-8; # 编码

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf; # 引入一些默认配置

        upstream httpds { # 反向代理 Stream
            server 127.0.0.1:8080    weight=5  max_conns=800 max_fails=1  fail_timeout=20;
        }

        # location [ = | ~ | * | ^ ] uri { ... }
        # location URI {} 对当前路径及子路径下的所有对象都生效;
        # location = URI {} 注意URL最好为具体路径。 精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;
        # location ~ URI {} location ~* URI {} 模式匹配URI,此处的URI可使用正则表达式,区分字符大小写,*不区分字符大小写;
        # location ^~ URI {} 禁用正则表达式
        # 优先级:= > ^~ > |* > /|/dir/
        location / {
            # IP 访问控制
            #deny  IP / IP段
            deny  172.16.9.5;
            allow 172.16.9.0/24;192.168.0.0/16;192.0.0.0/8

            # 用户 Auth
            # 生成用户配置文件并将 wars 用户追加: htpasswd -c -d /etc/nginx/conf.d/users wars
            auth_basic  "closed site"; # 登陆提示
            auth_basic_user_file /etc/nginx/conf.d/users; # 用户配置文件

            # Nginx 访问状态监控页面
            stub_status on;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }

        access_log  "pipe:rollback logs/host.access_log interval=1d baknum=7 maxsize=2G"  main;
    }
}

本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

限制 rsync 对缓存的占用问题

1) 服务端限制

1.1) 停掉已经运行的 rsync 服务端

1.2) 创建一个 cgroup

cgcreate -g memory:rsynclimit

1.3) 限制其内存使用为 2000M

cgset -r memory.limit_in_bytes=2000M rsynclimit

1.4) 在 cgroup 中执行 rsync --daemon

cgexec -g memory:rsynclimit rsync --daemon

2) 客户端限制

2.1) 创建一个 cgroup

cgcreate -g memory:rsynclimit

2.2) 限制其内存使用为 2000M

cgset -r memory.limit_in_bytes=2000M rsynclimit

2.3) 在 cgroup 中执行 rsync 客户端操作

cgexec -g memory:rsynclimit rsync

本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

最近不知道为啥 OpenWrt 多播炸了,公司内网单线限速太慢。
想切手机热点,又有访问内网服务的需求,就可以用简单路由表实现:

sudo route delete 0.0.0.0 # Remote 掉默认路由
sudo route add -net 0.0.0.0 172.20.10.1 # 默认路由设成外网网卡设备网关
sudo route add 172.16.6.0/24 192.168.1.1 # 公司内网地址指向内网网卡网关
sudo route add 172.16.7.0/24 192.168.1.1 # 公司内网地址指向内网网卡网关

完成,MacOS 记得把 Network 管理中,Set Service Order 里设置成外网网卡优先
完毕。

[Meting]
[Music title="盗将行(翻自 花粥)" author="须臾aow/花世" url="https://mirrors.wars.cat/files/djx.mp3" pic="https://blog.wars.cat/usr/themes/moeka/img/warscat.jpg" lrc="https://mirrors.wars.cat/files/djx.lrc"/]
[/Meting]

本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

可能是世界首发的破烂指引 =。=,贼懒没有记笔记,能想起来的暂时那么多,各位看官凑活凑活看。

Partition

  • /boot vfat 1G # On the SD card
  • none swap 4G
  • / zfs 1T # USB3.0 link to hdd

config.txt

initramfs initramfs-5.4.27-raspberrypi-v8+.img followkernel

cmdline.txt

rootwait rootfstype=zfs root=ZFS=r-zcat/gentoo/os zfs.zfs_arc_max=67108864 dwc_otg.lpm_enable=0 console=tty1 console=ttyAMA0,115200 zfs_force=1

Kernel

Cryptographic API ---> <*> Deflate compression algorithm

# cat /etc/portage/package.accept_keywords/rpi 
=sys-kernel/raspberrypi-sources-5.4.9999 **
# eselect kernel list
Available kernel symlink targets:
[1]   linux-5.4.9999-raspberrypi *
# uname -a
Linux rcat 5.4.27-raspberrypi-v8+ #2 SMP Tue Mar 24 19:41:38 -00 2020 aarch64 GNU/Linux

Initramfs
Because zfs needs initramfs to mount the /, we need to generate initramfs.
Unfortunately , the initramfs generated by genkernel does not work, and genkernel-next does not support the arm64 and cross options.
So we use dracut to generate here:

# dracut --kver  5.4.27-raspberrypi-v8+

本文采用知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
访问 https://creativecommons.org/licenses/by-sa/4.0/ 查看该许可协议。

Gentoo最恐怖的事莫过于:Chromium快编译完报个Bug,遇到这种情况,修好Bug如何接着编译而不是重来呢!
在PORTDIR目录找到对应的软件包文件夹,如/usr/portage/www-client/chromium,接着找到对应版本的
ebuild文件,如chromium-xxxx.xxxx.ebuild。

ebuild chromium-xxxx.xxxx.ebuild merge

如果,当前软件包是新安装而不是更新迭代的话,需要在world里加入此软件包全包名,否则-。-,你做-c/--depclean
时,它会被!会被!clean掉!
我这里是/var/lib/portage/world

www-client/chromium
Title - Artist
0:00