Unix系统中常用的信号含义

编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的),编号为32 ~ 63的信号是后来扩充的,称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队,可能会造成信号丢失,而后者不会。

下面我们对编号小于SIGRTMIN的信号进行讨论。

1~15号信号为常用信号 

1) SIGHUP
本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。
登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录,wget也能继续下载。
此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。
2) SIGINT
程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。
3) SIGQUIT
和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制.
Continue reading

批量结束linux进程

这里 php timer.php 进程是使用swoole来搞的一个crond服务,用来定时采集一些数据

用ps显示的有以下进程

root 6583 0.0 0.2 219676 4872 ? Ss 10:46 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www 7076 2.7 1.0 304928 19920 ? S 11:32 0:05 php-fpm: pool www
www 7077 3.0 1.4 312964 26940 ? S 11:32 0:05 php-fpm: pool www
www 7117 2.5 1.2 310668 23724 ? S 11:35 0:01 php-fpm: pool www
root 7121 0.0 0.2 331188 4500 ? Ssl 11:36 0:00 php timer.php
root 7122 0.0 0.2 257012 4168 ? S 11:36 0:00 php timer.php
root 7124 0.0 0.2 242940 5060 ? S 11:36 0:00 php timer.php
root 7125 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 7126 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 7127 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 7128 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 7129 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 7130 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 7131 0.0 0.2 243052 4504 ? S 11:36 0:00 php timer.php
root 25224 0.0 0.0 0 0 ? S< 2016 0:00 [kcopyd]
root 25225 0.0 0.0 0 0 ? S< 2016 0:00 [bioset]
root 25226 0.0 0.0 0 0 ? S< 2016 0:00 [dm-thin]
root 25227 0.0 0.0 0 0 ? S< 2016 0:00 [bioset]
root 25235 0.0 0.0 0 0 ? S< 2016 0:00 [xfsalloc]
root 25236 0.0 0.0 0 0 ? S< 2016 0:00 [xfs_mru_cache]
root 25804 0.0 0.0 0 0 ? S< 2016 0:00 [kworker/0:0H]
root 26091 0.0 0.0 0 0 ? S< 2016 0:47 [kworker/0:1H]

单独结束一个进程的时候,可以使用 kill -9 进程ID,而如果有许多个同命令的进程的话,则可以同样使用此命令进行批量结束

kill `ps -ef|grep 'php timer.php'| grep -v grep|awk '{print $2}'`

其中

ps -ef|grep ‘php timer.php’| grep -v grep|awk ‘{print $2}’

是用来过滤所有相关进程id

使用Let’s Encrypt 给网站加 HTTPS

2017.03.27更新:/usr/bin/letsencrypt/usr/bin/certbot 替代,更新文章中所用到的命令。参考:Archlinux Let’s Encrypt Wiki

Let’s Encrypt 证书生成不需要手动进行,官方推荐 certbot 这套自动化工具来实现。3步轻松搞定:

  1. 下载安装 certbot (Let’s Encrypt项目的自动化工具)
  2. 创建配置文件
  3. 执行证书自动化生成命令

环境:
centos7 64位
nginx

一、安装certbot

$yum -y install certbot

#检查安装是否成功

$certbot --help

如果安装过程中遇到python的问题,解决办法请参考:https://blog.haohtml.com/archives/17491
二、生成域名证书

这里使用的域名为 blog.haohtml.com, 网站根目录为 /data/wwwroot/haohtml/blog

#为一个已经存在的站点生成证书文件,一个证书可以多个域名共用,一次也可以生成多个域名谈证书(内容放在了同一个文件里),命令格式如下:
$certbot certonly –webroot -w /data/wwwroot/haohtml/htdocs -d www.example.com -d example.com -w /var/www/other -d other.example.net -d another.other.example.net

在终端里执行命令

$certbot certonly --webroot -w /data/wwwroot/haohtml/blog/ -d blog.haohtml.com

