升级nginx启用http2并设置HSTS强制使用https

nginx 升级1.12 开启HTTP2

最近把网站升级到了HTTPS, 之后还将把当前一些应用的WebSocket 连接升级为 WSS连接,以安全地传输消息。最开始我本是为了测试 HTTP2 不限制请求并发数在切片请求中的优势。 但为了实现这一点,就顺手给网站在 Godaddy 上申请了域名和解析,并且通过Let’s Encrypt (这篇博文很清楚http://www.jianshu.com/p/edecc78719cb) 申请了SSL 证书。

ssllabs 安全评测 https://www.ssllabs.com/ssltest

未分类

关于OpenSSL 和 Nginx 新版本的本地编译安装就不多说了,我基本都是在linux 云服务器上搞,注意make 之前给Nginx configure 一下, 使得编译时导出这俩与HTTP2相关的module

.configure --prefix=/etc/nginx --with-http_ssl_module --with-http_v2_module

make 结束后,便会在objs 文件夹中生成按照刚才配置编译的 nginx,软连接一下即可,杀掉原来的nginx 服务实例。启动这个带有http2 module 的nginx,在网站配置中加入对端口的监听,并采用HTTP2 协议即可:

# ssl configuration
listen 443 ssl http2 default_server;
ssl on;
# ... 指定 证书和密钥地址

未分类

开启HSTS

这回主要记一下关于STS 的事儿。HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它通过服务器response header的形式告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式.

摘自:https://developer.mozilla.org
一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com。

这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。

网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求

现实案例

你连接到一个免费WiFi接入点,然后开始浏览网站,访问你的网上银行,查看你的支出,并且支付一些订单。很不幸,你接入的WiFi实际上是黑客的笔记本热点,他们拦截了你最初的HTTP请求,然后跳转到一个你银行网站一模一样的钓鱼网站。 现在,你的隐私数据暴露给黑客了。

Strict Transport Security解决了这个问题;只要你通过HTTPS请求访问银行网站,并且银行网站配置好Strict Transport Security,你的浏览器知道自动使用HTTPS请求,这可以阻止黑客的中间人攻击的把戏。

Nginx 设置HSTS

编辑你的Nginx具体网站配置文件,在SSL Configuration 中添加SSL key和cert 签名证书,并且配置add header,让每一个http response 都具有STS 字段。

// nginx 网站部分配置内容
# ssl configuration
listen 443 ssl http2 default_server;
ssl on;
ssl_certificate [cert 路径]
ssl_certificate_key [private key 路径]
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; "
  • max-age 表示STS 策略的过期时间,也就是浏览器在收到带有 Strict Transport Security – response header 多久后过期,就可以转为http 请求。
  • includeSubdomains 表明 STS 策略也应用到 当前域名的子域名。

如此这般,就已经开启了STS,这使得服务器每次response都告诉浏览器所有请求都强制使用https,就算用户手动输入http 地址也会在浏览器内部替换为https 请求,在根源上杜绝浏览器与服务器建立非安全连接。

未分类

写在最后

为什么我一定要对网站启用https,主要是为了测试 https 对数据传输的加密,网站性能。特别是涉及到用户个人聊天记录、支付信息等隐私数据,必须采用 SSL加密传输,才能防止数据传输过程被中间人劫持、篡改。
如今网络安全形式愈演愈烈,不论是阿里巴巴还是百度,都在几年前率先全站升级为HTTPS,GeoQ Ana这样的在线制图平台也采用HTTPS 来实现用户隐私数据(往往是商业数据)的上传,保证平台的数据安全性。

InnoDB关键特性之刷新邻接页-异步IO

一、刷新邻接页功能

1、工作原理

当刷新一个脏页时,innodb存储引擎会检测该页所在区(extent)的所有页,如果是脏页,那么一起进行刷新。这样做的好处显而易见,通过AIO可以将多个IO写入操作合并为一个IO操作,增大写入量,减少了物理写IO,故该工作机制在传统机械磁盘下有着显著的优势。

  • 在写入次数基本不增加的情况下,增加了写入的量;

  • 加速了脏页的回收;

  • 充分利用double write每次1M写入的特征;

  • 这个功能打开以后会发现iostat里面的wrqm(合并写)这个值会比较高;

2、问题考虑

2.1 是不是可能将不怎么脏的页进行了写入,而该页之后又会很快变成脏页?

2.2 固态硬盘有着较高的 IOPS,是否还需要这个特性?

为此,InnoDB 存储引擎从 1.2.x 版本开始提供了参数

innodb_flush_neighbors,用来控制是否启用该特性。对于传统机械硬盘建议启用该特性,而对于固态硬盘有着超高 IOPS 性能的磁盘,则建议将该参数设置为 0、即关闭此特性。

3、参数控制:innodb_flush_neighbors

mysql> show variables like '%neigh%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| innodb_flush_neighbors | 1     |  #默认刷新邻接页功能开启
+------------------------+-------+
1 row in set (0.00 sec)
  • 1,表示打开了刷新邻接页的功能,顺带着刷新在 buffer pool 中位于磁盘上相同的 extend 区的相邻的脏页。

  • 0,表示关闭刷新邻接页

  • 2 ,表示刷新在 buffer pool 中位于磁盘上相同的 extend 区的脏页。

4、Flush neighbor page的影响

  • 对于insert频繁的系统,这个功能比较适合。

  • 对于update频繁的系统,这个功能可能会带来一些副作用。

  • update顺带着刷新其他页。

  • 对于update频繁的表,这些页马上就脏了,白白浪费写负载。

二、异步IO功能

1、关于AIO与SIO

为了提高磁盘操作性能,当前的数据库系统都采用异步IO的方式来处理磁盘操作。

  • 异步IO:用户可以在发出一个IO请求后立即再发出另外一个IO请求,当全部IO请求发送完毕后,等待所有IO操作完成,这就是AIO。

  • 与AIO对应的是Sync IO,即每进行一次IO操作,需要等待此次操作结束才能继续接下来的操作。

2、开启异步IO

首先OS要有异步io,且开启,然后mysqld要链接,要不然OS异步io没有开启,数据库的异步io也起不来。(this variable applies to Linux systems only, and cannot be changed while the server is running.)

2.1 文件系统层面需要打开这个功能:一般都是默认开启的。

[root@localhost /]# ldconfig -v|grep libaio
    libaio.so.1.0.0 -> libaio.so.1.0.0
    libaio.so.1 -> libaio.so.1.0.1

2.2 AIO是数据库层面的一个特性需要打开:默认是开启,开启的native aio性能提升,可以提高到75%。

mysql> show variables like 'innodb_use_native_aio';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_use_native_aio | ON    |
+-----------------------+-------+
1 row in set (0.00 sec)

3、异步IO的好处  

  • 不用等待直接响应上一个用户的请求;

  • 多次的请求在一起排序,请求的数据页是在一起的,一次读出来,减少多次读。(数据库的读写请求队列放在文件系统中单独分配的一块小内存结构里,非文件系统的缓存)

4、wio:wait io

  • 同步IO一定会产生wait IO

  • 异步IO会降低wait IO,但是也可能会有wait IO

  • 尽量采用异步IO(性能高于同步IO)

  • 数据库层面启用异步IO

  • 文件系统层面启用异步IO,Linux具备异步IO的能力

  • 操作系统层面wio的含义理解

[root@localhost /]# sar 1
Linux 2.6.32-431.el6.x86_64 (one)     07/14/2017     _x86_64_    (6 CPU)

04:23:25 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
04:23:26 AM     all      0.17      0.00      0.33      0.00      0.00     99.50
04:23:27 AM     all      0.00      0.00      1.00      0.00      0.00     99.00
^C
[root@localhost /]# iostat 1
Linux 2.6.32-431.el6.x86_64 (one)     07/14/2017     _x86_64_    (6 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.02    0.02    0.00   99.96

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.26         6.70         4.07     619320     376232
scd0              0.00         0.00         0.00        352          0

说明进程或是线程等待io的时间,值最好是小于5,大于25一定是io有问题。

在InnoDB存储引擎中,read ahead方式的读取都是通过AIO完成,脏页的刷新,也是通过AIO完成。

配置nginx uwsgi部署Django项目

概念

  • Nginx:
    是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势

  • uwsgi:
    是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

  • 运行过程:
    nginx作为服务器的最前端,它将接受WEB的所有请求,统一管理请求。nginx把所有静态请求自己来处理(这是nginx的强项,静态文件像我们django博客项目中的static文件夹下面的图片,css,js)。然后nginx将所有的非静态请求(像显示文章的详细信息,通常这类信息都保存在数据库,因此需要调用数据库获取数据)通过uwsgi传递给Django,由django来处理,从而完成一次WEB请求。uwsgi的作用就类似一个桥接器,起到桥梁的作用。

部署环境

阿里云服务器ubuntu14.04 (域名买了还没备案,所以博客暂时是通过ip访问的)

  • python3.5.2
  • nginx 1.4.6
  • uwsgi 2.0.15
  • django 1.11.3
  • markdown 1.0.1

一:安装nginx

打开putty远程控制云服务器输入账号和密码:

sudo apt-get install update 更新ubuntu库资源
sudo apt-get install nginx  安装nginx:
service nginx restart  启动nginx(重启)这个命令在后面要常用到

访问:http://59.110.155.51(这是我的云服务器的ip)

未分类

出现上图,则说明nginx启动成功

二:安装uwsgi

sudo apt-get install python3-pip
pip3 install uwsgi

测试uwsgi,创建test.py文件(注意:Linux创建目录的命令是:mkdir,创建test.py用 “vi test.py”命令)

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]

函数名字application,这是默认的函数,uwsgi的Python加载器将会搜索这个名字
把它部署到htto端口8000(现在运行uwsgi来启动一个会把请求传递给你的wsgi应用的http服务器):

uwsgi --http :8000 --wsgi-file test.py

未分类

出现上图,则说明测试成功。

三:从github上获取django项目

sudo apt-get install git 安装git
git clone https://github.com/xuna123/Django_study1.git

四:安装django和markdwon:

pip3 install django
pip3 install markdown

五:将nginx+uwsgi部署到django博客项目

我们实现的目录:

未分类

在我们从Git拉下来Django_study1项目的时候,在子目录下回自动帮我们生成wsgi.py文件,所以我们只需要创建

myweb_uwsgi.ini配置文件。

vim myweb_uwsgi.ini

文件内容:

# Django-related settings

socket = :8000

# the base directory (full path)
chdir           = /root/Django_study1


# Django s wsgi file
module          = easyblog.wsgi

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 4

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true

文件意思:

    • socket :指定项目执行的端口号
    • chadir :指定项目的目录
    • module :可以这么来理解,对于- myweb_uwsgi.ini文件来说,与它的平级的有一个easyblog目录,这个目录下有一个wsgi.py文件
    • master :允许主线程存在(true)
    • processes:开启的进程数量(这里是开启4个进程)
    • vacuum :当服务器退出的时候自动清理环境,删除unix socket文件和pid文件

配置nginx:

接下来要做的就是修改nginx的配置文件,打开/etc/nginx/sites-available/default文件,删除所有内容,写入下面内容:

server {
    listen         8099;
    server_name    59.110.155.51
    charset UTF-8;
    access_log      /var/log/nginx/myweb_access.log;
    error_log       /var/log/nginx/myweb_error.log;

    client_max_body_size 75M;

    location / {
        include uwsgi_params;
        uwsgi_pass 59.110.155.51:8000;
        uwsgi_read_timeout 2;
    }
    location /static {
        expires 30d;
        autoindex on;
        add_header Cache-Control private;
        alias /Django_study1/blog/static;
     }
 }
  • listen 指定的是nginx代理uwsgi对外的端口号(这个要自己阿里云服务器的安全组中添加)

  • server_name : 服务器的名字,(因为暂时没有域名,就写的ip地址)

  • access_log :用来指定日志文件的存放路径

  • error_log :用来指定错误日志文件的存放路径

  • include uwsgi_params “一般来说,你只需包含uwsgi_params文件 (包含在nginx发行版本中),使用uwsgi_pass指令来设置uWSGI socket的地址。

  • uwsgi_pass 设置uwsgi服务器的协议和地址,协议可是uwsgi或suwsgi(uwsgi over ssl); 地址可以是ip地址,域名,和可选的端口。

  • uwsgi_read_timeout:指令的含义是如果视图函数处理的时间超时,uwsgi便会关闭连接,这个关闭只是针对Nginx这边的关闭,视图函数还会继续执行,处理完成后,视图函数那边会报IO写入。

  • expires 30d:意味着静态和媒体文件夹中的所有内容将在30天内由浏览器缓存,但不会删除任何内容,您将无需重新生成服务器中的任何内容。

  • autoindex on;启用目录流量, 默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间。

  • add_header Cache-Control private: HTTP协议的Cache -Control指定请求和响应遵循的缓存机制。private(默认): 只能在浏览器中缓存, 只有在第一次请求的时候才访问服务器, 若有max-age, 则缓存期间不访问服务器。

  • alias /Django_study1/blog/static; 静态文件的位置(暂时这么理解)

接下里还有 一部修改settings.py里面的8ALLOWED_HOSTS增加我们访问的ip,如下:

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['localhost','59.110.155.51']

现在我们重启nginx 和uwsgi:

service nginx restart
uwsgi --ini myweb_uwsgi.ini

未分类

配置GitLab触发jenkins自动构建项目

目的为在公司的测试环境当中一旦开发向gitlab仓库提交成功代码,gitlab通知jenkins进行构建项目、代码质量测试然后部署至测试环境,注意这只是测试环境,而生产环境依然需要手动部署代码。

1、jenkins配置

1.1 安装Gitlab Hook Plugin插件

系统管理-管理插件-可选插件-Gitlab Hook Plugin和Build Authorization Token Root Plugin

未分类

1.2 生成随机token

# openssl rand -hex 12

0f2a47c861133916d2e299e3

1.3 创建项目触发器

项目-配置-构建触发器:

http://192.168.3.199:8080/jenkins/project/web-demo

未分类

2、配置gitlab

2.1 在Git项目配置界面设置链接和token

登录gitlab,在这个项目下找到钩子配置的地方

未分类

选择项目-设置-webhooks:

插件使用介绍,https://wiki.jenkins-ci.org/display/JENKINS/Build+Token+Root+Plugin

http://192.168.3.199:8080/jenkins/buildByToken/build?job=web-demo&token=0f2a47c861133916d2e299e3

http://jenkins服务器地址:8080/buildByToken/build?job=项目名&token=token值

未分类

2.2 测试

未分类

报错:

hook executed successfully but returned http 404

本次是因为没有在项目后面加上jenkins这个路径

2.3 测试,看到显示201表示成功

3、向git服务器提交代码,验证是否可以自动部署

3.1 提交代码

[www@master code]$ git clone [email protected]:web/web-demo.git
[www@master web-demo]$ echo "Build token root plugin" > index.html 
[www@master web-demo]$ git add 'index.html'
[www@master web-demo]$ git commit -m 'build token root plugin test'
[master beb37cb] build token root plugin test
1 file changed, 1 insertion(+), 1 deletion(-)
[www@master web-demo]$ git push origin master
Counting objects: 5, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 281 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To [email protected]:web/web-demo.git
c02523b..beb37cb master -> master

3.2 jenkins服务器的日志记录

[root@node1 tomcat]# tail -f /usr/local/tomcat/logs/catalina.out

未分类

3.3 jenkins项目构建

未分类

未分类

3.4 访问web界面验证代码是否最新的

未分类

3.5 jenkins控制台输出信息

未分类

wget多线程下载工具Axel介绍

这个工具挺老了,但是挺有用,发出来存档吧。

下载与安装

  • Debian/Ubuntu
apt-get install axel
  • CentOS

  • 由于 CentOS 源里默认没有包含 axel,我们需要安装 EPEL 才能通过 yum 进行安装。

yum install epel-release
yum install axel

使用

  • 范例:axel [options] url1 [url2] [url…]
其中[options]可以包括如下参数:
--max-speed=x , -s x 最高速度x 
--num-connections=x , -n x 连接数x 
--output=f , -o f 下载为本地文件f 
--search[=x] , -S [x] 搜索镜像 
--header=x , -H x 添加头文件字符串x(指定 HTTP header) 
--user-agent=x , -U x 设置用户代理(指定 HTTP user agent) 
--no-proxy , -N 不使用代理服务器 --quiet , -q 静默模式 
--verbose ,-v 更多状态信息 
--alternate , -a Alternate progress indicator 
--help ,-h 帮助 
--version ,-V 版本信息

实例

  • 以 8 线程下载我 DD WIN 安装包,并保存文件至 / tmp 文件夹
axel -n 8 -o /tmp/ http://185.164.138.19:18910/bt/iso/win2016_vol_cn_noname%40007.gz

CentOS 6下修复wget无法下载https链接的解决方法

CentOS6下最高版本的wget是1.11,但非常遗憾的是这个版本有bug,是没办法用来下载https链接的东西的,所以有些人为了避免这种情况会帮脚本加上不检查ssl的参数–no-check-certificate,但显然这个方法我并不是特别推荐,毕竟这并不是无解的。

而解决方法其实也不难,就是自己到gnu去下载新版本的wget来进行编译替换的动作。

方法如下:

yum -y install openssl openssl-devel gcc make perl
cd ~
wget http://ftp.gnu.org/gnu/wget/wget-1.16.tar.gz
yum -y remove wget
tar -xzvf wget-1.16.tar.gz
cd wget-1.16
./configure --with-ssl=openssl
make && make install
ln -s /usr/local/bin/wget /usr/bin/wget
cd ..
rm -rf wget-1.16*

替换完毕后你就可以开心地下载了。

Linux使用split对文件进行切分和合并的方法

linux下文件分割可以通过split命令来实现,可以将一个大文件拆分成指定大小的多个文件,并且拆分速度非常的快,可以指定按行数分割和安大小分割两种模式。Linux下文件合并可以通过cat命令来实现,非常简单。

在Linux下用split进行文件分割

先看下帮助文档

Usage: split [OPTION]... [INPUT [PREFIX]]

Output fixed-size pieces of INPUT to PREFIXaa, PREFIXab, ...; default

size is 1000 lines, and default PREFIX is `x'.  With no INPUT, or when INPUT

is -, read standard input.


Mandatory arguments to long options are mandatory for short options too.

  -a, --suffix-length=N   use suffixes of length N (default 2) 指定拆分文件的后缀长度

  -b, --bytes=SIZE        put SIZE bytes per output file 按字节拆分,默认单位字节

  -C, --line-bytes=SIZE   put at most SIZE bytes of lines per output file  指定单行的最大大小,默认单位字节

  -d, --numeric-suffixes  use numeric suffixes instead of alphabetic 用数字作为拆分文件的后缀

  -l, --lines=NUMBER      put NUMBER lines per output file  按行数进行拆分

      --verbose           print a diagnostic just before each

                            output file is opened

      --help     display this help and exit

      --version  output version information and exit

模式一:指定分割后文件行数

对与txt文本文件,可以通过指定分割后文件的行数来进行文件分割。

命令:

split -l 300 large_file.txt new_file_prefix

切分后默认生成加后缀aa, ab, ac…以此类推, 当然也可以自定义后缀。

模式二:指定分割后文件大小

split -b 10m server.log waynelog

对二进制文件我们同样也可以按文件大小来分隔。

在Linux下用cat进行文件合并

命令:

cat small_files* > large_file

Linux Nginx性能调优

Nginx以高性能负载均衡、缓存和web服务器出名,支撑着世界上繁忙网站中的40%。大多数使用场景下,Nginx和Linux系统的默认配置表现较好,但是仍有必要做一些调优以期达到最佳性能。这篇文章讨论当调优系统时需要考虑的一些Nginx和Linux配置。这些配置有很多,但是在本文里我们只涉及适合大多数用户的配置。那些没有涉及到的配置,只有那些对Nginx和Linux有深入理解的人,或者Nginx专家服务团队推荐,才会考虑到。Nginx专家服务,已经和世界上一些繁忙网站合作来调优Nginx以达到最大限度的性能,并且可以对任何需要充分发挥系统能力的客户提供支持。

简介

这里假定读者对Nginx架构和配置概念有个基本了解。本文不会重复Nginx文档的内容,而是概述各种配置选项并提供相关文档链接。

调优时,有一条较好的准则是,一次只改一个配置项,如果改后没有性能上的提升,就退回为原先的值。

我们先讨论Linux调优,因为有些值会影响在Nginx配置中可以用的值。

Linux配置

现代Linux内核(2.6+)能够很好的调节各种配置,有些配置您可能想更改。如果操作系统配置太低,那么会在内核日志中看到错误信息,因此需要调节这些配置。Linux配置项很多,本文只提及那些在普通工作负载下最可能需要调优的配置项。如果需要这些配置的详细信息,请参考Linux文档。

Backlog队列

以下设置与连接及其如何排队直接相关。如果传入的连接率很高而性能水平参差不齐,比如一些连接似乎被暂停了,那么更改这些配置可能会有用。

  • net.core.somaxconn 该项设置等待被Nginx接受的连接的排队大小。由于Nginx接受连接速度非常快,这个值通常不需要非常大,但是默认值是非常低的,所以如果你有一个高流量网站,增加这个值是个好主意。如果设置过低,那么你能在内核日志中看到错误信息,这时你应该增加这个值直到没有错误信息。注意:如果你将其设置为大于512的值,你应该同时用listen指令的backlog参数匹配这个值来更改Nginx的配置。

  • net.core.netdev_max_backlog 该项设置在交由CPU处理之前网卡缓冲数据包的速率。对于拥有高带宽的机器,这个值可能需要增加。查看网卡文档寻求相关建议,或者检查内核日志相关错误信息。

文件描述符

文件描述符是一种操作系统资源,用来处理诸如连接和打开文件的事情。对每一个连接,Nginx可以用上多达两个文件描述符。例如,如果Nginx用作代理,则其中一个用于客户端连接,另一个用于连接到被代理的服务器。如果使用了HTTP keepalive,则连接描述符的使用会少得多。对于有大量连接的系统,如下设置可能需要进行调整:

  • sys.fs.file_max 这是系统范围内的文件描述符限制。
  • nofile 这是用户级别的文件描述符限制,在/etc/security/limits.conf文件中配置

临时端口

当Nginx被当作代理使用时,每一个到upstream服务器的连接都使用一个临时端口。

  • net.ipv4.ip_local_port_range 这个用来指定可以使用的起止端口号。如果你看到端口耗尽,你可以增加这个范围。常见的设置为1024到65000。

  • net.ipv4.tcp_fin_timeout 这个用于指定一个不再被使用的端口多久之后可以被另一连接再次使用。通常,这个值默认为60秒,但是可以安全地减少到30甚至15秒。

Nginx配置

下面是一些可能影响性能的Nginx指令。如前所述,我们仅讨论那些推荐大多数用户调整的指令。这里未提及到的任何指令,如果没有Nginx团队的指导,不推荐更改。

工作进程

Nginx可以运行多个工作进程,每个都能处理大量连接。你可以用如下指令控制工作进程个数以及连接如何被处理:

  • worker_processes 这个控制Nginx运行的工作进程个数。大多数情况下,一个CPU核心跑一个工作进程能够工作得很好。可以将该指令设为auto来达到与CPU核心数匹配的工作进程数。有时候,可以增加这个值,比如工作进程需要处理大量磁盘IO操作的时候。这个值默认为1。

  • worker_connections 这个表示每个工作进程同时能够处理的最大连接数。默认值是512,但是大多数系统能处理更大的值。这个值该设为多少取决于服务器硬件配置以及流量的特性,可以通过测试来发现。

Keepalives

持久连接可以减少打开和关闭连接所需要的CPU和网络开销,因而对性能有重大影响。Nginx终止所有客户端连接,并具有到upstream服务器的单独连接。Nginx支持客户端和upstream服务器的持久连接。如下指令涉及客户端持久连接:

  • keepalive_requests 这表示客户端能在单个持久连接上发送多少请求。默认值是100,可以设置成更高的值,这在负载生成器从单个客户端发送大量请求的测试场景中非常有用。

  • keepalive_timeout 表示一个空闲持久连接保持打开状态多长时间。

如下指令涉及upstream持久连接:

  • keepalive 这个指定每个工作进程连接到upstream服务器的空闲持久连接数量。这个指令没有默认值。

为了启用到upstream的持久连接,需要增加如下指令:

  • proxy_http_version 1.1;

  • proxy_set_header Connection “”;

Access日志

记录每个请求需要花费CPU和IO周期,减少这种影响的一种方法是启用access日志缓冲。这将导致Nginx缓冲一系列日志条目,然后一次性写入文件而不是单个单个写入。通过指定access_log指令的”buffer=size”选项可以打开access日志缓冲,该设置指定要使用的缓冲区的大小。你还可以使用”flush=time”选项告诉Nginx多长时间后把缓冲区中的条目写入文件。定义了这两个选项后,当缓冲区放不下下一条日志,或者缓冲区中的条目超过了flush参数指定的时间,Nginx会将缓冲区中的条目写入日志文件。当工作进程重新打开日志文件或者关闭时,缓冲区中的条目也会被写入文件。也可以完全禁用access日志记录。

Sendfile

Sendfile是一个操作系统特性,可以在Nginx上启用。它通过在内核中从一个文件描述符向另一个文件描述符复制数据,往往能达到零拷贝,因而可以提供更快的TCP数据传输。Nginx可以使用该机制将缓存或者磁盘上的内容写到socket,无需从内核空间到用户空间的上下文切换,因而非常快并且使用较少的CPU开销。由于数据永远不会触及用户空间,所以不可能把需要访问数据的过滤器插入到处理链中,不能使用任何需要改变内容的Nginx过滤器,比如gzip过滤器。Nginx默认没有启用该机制。

限制

Nginx和Nginx Plus允许设置各种限制,用来控制客户端资源消耗,以防影响系统性能以及用户体验和安全。以下是一些相关指令:

  • limit_conn / limit_conn_zone 这些指令可以用来限制Nginx允许的连接数,比如来自单个客户端IP地址的连接数。这可以防止单个客户端打开太多连接而消耗太多资源。

  • limit_rate 这个用来限制客户端在单个连接上允许使用的带宽。这可以防止某些客户端导致系统超载,因而有利于为所有客户端提供QoS保证。

  • limit_req / limit_req_zone 这些指令可以用来限制Nginx的请求处理速率。与limit_rate一起,可以防止某些客户端导致系统超载,因而有利于为所有客户端提供QoS保证。这些指令也可以用来增强安全性,尤其是对登录页面,通过限制请求速率,使得其对人类用户是合适的,而会减慢试图访问你的应用的程序。

  • max_conns 这个用来限制同时连接到upstream组中单个服务器的最大连接数。这可以防止upstream服务器超载。默认值是0,表示没有限制。

  • queue 如果设置了max_conns,那么queue指令用来决定当一个请求由于upstream组中没有可用服务器或者这些服务器达到max_conns限制而不能得到处理时会发生什么。这个指令用来设定有多少请求将会排队以及排多久。如果没有设置这个指令,就不会有排队行为。

其它考虑

Nginx还有一些特性可以用来提高web应用的性能。这些特性不常出现在调优讨论中,但是有必要一提,因为它们的影响也可能比较可观。我们将讨论这些特性中的两个。

缓存

对于一个为一组web服务器或者应用服务器作负载均衡的Nginx实例来说,启用缓存可以显著地降低响应时间,同时能显著减轻后端服务器的负载。缓存本身就是一个主题,这里不会讨论。Nginx缓存配置的更多信息请参考:Nginx管理指南 – 缓存。

压缩

压缩响应可以大大减小响应的大小,减少带宽占用。不过,这需要CPU资源来处理压缩,所以最好在值得减少带宽占用的情况下使用。需要注意的是,不能对已经压缩的东西(比如jpeg图片)再次启用压缩。Nginx压缩配置的更多信息请参考:Nginx管理指南 – 压缩和解压缩。

linux sed在指定的行添加内容

在Linux的一些配置中总会要进行某个文件中的某行的操作,进行增加,修改,删除等操作。

而这里主要是进行的是指定的行添加数据的操作:

脚本如下:

sed -i '3i asdf 1.sh' 1.sh

这个就是在1.sh中的第3行加入asdf的数据。

首先看1.sh内容如下:

未分类

执行sed命令如下:

未分类

这个就是一个比较简单的操作,比较实用。

Linux du查看使用空间命令详解

说明

Linux du 命令也是查看使用空间的,但是与 df 命令不同的是linux du 命令是对文件和目录磁盘使用的空间的查看,还是和 du 命令有一些区别的.

命令格式

du [选项][文件]

命令功能

显示每个文件和目录的磁盘使用空间。

命令参数

参数                                    详解
-a或-all                           显示目录中个别文件的大小。
-b或-bytes                         显示目录或文件大小时,以byte为单位。
-c或–total                         除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
-k或–kilobytes                         以KB(1024bytes)为单位输出。
-m或–megabytes                         以MB为单位输出。
-s或–summarize                         仅显示总计,只列出最后加总的值。
-h或–human-readable                以K,M,G为单位,提高信息的可读性。
-x或–one-file-xystem                   以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
-L<符号链接>或–dereference<符号链接>    显示选项中所指定符号链接的源文件大小。
-S或–separate-dirs                 显示个别目录的大小时,并不含其子目录的大小。
-X<文件>或–exclude-from=<文件>         在<文件>指定目录或文件。
–exclude=<目录或文件>                  略过指定的目录或文件。
-D或–dereference-args                  显示指定符号链接的源文件大小。
-H或–si  与-h参数相同,但是K,M,G是以1000为换算单位。
-l或–count-links                   重复计算硬件链接的文件。

使用实例

显示当前目录或者文件所占空间

命令:

du

输出:

4       ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/flex
4       ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/flex-resource-production
4       ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/flex-resource-test
4       ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/gradle-resources-production
4       ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/gradle-resources-test
4       ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/gwt
84      ./.IntelliJIdea14/system/compile-server/spark_test_2956500d/targets/java-production/spark_test/src-out
88      ./.IntelliJIdea14/system/compiler/accessmodifier.d136518b/.caches/jasper_validator
88      ./.IntelliJIdea14/system/compiler/accessmodifier.d136518b/.caches
10000 c:userzang
......

把当前目录下面所有的文件都列出来.

说明:

只显示当前目录下面的子目录的目录大小和当前目录的总的大小,最下面的10000为当前目录的总大小

显示指定文件所占空间

命令:

du file_name

输出:

$ du Untitled5.ipynb
4       Untitled5.ipynb

查看指定目录的所占空间

命令:

du path

输出:

8       perl5/lib/perl5/x86_64-linux-thread-multi/auto/Devel/StackTrace
12      perl5/lib/perl5/x86_64-linux-thread-multi/auto/Devel
4280    perl5/lib/perl5/x86_64-linux-thread-multi/auto
......
12      perl5/lib/perl5/Devel/StackTrace
32      perl5/lib/perl5/Devel
18632   perl5/lib/perl5
18636   perl5/lib
112     perl5/bin
30284   perl5

显示多个文件所占空间

命令:

du file1 file2

输出:

[root@master ~]# du anaconda-ks.cfg a.pl
4       anaconda-ks.cfg
4       a.pl
[root@master ~]#

只显示总和的大小

命令:

du -s

输出:

[root@master ~]# du -s
4110140 .
[root@master ~]#

方便阅读的格式显示

命令:

du -h test

输出:

[root@localhost soft]# du -h test
608K    test/test6
308K    test/test4
4.0K    test/scf/lib
4.0K    test/scf/service/deploy/product
4.0K    test/scf/service/deploy/info
12K     test/scf/service/deploy
16K     test/scf/service
4.0K    test/scf/doc
4.0K    test/scf/bin
32K     test/scf
8.0K    test/test3
1.3M    test

文件和目录都显示

命令:

du -ah test

输出:

[root@localhost soft]# du -ah test
4.0K    test/log31.tar.gz
4.0K    test/test13.tar.gz
0       test/linklog.log
0       test/test6/log2014.log
300K    test/test6/linklog.log
0       test/test6/log2015.log
4.0K    test/test6/log2013.log
300K    test/test6/log2012.log
0       test/test6/log2017.log
0       test/test6/log2016.log
608K    test/test6
0       test/log2015.log
0       test/test4/log2014.log
4.0K    test/test4/log2013.log
300K    test/test4/log2012.log
308K    test/test4
4.0K    test/scf/lib
4.0K    test/scf/service/deploy/product
4.0K    test/scf/service/deploy/info
12K     test/scf/service/deploy
16K     test/scf/service
4.0K    test/scf/doc
4.0K    test/scf/bin
32K     test/scf
4.0K    test/log2013.log
300K    test/log2012.log
0       test/log2017.log
0       test/log2016.log
4.0K    test/log30.tar.gz
4.0K    test/log.tar.bz2
4.0K    test/log.tar.gz
0       test/test3/log2014.log
4.0K    test/test3/log2013.log
8.0K    test/test3
4.0K    test/scf.tar.gz
1.3M    test

显示几个文件或目录各自占用磁盘空间的大小,还统计它们的总和

命令:

[root@master v2.0]# du -ch sorted_hsa_1132_isopiR.sta dre_58_isopiR_delEditing_sta.sta

输出:

[root@master v2.0]# du -ch sorted_hsa_1132_isopiR.sta dre_58_isopiR_delEditing_sta.sta
1.1G    sorted_hsa_1132_isopiR.sta
718M    dre_58_isopiR_delEditing_sta.sta
1.8G    total

按照空间大小排序

命令:

du|sort -nr|more

输出:

[root@localhost test]# du|sort -nr|more
1288    .
608     ./test6
308     ./test4
32      ./scf
16      ./scf/service
12      ./scf/service/deploy
8       ./test3
4       ./scf/service/deploy/product
4       ./scf/service/deploy/info
4       ./scf/lib
4       ./scf/doc
4       ./scf/bin
[root@localhost test]#

输出当前目录下各个子目录所使用的空间

命令:

du -h  --max-depth=1

输出:

[root@localhost test]# du -h  --max-depth=1
608K    ./test6
308K    ./test4
32K     ./scf
8.0K    ./test3
1.3M    .
[root@localhost test]#