会看到以下输出信息:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for blog.haohtml.com
Using the webroot path /data/wwwroot/haohtml/blog for all unmatched domains.
Waiting for verification…
Cleaning up challenges

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/blog.haohtml.com/fullchain.pem. Your cert
will expire on 2017-09-18. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run “certbot
renew”
– If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

表示生成证书成功,证书目录为/etc/letsencrypt/live/blog.haohtml.com/,我们看以下此目录都有哪些文件

$ls -al /etc/letsencrypt/live/blog.haohtml.com/

cert.pem chain.pem fullchain.pem privkey.pem README
其中前四个文件均为连接文件

下面我们添加一个启用https的虚拟主机配置文件,内容如下

三、配置虚拟主机
添加一个blog.conf文件(nginx会加载指定目录下的所有,conf文件),内容如下(wordpress)

server {
    listen 443;
    server_name blog.haohtml.com;
    root /data/wwwroot/haohtml/blog;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/blog.haohtml.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blog.haohtml.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/blog.haohtml.com/chain.pem;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security max-age=15768000;
    ssl_stapling on;
    ssl_stapling_verify on;


    location / {
            index index.html index.php index.htm index.shtml;
    }


    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php?xml_sitemap=params=$2" last;
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last;
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php?xml_sitemap=params=$2;html=true" last;
    rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last;

    if (-f $request_filename/index.html){
        rewrite (.*) $1/index.html break;
    }
    if (-f $request_filename/index.php){
                rewrite (.*) $1/index.php;
    }
    if (!-f $request_filename){
                rewrite (.*) /index.php;
    }

    location ^~ /.well-known {
        allow all;
        alias /data/wwwroot/haohtml/blog/.well-known/;
        default_type "text/plain";
        try_files $uri =404;
    }

    location ~* ^/(data|images|data|uploads)/.*\.(php|php5)$
    {
            deny all;
    }

    location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /data/wwwroot/haohtml/blog$fastcgi_script_name;
            include        fastcgi_params;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
            expires      30d;
    }

    access_log /var/log/httpd/blog/access.log;
    error_log  /var/log/httpd/blog/error.log;
}

如果使用的是Apache的话,修改如下:
修改 apache 配置文件 httpd.conf,找到以下内容并去掉前面的“#”:

LoadModule ssl_module modules/mod_ssl.so

并添加一行

Listen 443

添加虚拟主机配置文件 www.conf

    ServerAdmin admin@linuxeye.com
    DocumentRoot "/data/wwwroot/abc.cn/wwwroot"
    ServerName www.abc.cn

    ErrorLog "/data/wwwlogs/abc.cn_error_apache.log"
    CustomLog "/data/wwwlogs/abc.cn_apache.log" common

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/www.abc.cn/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www.abc.cn/privkey.pem

<Directory "/data/wwwroot/abc.cn/wwwroot">
    SetOutputFilter DEFLATE
    Options FollowSymLinks ExecCGI
    Require all granted
    AllowOverride All
    Order allow,deny
    Allow from all
    DirectoryIndex index.html index.php


四、重启Nginx,测试https是否生效

测试一下nginx配置文件是否存在错误

$/usr/local/nginx/sbin/nginx -t

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful

$/usr/local/nginx/sbin/nginx -s reload

此时,打开域名 https://xxxxx 应该可以看到效果了

五、定时更新证书

由于 [Let’s Encrypt] 的证书目前有效期为3个月,过期后可以免费重新生成证书,可视为免费证书,只需要添加一个crond脚本即可.(好像每天生成证书有次数限制,一般也用不着如此频繁的操作)

将下行添加到 /etc/crontab文件里,并设定每三个月自动更新一次(脚本不确定是否正确)或者按月份写几个,每三个月为一个周期。

0 0 1 */2 * certbot renew

或者使用静默升级,每月1号5点

00 05 01 * * /usr/bin/certbot renew --quiet && apachectl restart

命令执行过程会检查证书的到期日期,如果证书还未到期会提示你的证书尚未到期,输出如下:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/yourdomain.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
  /etc/letsencrypt/live/yourdomain.com/fullchain.pem (skipped)
No renewals were attempted.

注意:如果你创建了多个域名的证书,这里也只显示基本域名的信息,但证书更新会对证书包含的所有域名有效。
为确保证书永不过期,需要增加一个cron的定期执行任务,由于更新证书脚本首先会检查证书的到期日期,并且仅当证书距离少于30天时才会执行更新,因此可以安全的创建每周甚至每天运行的cron任务。

六、后期优化

由于我们以前网使用的是http访问,现在想平滑过度到https,而还要考虑到seo效果,如需要当用户访问http网站时让其自动转到https网站相对应的网址即可,nginx的配置:

server {
listen 80;
server_name www.abc.cn;
rewrite ^(.*) https://$server_name$1 permanent;
}

Apache的配置(在虚拟主机或者.htaccess文件配置):

RewriteEngine on
RewriteCond %{HTTP_HOST} !^443$ [NC]        
RewriteRule ^(.*) https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]

.用专业在线工具测试你的服务器 SSL 安全性
Qualys SSL Labs 提供了全面的 SSL 安全性测试,填写你的网站域名,给自己的 HTTPS 配置打个分。

参考:https://ksmx.me/letsencrypt-ssl-https/

gitlab修改时区

刚装的系统,默认时间是UTC,比北京时间少了8个小时.

修改 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml 配置文件中的 time_zone : ‘Beijing’

重启gitlab 即可

#gitlab-ctl restart

Linux系统排查

常见工作中,计算机系统的资源主要包括CPU,内存,硬盘以及网络,过度使用这些资源将使系统陷入困境。本系列一共四篇博文,结合我在实习期间的学习,介绍一些常见的Linux系统排障工具及方法。

第1篇——内存篇

第2篇——CPU篇

第3篇——磁盘I/O篇

第4篇——网络篇

 

事实上,当上述服务器系统资源中的任何一个遭遇瓶颈,都会带来服务器性能的下降,典型的症状就是系统运行迟缓。

本文从以下几个角度介绍Linux系统内存相关的排查。

1. 内存的使用率如何查看,使用率真的很高吗

2. 内存用在哪里了

3. 内存优化可以有哪些手段

linux screen 命令详解

一、背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

二、简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。 Continue reading

如何用十条命令在一分钟内检查Linux服务器性能

如果你的Linux服务器突然负载暴增,报警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?来看Netflix性能工程团队的这篇博文,看它们通过十条命令在一分钟内对机器性能问题进行诊断。
概述

通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解。

  • uptime
  • dmesg | tail
  • vmstat 1
  • mpstat -P ALL 1
  • pidstat 1
  • iostat -xz 1
  • free -m
  • sar -n DEV 1
  • sar -n TCP,ETCP 1
  • top
  • gtop

其中一些命令需要安装sysstat包,有一些由procps包提供。这些命令的输出,有助于快速定位性能瓶颈,检查出所有资源(CPU、内存、磁盘IO等)的利用率(utilization)、饱和度(saturation)和错误(error)度量,也就是所谓的USE方法。 Continue reading

让终端走代理的几种方法

方法1:

在终端中直接运行命令

export http_proxy=http://proxyAddress:port

这个办法的好处是简单直接,并且影响面很小(只对当前终端有效)。

方法2:

把代理服务器地址写入shell配置文件.bashrc或者.zshrc

直接在.bashrc或者.zshrc添加下面内容

export http_proxy="http://localhost:port" 
export https_proxy="http://localhost:port"

以使用shadowsocks代理为例,ss的代理端口为1080,那么应该设置为

export http_proxy="http://127.0.0.1:1080" 
export https_proxy="http://127.0.0.1:1080"

localhost就是一个域名,域名默认指向 127.0.0.1,两者是一样的。

然后ESC:wq保存文件,接着在终端中执行

source ~/.bashrc

或者退出当前终端再起一个终端。 这个办法的好处是把代理服务器永久保存了,下次就可以直接用了。 Continue reading