个人统计

用户名: 没楼可以吗
等级: 初来乍到
威望: 0
在线时间: 4 小时
日志总数: 394
评论数量: 16
访问次数: 245962
建立时间: 2004-04-28
RSS订阅       手机访问

博主资料

留言短消息 加为好友 收藏

用户ID:  41
昵称:  没楼可以吗
来自:  山东 聊城
年龄:  保密

日历

2019 - 4
 123456
78910111213
14151617181920
21222324252627
282930    
«» 2019 - 4 «»

最近访问

日志分类

圈子信息

好友(0)

首页 前页 后页 尾页
1页,共 0 页

日志文章列表

2019年04月03日 17:21:06

CentOS 7.1系统自动重启的Bug定位过程

【问题】

有同事反应最近有多台MongoDB的服务器CentOS 7.1系统会自动重启,分析了下问题原因。



【排查过程】

1、 检查系统日志/var/log/message,并没有记录异常信息,journalctl相关日志只记录发生过重启

2、 系统默认配置了kdump,使用crash工具分析/var/crash下的转储文件vmcore,命令如下:

crash /usr/lib/debug/lib/modules/3.10.0-327.36.3.el7.x86_64/vmlinux /tmp/vmcore

3、 可以看到kernel crash时的Call Trace,关键信息标注为黄色字体

crash> bt

PID: 9979  TASK: ffff8804b4020b80  CPU: 2  COMMAND: "crond"

#0 [ffff8804b42db778] machine_kexec at ffffffff81051e9b

#1 [ffff8804b42db7d8] crash_kexec at ffffffff810f27e2

#2 [ffff8804b42db8a8] oops_end at ffffffff8163f448

#3 [ffff8804b42db8d0] no_context at ffffffff8162f561

#4 [ffff8804b42db920] __bad_area_nosemaphore at ffffffff8162f5f7

#5 [ffff8804b42db968] bad_area at ffffffff8162f91b

#6 [ffff8804b42db990] __do_page_fault at ffffffff81642235

#7 [ffff8804b42db9f0] trace_do_page_fault at ffffffff81642403

#8 [ffff8804b42dba28] do_async_page_fault at ffffffff81641ae9

#9 [ffff8804b42dba40] async_page_fault at ffffffff8163e678

    [exception RIP: netlink_compare+11]

    RIP: ffffffff815560bb  RSP: ffff8804b42dbaf8  RFLAGS: 00010246

    RAX: 0000000000000000  RBX: 000000049f250000  RCX: 00000000c3637c42

    RDX: 00000000000026fb  RSI: ffff8804b42dbb48  RDI: 000000049f24fb78

    RBP: ffff8804b42dbb30  R8: ffff8804b42dbb44  R9: 0000000000002170

    R10: 0000000000000000  R11: ffff8804b42db966  R12: ffff88061dcd2678

    R13: ffff8804b42dbb48  R14: ffffffff815560b0  R15: ffff88061b639000

    ORIG_RAX: ffffffffffffffff  CS: 0010  SS: 0018

#10 [ffff8804b42dbb00] rhashtable_lookup_compare at ffffffff813080d0

#11 [ffff8804b42dbb38] netlink_lookup at ffffffff815569ee

#12 [ffff8804b42dbb68] netlink_getsockbyportid at ffffffff81557d8f

#13 [ffff8804b42dbb80] netlink_alloc_skb at ffffffff81557dff

#14 [ffff8804b42dbbb8] netlink_ack at ffffffff8155a8a9

#15 [ffff8804b42dbbf0] audit_receive at ffffffff811067e7

#16 [ffff8804b42dbc18] netlink_unicast at ffffffff8155a02d

#17 [ffff8804b42dbc60] netlink_sendmsg at ffffffff8155a420

#18 [ffff8804b42dbcf8] sock_sendmsg at ffffffff815112d0

#19 [ffff8804b42dbe58] SYSC_sendto at ffffffff81511841

#20 [ffff8804b42dbf70] sys_sendto at ffffffff815122ce

#21 [ffff8804b42dbf80] system_call_fastpath at ffffffff81646b49

    RIP: 00007f4ac19d5353  RSP: 00007ffe233b1fb8  RFLAGS: 00010202

    RAX: 000000000000002c  RBX: ffffffff81646b49  RCX: 0000000000000000

    RDX: 000000000000009c  RSI: 00007ffe233b1ff0  RDI: 0000000000000003

    RBP: 00007ffe233b1ff0  R8: 00007ffe233b1fe0  R9: 000000000000000c

    R10: 0000000000000000  R11: 0000000000000246  R12: ffffffff815122ce

    R13: ffff8804b42dbf78  R14: 000000000000044d  R15: 0000000000000001

ORIG_RAX: 000000000000002c  CS: 0033  SS: 002b

4、在网上搜索,定位到这是kernel Linux 3.10.0-327.36.3.el7.x86_64的bug,详细描述可以参见下面,该bug在 7.3 kernel (3.10.0-514.el7)后修复

https://bugs.centos.org/view.php?id=12012

5、 但考虑到升级系统成本较高,后面尝试定位触发条件,可以看到触发这个bug是crond命令

PID: 9979  TASK: ffff8804b4020b80  CPU: 2  COMMAND: "crond"

6、 借助systemtap工具,在发生crash的kernel函数上加探针,kernel.function("rhashtable_lookup_compare")

抓取到crond等系统命令确实会调用上面的函数



7、考虑到Mongo最近新上了一套系统监控的脚本是通过crontab调度的,而上监控之前服务器重启的情况很少,猜测可能是crontab调度系统监控采集触发了kernel bug

后面计划将采集脚本改为服务的方式观察是否可以规避触发bug



【结论】

由于已发现当前CentOS 7.1存在自动重启的bug,建议后面新上的linux服务器都采用CentOS7.4的系统

Description:  CentOS Linux release 7.1.1503 (Core)

Release:  7.1.1503

Linux 3.10.0-327.36.3.el7.x86_64

类别: 无分类 |  评论(0) |  浏览(19) |  收藏
2019年03月11日 08:57:50

Nginx配置文件(nginx.conf)配置详解,对学习Nginx很有帮助

最近正在学习Nginx,看了一些比较有用处的文章在这里与大家共分享,同时也当做是笔记的收藏,这是我学习的一种方法,每天都要学会阅读一篇文章,利用空余的时间来提升一下自己,至少能了解一下技能知识。


Nginx 总的 配置文件 位置 /usr/local/nginx/conf/nginx.conf
nginx 正则匹配
一.正则表达式匹配,其中:
o    ~ 为区分大小写匹配
o    ~* 为不区分大小写匹配
o    !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

二.文件及目录匹配,其中:
o    -f和!-f用来判断是否存在文件
o    -d和!-d用来判断是否存在目录
o    -e和!-e用来判断是否存在文件或目录
o    -x和!-x用来判断文件是否可执行

三.rewrite指令的最后一项参数为flag标记,flag标记有:
o    last 相当于apache里面的[L]标记,表示rewrite。
o    break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
o    redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
o    permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址。

使用last和break实现URI重写,浏览器地址栏不变。
使用alias指令必须用last标记;
使用proxy_pass指令时,需要使用break标记。
Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求
break标记则在本条规则匹配完成后,终止匹配。
四.NginxRewrite 规则相关指令
1.break指令
使用环境:server,location,if;
该指令的作用是完成当前的规则集,不再处理rewrite指令。

2.if指令
使用环境:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。

3.return指令
语法:return code ;
使用环境:server,location,if;
该指令用于结束规则的执行并返回状态码给客户端。
示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
location ~ .*\.(sh|bash)?$
{
return 403;
}

4.rewrite 指令
语法:rewriteregex replacement flag
使用环境:server,location,if
该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句
示例如下:
if ( $host ~* www\.(.*) )
{
set  $host_without_www $1;
rewrite  ^(.*)$  http://$host_without_www$1 permanent;
} 

5.Set指令
语法:setvariable value ; 默认值:none; 使用环境:server,location,if;
该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。
示例:set $varname "hello world";

6.Uninitialized_variable_warn指令
语法:uninitialized_variable_warnon|off
使用环境:http,server,location,if
该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。

五.Nginx的Rewrite规则编写实例
1.当访问的文件和目录不存在时,重定向到某个php文件
if ( !-e $request_filename )
{
  rewrite ^/(.*)$ index.php last;
}

2.目录对换 /123456/xxxx ====> /xxxx?id=123456
rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

3.如果客户端使用的是IE浏览器,则重定向到/ie目录下
if( $http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /ie/$1 break;
}

4.禁止访问多个目录
location ~ ^/(cron|templates)/
{
deny all;
break;
}

5.禁止访问以/data开头的文件
location ~ ^/data
{
deny all;
}

6.禁止访问以.sh,.flv,.mp3为文件后缀名的文件
location ~ .*\.(sh|flv|mp3)$
{
return 403;
}

7.设置某些类型文件的浏览器缓存时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)$
{
expires 1h;
}
8.给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志
location ~(favicon.ico)
{
log_not_found off;
expires 99d;
break;
}

location ~(robots.txt)
{
log_not_found off;
expires 7d;
break;
}

9.设定某个文件的过期时间;这里为600秒,并不记录访问日志
location ^~ /html/scripts/loadhead_1.js
{
    access_log off;
    root /opt/lampp/htdocs/web;
    expires 600;
    break;
}

10.文件反盗链并设置过期时间
这里的return412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
“rewrite ^/ http://img.linuxidc.net/leech.gif;” 显示一张防盗链图片
“access_log off;” 不记录访问日志,减轻压力
“expires 3d”  所有文件3天的浏览器缓存
location ~*^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$
{
    valid_referers none blocked *.linuxidc.com*.linuxidc.net localhost 208.97.167.194;
    if ($invalid_referer)
    {
        rewrite ^/ http://img.linuxidc.net/leech.gif;
        return 412;
        break;
    }
    access_log off;
    root /opt/lampp/htdocs/web;
    expires 3d;
    break;
}

11.只允许固定ip访问网站,并加上密码
   root /opt/htdocs/www;
  allow 208.97.167.194;
  allow 222.33.1.2;
  allow 231.152.49.4;
  deny all;
  auth_basic “C1G_ADMIN”;
  auth_basic_user_file htpasswd;


12将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html
rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

13.文件和目录不存在的时候重定向:
if (!-e $request_filename)
  {
   proxy_pass http://127.0.0.1;
  }

14.将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;

上面例子有个问题是访问/shanghai时将不会匹配
rewrite ^/([0-9a-z]+)job$ /area/$1/ last;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。
那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果
if (-d $request_filename)
{
   rewrite ^/(.*)([^/])$ http://$host/$1$2/permanent;
}

知道原因后就好办了,让我手动跳转吧
rewrite ^/([0-9a-z]+)job$ /$1job/permanent;
rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2last;
  
15.域名跳转
server
  {
    listen 80;
     server_name jump.linuxidc.com;
    index index.html index.htm index.php;
    root /opt/lampp/htdocs/www;
    rewrite ^/ http://www.linuxidc.com/;
    access_log off;
  }
  
16.多域名转向
server_name www.linuxidc.com www.linuxidc.net;
  index index.html index.htm index.php;
  root /opt/lampp/htdocs;
  if ($host ~ "linuxidc\.net") {
    rewrite ^(.*) http://www.linuxidc.com$1permanent;
  }
 
六.nginx全局变量
arg_PARAMETER #这个变量包含GET请求中,如果有变量PARAMETER时的值。
args #这个变量等于请求行中(GET请求)的参数,如:foo=123&bar=blahblah;
binary_remote_addr #二进制的客户地址。
body_bytes_sent #响应时送出的body字节数数量。即使连接中断,这个数据也是精确的。
content_length #请求头中的Content-length字段。
content_type #请求头中的Content-Type字段。
cookie_COOKIE #cookie COOKIE变量的值
document_root #当前请求在root指令中指定的值。
document_uri #与uri相同。
host #请求主机头字段,否则为服务器名称。
hostname #Set to themachine’s hostname as returned by gethostname
http_HEADER
is_args #如果有args参数,这个变量等于”?”,否则等于”",空值。
http_user_agent #客户端agent信息
http_cookie #客户端cookie信息
limit_rate #这个变量可以限制连接速率。
query_string #与args相同。
request_body_file #客户端请求主体信息的临时文件名。
request_method #客户端请求的动作,通常为GET或POST。
remote_addr #客户端的IP地址。
remote_port #客户端的端口。
remote_user #已经经过Auth Basic Module验证的用户名。
request_completion #如果请求结束,设置为OK. 当请求未结束或如果该请求不是请求链串的最后一个时,为空(Empty)。
request_method #GET或POST
request_filename #当前请求的文件路径,由root或alias指令与URI请求生成。
request_uri #包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。不能修改。
scheme #HTTP方法(如http,https)。
server_protocol #请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
server_addr #服务器地址,在完成一次系统调用后可以确定这个值。
server_name #服务器名称。
server_port #请求到达服务器的端口号。

七.Apache和Nginx规则的对应关系
Apache的RewriteCond对应Nginx的if
Apache的RewriteRule对应Nginx的rewrite
Apache的[R]对应Nginx的redirect
Apache的[P]对应Nginx的last
Apache的[R,L]对应Nginx的redirect
Apache的[P,L]对应Nginx的last
Apache的[PT,L]对应Nginx的last

例如:允许指定的域名访问本站,其他的域名一律转向www.linuxidc.net
Apache:

RewriteCond %{HTTP_HOST} !^(.*?)\.aaa\.com$[NC]
RewriteCond %{HTTP_HOST} !^localhost$
RewriteCond %{HTTP_HOST}!^192\.168\.0\.(.*?)$
RewriteRule ^/(.*)$ http://www.linuxidc.net[R,L]

Nginx:
if( $host ~* ^(.*)\.aaa\.com$ )
{
  set $allowHost '1';
}

if( $host ~* ^localhost )
{
  set $allowHost '1';
}

if( $host ~* ^192\.168\.1\.(.*?)$ )
{
  set $allowHost '1';
}

if( $allowHost !~ '1' )
{
  rewrite ^/(.*)$ http://www.linuxidc.netredirect ;
}

nginx conf 配置文件
nginx进程数,建议设置为等于CPU总核心数.

worker_processes 8;



全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

error_log /var/log/nginx/error.log info;



进程文件

pid /var/run/nginx.pid;



一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65535;



工作模式与连接数上限

events

{

  #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。

  use epoll;

  #单个进程最大连接数(最大连接数=连接数*进程数)

  worker_connections 65535;

}



设定http服务器

http

{



include mime.types; #文件扩展名与文件类型映射表

default_type application/octet-stream; #默认文件类型

#charset utf-8; #默认编码

server_names_hash_bucket_size 128; #服务器名字的hash表大小

client_header_buffer_size 32k; #上传文件大小限制

large_client_header_buffers 4 64k; #设定请求缓

client_max_body_size 8m; #设定请求缓

sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。

autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

keepalive_timeout 120; #长连接超时时间,单位是秒



#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;



#gzip模块设置

gzip on; #开启gzip压缩输出

gzip_min_length 1k; #最小压缩文件大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_comp_level 2; #压缩等级

gzip_types text/plain application/x-javascript text/css application/xml;

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用



upstream blog.ha97.com {

#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。

server 192.168.80.121:80 weight=3;

server 192.168.80.122:80 weight=2;

server 192.168.80.123:80 weight=3;



}



虚拟主机的配置

server

{



listen 80;    #监听端口



    server_name aa.cn www.aa.cn ; #server_name end  #域名可以有多个,用空格隔开



index index.html index.htm index.php;  # 设置访问主页



    set $subdomain '';  # 绑定目录为二级域名 bbb.aa.com  根目录 /bbb  文件夹

    if ( $host ~* "(?:(\w+\.){0,})(\b(?!www\b)\w+)\.\b(?!(com|org|gov|net|cn)\b)\w+\.[a-zA-Z]+" ) { set $subdomain "/$2"; }



root /home/wwwroot/aa.cn/web$subdomain;# 访问域名跟目录 



include rewrite/dedecms.conf; #rewrite end  #载入其他配置文件





location ~ .*.(php|php5)?$

{

  fastcgi_pass 127.0.0.1:9000;

  fastcgi_index index.php;

  include fastcgi.conf;

}

#图片缓存时间设置

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$

{

  expires 10d;

}

#JS和CSS缓存时间设置

location ~ .*.(js|css)?$

{

  expires 1h;

}



}



日志格式设定



log_format access '$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/ha97access.log access;



#对 "/" 启用反向代理

location / {



proxy_pass http://127.0.0.1:88;

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#以下是一些反向代理的配置,可选。

proxy_set_header Host $host;

client_max_body_size 10m; #允许客户端请求的最大单文件字节数

client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,

proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)

proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)

proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小

proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置

proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)

proxy_temp_file_write_size 64k;

#设定缓存文件夹大小,大于这个值,将从upstream服务器传



}

设定查看Nginx状态的地址



location /NginxStatus {



stub_status on;

access_log on;

auth_basic "NginxStatus";

auth_basic_user_file conf/htpasswd;

#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。



}



#本地动静分离反向代理配置

#所有jsp的页面均交由tomcat或resin处理

location ~ .(jsp|jspx|do)?$ {



proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://127.0.0.1:8080;



}

#所有静态文件由nginx直接读取不经过tomcat或resin

location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

{   expires 15d;   }

location ~ .*.(js|css)?$

{   expires 1h;   }



}

nginx 在thinkphp 的url 重写
在/usr/local/nginx/conf/vhost/你的域名配置文件 中添加

location / {

  if (!-e $request_filename) {

  rewrite ^/(.*)/(.*)/(.*)/*$ /index.php?m=$1&c=$2&a=$3 last;  # thinkphp 的配置文件中 'URL_MODEL' => 1  PATHINFO模式



  #或者  rewrite  ^(.*)$  /index.php?s=$1  last;     # thinkphp 的配置文件中 'URL_MODEL' =>3  兼容模式



  #或者  rewrite  /(.*)$  /index.php/$1  last;          # thinkphp 的配置文件中 'URL_MODEL' => 2  REWRITE模式



  break;

  }

}

路径 pathinfo 模式[ thinkphp ] 添加
location ~ \.php(.*)$ {

  fastcgi_pass 127.0.0.1:9000;

  fastcgi_index index.php;

  fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;

  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

  fastcgi_param PATH_INFO $fastcgi_path_info;

  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;

  include fastcgi_params;

}

重写 url +省略index.php
location / {
  try_files $uri /index.php?$uri;
}
nginx -s reload 或者 /usr/local/nginx/sbin/nginx -s reload 重新加载Nginx配置文件
文章中的tp是 thinkphp 3.2.3  ,5.0 的未测试

类别: 无分类 |  评论(0) |  浏览(28) |  收藏
2019年02月22日 11:14:45

groupadd xxx cannot open /etc/group useradd :cannot open /etc/passwd

groupadd xxx时报错:
groupadd : cannot open /etc/group


解决方法:
root:chattr -i /etc/gshadow
root:chattr -i /etc/group


useradd xxx时报错:
useradd :cannot open /etc/passwd


解决方法:
root:chattr -i /etc/shadow
root: chattr -i /etc/passwd

类别: 无分类 |  评论(0) |  浏览(12) |  收藏
2019年01月30日 21:23:37

此Flash Player与您的地区不相容 Chrome 谷歌浏览器播放Flash视频提示

我的解决方法,参考了这个贴吧的内容:http://tieba.baidu.com/p/5738205192

具体步骤:
打开Chrome 谷歌浏览器,输入about:plugins (chrome://plugins/) 选择显示详细信息,可以看到现在的Adobe Flash Player的文件位置,我的是这样的:
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\PepperFlash\...
于是我打开文件夹:C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\
关闭Chrome 谷歌浏览器;
在PepperFlash文件夹上点右键,点“属性”,点“安全”选项卡,点“编辑(E)...”,打开后,将所有的 “组或用户名” 选中后,权限设置区域,拒绝这一列,全部打勾,点确定,一般会出来一个提示,选能够继续设置的按钮。
启动Chrome 谷歌浏览器,这时,那个PepperFlash目录的dll无法加载了,浏览器会启用自带的或其他可用的Flash Player 版本
我的是禁用后就使用了另外一个可用的Flash Player 版本,是C:\WINDOWS\SysWOW64\Macromed\Flash\pepflashplayer32_32_0_0_114.dll

再使用,Adobe Flash Player已经正常了

类别: 无分类 |  评论(0) |  浏览(26) |  收藏
2019年01月13日 17:32:30

Ecshop如何解决Deprecated: preg_replace()报错

https://www.cnblogs.com/jesu/p/5253615.html

安装Ecshop后,运行出现各种问题,其中 Deprecated: preg_replace() 之类的报错最多,下面贴出解决方案:



错误原因:

  preg_replace() 函数中用到的修饰符 /e 在 PHP5.5.x 中已经被弃用了。

  如果你的PHP版本恰好是PHP5.5.X,那你的ECSHOP肯定就会报类似下面这样的错误:

  Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in......



解决办法:

  1. Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in \includes\cls_template.php on line 300   

    原有内容:

      return preg_replace("/{([^\}\{]*)}/e", "\$this->select('\\1');", $source);

    修改后内容:

      return preg_replace_callback("/{([^\}\{]*)}/", function($r) { return $this->select($r[1]); }, $source);



  2. Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in \includes\cls_template.php on line 491

    原有内容:

      $out = "<?php " . '$k = ' . preg_replace("/(\'\\$[^,] )/e" , "stripslashes(trim('\\1','\''));", var_export($t, true)) . ";";

    修改后内容:

      $out = "<?php " . '$k = ' . preg_replace_callback("/(\'\\$[^,] )/" , function($match){return stripslashes(trim($match[1],'\''));}, var_export($t, true)) . ";"



  3. Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in \includes\cls_template.php on line 550

    原有内容:

      $val = preg_replace("/\[([^\[\]]*)\]/eis", "'.'.str_replace('$','\$','\\1')", $val);

    修改后内容:

      $val = preg_replace_callback('/\[([^\[\]]*)\]/is',function ($matches) {return '.'.str_replace('$','\$',$matches[1]);},$val);



  4. Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in \includes\cls_template.php on line 1074

    原有内容:

      $source = preg_replace($pattern, $replacement, $source);

    修改后内容:

      $source = preg_replace_callback($pattern, function ($matches) { return '{include file='.strtolower($matches[1]). '}';},$source);



  5. Strict Standards: Only variables should be passed by reference in ...\upload\includes\lib_main.php on line 1329

    原有内容:

      $ext = end(explode('.', $tmp));

    修改后内容:

      $extsub = explode('.', $tmp);

      $tmp = end($extsub);

      $tmp = basename($tmp,".$ext");



最后,将错误修改后,上传到服务器.然后进入后台,清空缓存,刷新页面即可。

类别: 无分类 |  评论(0) |  浏览(37) |  收藏
2019年01月13日 16:06:06

php新版本号废弃 preg_replace /e 修饰符,建议改用preg_replace_callback

近期serverphp版本号升级到了 5.6  发现出了非常多警告 

preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead
一開始没注意。后来发现 非常多这种警告,于是网上查了下 发现 php5.5版本号以上 就废弃了  preg_replace  函数中 /e 这个修饰符  /e 这个修饰符的意思 就是让 正则替换的 时候 替换规则 支持 php 代码 

那么 应该怎么办呢

事实上 仅仅要 把 preg_replace 里面 有 /e 修饰符的代码 改动成  preg_replace _callback  然后又一次写下就好了

样例 

最简单的 写法
reg_replace("/([A-Z])/e", "'_' . strtolower('\\1')", $str)
改动成


preg_replace("/([A-Z])/",'gwyy', $str);
function gwyy($match) {
    return  '_'.strtolower($match[1]);
}

第二个參数是个 函数名  然后在外部写一个函数  可是 我们每次定义一个函数 感觉非常麻烦  所以我们能够用匿名函数

比方说
preg_replace("/([A-Z])/e", "'_' . strtolower('\\1')", $str)
改动成


preg_replace_callback('/([A-Z])/',
                      function ($matches) {
                        return '_' . strtolower($matches[0]);
                      },
                      $str)就可以

这里特别警告 改动后 /([A-Z])/e  最后一个  e  一定要去掉 不然就出错了

假设在类里面 还能这么写


class a {

    private $joinStr = "__AAAAA__";

    public function __construct() {
        $this->joinStr = preg_replace_callback("/__([A-Z_-]+)__/sU",array($this,'gwyy'),$this->joinStr);
        echo  $this->joinStr;
    }

    public    function  gwyy($match) {
        print_r($match);
        return 'aaa';
    }

}
$a = new a();
第二个參数不是一个函数 而变成了一个数组 表示 调用 $this 类 里面的 gwyy 方法 运行  gwyy会自己主动接受到 一个 $match 參数表 

以下再看一个略微复杂点的样例

$patterns      = '/'.$begin.$parseTag.$n1.'\/(\s*?)'.$end.'/eis';
$replacement    = "\$this->parseXmlTag('$tagLib','$tag','$1','')";
$content        = preg_replace($patterns, $replacement,$content);
这个替换 使用了 类里面的自己定义方法 假设 你再 用匿名函数直接套的话 会提示 错误 由于 匿名函数上下文里面 并没有 该方法和 该变量  所以 要用 use() 来引入  同一时候 注意 一定要 把  正则里面 e  去掉


$that = $this;
$patterns      = '/'.$begin.$parseTag.$n1.'\/(\s*?)'.$end.'/is';
$content=preg_replace_callback($patterns, function($matches) use($tagLib,$tag,$that){
    return $that->parseXmlTag($tagLib,$tag,$matches[1],'');
},$content);

这里 用 $that  取代 $this;  好了 今天先记录到这里吧 。

类别: 无分类 |  评论(0) |  浏览(28) |  收藏
2019年01月02日 15:05:22

__PHP_Incomplete_Class Fatal error execute a method or access a property of an incomplete object

报错信息大体如下:解决方法附后

Warning:  Creating default object from empty value in includes.php</b> on line 408

Notice:  Undefined property: stdClass::$db in libraries.php on line 32

Notice:  mvc::check(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "doing" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition  mvc.php on line 107

__PHP_Incomplete_Class Object
(
    [__PHP_Incomplete_Class_Name] => doing
    [id] => 1
    [gid] => 1
)

Fatal error:  Models::get(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "doing" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition  in models.php on line 195

解决:

报错的原因是 session_start(); 初始化Session时,类的声明定义还没有加载出来。

如果你把对象存储到session里面,那么在读取session的地方,也必须有此对象对应的类声明才正确。

否则,从session里面分析出一个对象,却没有与之对应的类,则会提示:

__PHP_Incomplete_Class_Name02

解决方法:把类的定义写到调用session的位置之前。即将session_start(); 后移到类声明的下面

类别: 无分类 |  评论(0) |  浏览(35) |  收藏
2018年12月25日 11:27:29

如何有效的清理yum缓存 yum清理cache

两条命令
yum clean all

以及
rm -rf /var/cache/yum/*

类别: 无分类 |  评论(0) |  浏览(41) |  收藏
2018年12月25日 11:12:25

linux 写入磁盘 linux强制将数据写入磁盘,sync 防止丢失内存的数据

linux强制将数据写入磁盘,防止丢失内存的数据

sync命令文件系统管理 sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息。 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,

以提高系统的运行效率。sync命令则可用来强制将内存缓冲区中的数据立即写入磁盘中。用户通常不需执行sync命令,系统会自动执行update或bdflush操作,将缓冲区的数据写 入磁盘。只有

在update或bdflush无法执行或用户需要非正常关机时,才需手动执行sync命令。

语法:sync

buffer与cache buffer:为了解决写磁盘的效率 cache:为了解决读磁盘的效率 linux系统为了提高读写磁盘的效率,会先将数据放在一块buffer中。在写磁盘时并不是立即将数据写到磁盘中,而

是先写入这块buffer中了。此时如果重启系统,就可能造成数据丢失。 sync命令用来flush文件系统buffer,这样数据才会真正的写到磁盘中,并且buffer才能够释放出来,flush就是用来清空buffer。

sync命令会强制将数据写入磁盘中,并释放该数据对应的buffer,所以常常会在写磁盘后输入sync命令来将数据真正的写入磁盘。 如果不去手动的输入sync命令来真正的去写磁盘,linux系统也会

周期性的去sync数据。

类别: 无分类 |  评论(0) |  浏览(39) |  收藏
2018年12月25日 11:09:04

linux du 与 df 空间大小不一样 诡异的Linux磁盘空间被占用问题,根目录满了,df和du占用不一样

新公司的测试机磁盘空间空余很小,日志很多,也很大,做个日志压缩脚本,在夜里4:30自动运行,第二天后发现磁盘空间又满了,只好删除没用的日志,清空空间,可诡异的是怎么删除没用的文件,空间还是占用很大。如图



用du 根目录下,发现这些文件加一块也达不到占用的空间大小。如图



我也有遇见过此类问题,一般都是重启完事,因为磁盘坏道损坏有可能导致此问题。

或 DF -i 查看inode使用率,inode不够用也会导致此问题。可看了inode也够用。

如图





这次我度娘了一下,”磁盘空间没释放“,按一篇文章干,解决了此问题。

记录如下:

昨天协助同事搞定了一起磁盘空间被”无形”占用的疑难杂症,简要记录以备忘.

  1、用df 检查发现/根目录可用空间为0

  [root@/]#df -h

  2、用du检查发现各目录占用的空间都很少,有约3G的空间莫名其妙地丢了.

  [root@/]# du -m –max-depth=1 |sort -gr

  3、用lsof检查后才发现原因是,有文件被删除,而进程还活着,因而造成还占用空间的现象

  [root@/]# lsof |grep delete

  根据lsof列出的进程号,kill这些进程后,空间就释放出来了.

本文出自 “想飞却飞不高的猪” 博客,请务必保留此出处http://2483526.blog.51cto.com/2473526/798379



linux里的文件被删除后,空间没有被释放是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。

态为deleted为标记被删除,其实该文件并没有从磁盘中删除,类似windows下的回收站状态。

据称当有其他进程打开某文件时文件被删除,就会将该文件标记为deleted,并删除其目录节点。使用du查看时,因为没有该删除状态文件的节点信息,所以就不做统计,从而导致与df的结果不一致。

若要将deleted状态文件删除,则根据pid直接kill调相应进程即可。

找回被删除文件:

使用lsof处理文件恢复、句柄以及空间释放问题 - yexiaoxiaobai - SegmentFault
https://segmentfault.com/a/1190000000461077

类别: 无分类 |  评论(0) |  浏览(38) |  收藏
2018年12月25日 09:40:14

flash助手推荐 ffnews 峰峰新闻网

    最近发现不少人遇到过莫名的弹窗:“新鲜事FLASH 助手推荐”Flash技术即将会淘汰,然后Adobe flash想要赚最后一波,被国内2144代理,如果不从代理那装,最近更新会一直提示‘此Flash Player 与您的地区不相容,请重新安装Flash’。

相关百度搜索到的网页:
弹窗:新鲜事FLASH 助手推荐 的广告是什么鬼?
https://laod.cn/tools/adobe-flash-player.html

flash助手推荐怎么关闭
https://blog.csdn.net/chenlongjs/article/details/82876094

flash助手推荐怎么关闭
https://zhidao.baidu.com/question/717153239724100085.html

类别: 无分类 |  评论(0) |  浏览(56) |  收藏
2018年11月29日 16:00:57

OE removed access to the following unsafe attachments in your mail

OE removed access to the following unsafe attachments in your mail

解决方法:
Tools | Options | Security. Uncheck: "Do not allow attachments................."

类别: 无分类 |  评论(0) |  浏览(57) |  收藏
2018年11月25日 15:21:20

能上网但是显示红叉 win7右下角网络连接显示红叉,但可以正常上网

来自:https://jingyan.baidu.com/article/f79b7cb37a6f2d9144023ed8.html

    今天小编在使用电脑的时候,发现自己的电脑右下角的网络连接选项,已经连接上了无线网络,且能够自动上网,但是网络图标却显示感叹号,有时候现实一个“×”,右键点击网络选择属性,看到查看基本网络信息并设置连接栏目下方显示未知,今天小编就为大家分享下具体的解决办法。
方法/步骤
1右键打开开始菜单, 找到运行选项,在运行文本框输入【services.msc】命令,打开服务框
2进入服务列表,找到“DHCP Client的服务”查看其是否已经启动。
3此时我们在服务列表中找到【Network List Service】服务,此时这个服务多半已经停止,点击启动时候可能会提示我们无法启动。

此时我们打开运行输入【dcomcnfg】点击确定,进入【组件服务】
4进入组件服务,点击计算机,然后点击显示的【我的电脑】
5点击我的电脑选择【DOCM配置】,然后在右方的列表中找到【netprofm】,右键点击选择属性
6进入属性对话框,点击上方菜单栏的安全,选择【启动与激活权限】点击下方的自定义选项,然后点击后面的【编辑】
7在弹出的对话框,组和用户名下方点击【添加】选项
8在【输入对象名称来选择】里输入“LOCAL SERVICE”用户名,点击【检查名称】然后点击确定。
    LOCAL SERVICE账号添加完成后,将其下方的【本地启动】【本地激活】勾选,点击确定

9此时再次回到服务列表,点击启动【Network List Service】就会发现已经可以正常启动了,右下角的网络连接也正常了。

类别: 无分类 |  评论(0) |  浏览(60) |  收藏
2018年11月04日 11:54:36

Certbot 自动化生成 https 证书

Let’s Encrypt 是一个自动签发 https 证书的免费项目
Certbot 是 Let’s Encrypt 官方推荐的证书生成客户端工具

基本操作
0 准备工作
将要签发证书的域名(如 you.domain.com) 解析到一台可在外网正常访问的服务器

1 登录服务器
my-pc$ ssh user@you.domain.com
2 安装 certbot
这里以 Ubuntu 16.04 为例
各个系统的安装方式不一样,可以在官网首页查阅

my-server$ cat /etc/issue
Ubuntu 16.04.2 LTS \n \l

my-server$ sudo apt-get update
my-server$ sudo apt-get install software-properties-common
my-server$ sudo add-apt-repository ppa:certbot/certbot
my-server$ sudo apt-get update
my-server$ sudo apt-get install certbot
my-server$ certbot --version
certbot 0.19.0
3 检查端口占用
如果服务器上的 443 端口正在被占用,请先关闭对应的服务进程
否则可能个导致 certbot 运行出错

4 以命令交互方式开始制作证书
my-server$ certbot certonly    --------> 开启命令

Saving debug log to /var/log/letsencrypt/letsencrypt.log

How would you like to authenticate with the ACME CA?
1: Spin up a temporary webserver (standalone)
2: Place files in webroot directory (webroot)

Select the appropriate number [1-2] then [enter]
(press 'c' to cancel): 1  --------> 这里我们选择 1 standalone 模式
Plugins selected: Authenticator standalone, Installer None
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): you@gmail.com  --------> 输入你的邮箱创建账号(只有第一次使用时会出现)

Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
(A)gree/(C)ancel: a  --------> 选择 A 同意 (只有第一次使用时会出现)

Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
(Y)es/(N)o: y  --------> 选择 Y 或 N (只有第一次使用时会出现)
Please enter in your domain name(s) (comma and/or space separated)  (Enter 'c'
to cancel): you.domain.com  --------> 这里输入要制作证书的域名

Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for you.domain.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live/you.domain.com/fullchain.pem
  Your key file has been saved at:
  /etc/letsencrypt/live/you.domain.com/privkey.pem
  Your cert will expire on 2018-01-26. 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


my-server$ ls /etc/letsencrypt/live/you.domain.com/  --------> 证书文件目录
cert.pem  chain.pem  fullchain.pem  privkey.pem  README 
看到 IMPORTANT NOTES 下方出现 Congratulations 就表明证书已经成功签发
可以进入 /etc/letsencrypt/live/you.domain.com/ 目录查看相关生成的文件

进阶操作
使用 80 端口
默认 standalone 是使用 443 端口,也就是说要停止服务器现在占用 443 端口的进程
我们也可以将其改为使用 80 端口,同样道理,这时需要停止 80 端口的占用

my-server$ certbot certonly --standalone -n --agree-tos --email you@gmail.com --preferred-challenges http -d you.domain.com
-n 非交互式
--email 指定账户
--agree-tos 同意服务协议

使用 nginx 模式
安装 nginx 和插件

my-server$ apt-get install nginx
my-server$ apt-get install python-certbot-nginx
增加 nginx 配置

server {
        server_name you.domain.com;
}
制作证书

my-server$ certbot --nginx -d you.domain.com
使用 webroot 模式
standalone 需要停止服务器,nginx 模式需要修改配置,如果需要在不影响服务器正常运行的情况下制作证书,可以选择 webroot 模式
有个前提,需要你的服务的 80 端口上运行一个能处理静态文件的 web 服务,我们就以 nginx 为例 (注意,webroot + nginx 与 nginx 是完全不同的两种方式)

先确定一个 webroot 目录,这里以 /var/www/html/ 为例

server {
        listen 80 default_server;
        location / {
            alias /var/www/html/;
        }
}
重启 nginx ,制作证书

my-server$ nginx -s reload
my-server$ certbot certonly --webroot -w /var/www/html/ -d you.domain.com
在执行命令后,certbot 会向指定的 webroot 目录中添加一个随机文件,随后 letsencrypt 会通过 http 访问那个文件,比如 http://you.domain.com/.well-known/acme-challenge/gdEMr7ZXOiZE51he9QwuvnbrrTnkwlpFhNAcArBt2uE, 如果能返回正确的数据则通过认证,否则认证失败
所以,即使不使用 nginx,只要能保证你的服务器能正确的返回 webroot 下的文件就行

使用 manual 模式
manual 模式其实和 webroot 类似,主要的区别就是 certbot 自动向 webroot 添加文件的过程,变为你自己手动完成

my-server$ certbot certonly --manual -d you.domain.com

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for you.domain.com

NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
(Y)es/(N)o: y    --------> 选 Y

Create a file containing just this data:

_Pamo3hOMx37O-KHIioWO1P0hbTLZusEZ2a2iCf7PDQ.8CyQk-SfDMR10nk7DuGBFA4IEpVhm1OySU-nSItD1BE

And make it available on your web server at this URL:

http://you.domain.com/.well-known/acme-challenge/_Pamo3hOMx37O-KHIioWO1P0hbTLZusEZ2a2iCf7PDQ

Press Enter to Continue 
--------> 你需要保证 http://you.domain.com/.well-known/acme-challenge/_Pamo3hOMx37O-KHIioWO1P0hbTLZusEZ2a2iCf7PDQ
这个 url 返回的结果为 _Pamo3hOMx37O-KHIioWO1P0hbTLZusEZ2a2iCf7PDQ.8CyQk-SfDMR10nk7DuGBFA4IEpVhm1OySU-nSItD1BE (这个数据是随机的,每次都不一样)
当你做到后,按下回车键继续

Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live/you.domain.com/fullchain.pem
  Your key file has been saved at:
  /etc/letsencrypt/live/you.domain.com/privkey.pem
  Your cert will expire on 2018-01-27. 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


查看和管理当前服务器上的所有证书
my-server$ certbot certificates
使用 https 证书
以 nginx 为例

server {
    listen 80;
    listen 443 ssl;
    server_name you.domain.com;
    ssl_certificate /etc/letsencrypt/live/you.domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/you.domain.com/privkey.pem;

    # ...
}
letsencrypt 有什么限制
标准限制
同一个顶级域名下的二级域名,一周做多申请 20 个
一个域名一周最多申请 5 次
1 小时最多允许失败 5 次
请求频率需要小于 20 次/s
一个 ip 3 小时内最多创建 10 个账户
一个账户最多同时存在 300 个 pending 的审核
测试模式限制
在 certbot 命令后加上 --staging 参数,限制更松一些,但不是正式证书

同一个顶级域名下的二级域名,一周做多申请 30000 个
一个域名一周最多申请 30000 次
1 小时最多允许失败 60 次
一个 ip 3小时内最多创建 50 个账户
签发泛域名证书
先升级到最新版本的 certbot,然后

my-server$ certbot certonly -d *.aabbcc.com --manual --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns

类别: 无分类 |  评论(0) |  浏览(188) |  收藏
2018年10月27日 17:12:44

linux shell中"2>&1"含义

linux shell中"2>&1"含义

在计划任务中经常可以看到。例如我们公司的计划任务举例:
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1对于& 1 更准确的说应该是文件描述符 1,而1标识标准输出,stdout。
对于2 ,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null

可以把/dev/null 可以看作"黑洞". 它等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.

偶尔也可以把 & 在命令的最后加上,表示让程序后台执行。

为何2>&1要写在后面?

index.php task testOne >/dev/null 2>&1我们可以理解为,左边是标准输出,好,现在标准输出直接输入到 /dev/null 中,而2>&1是将标准错误重定向到标准输出,所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。

可以理解为,如果写在中间,那会把隔断标准输出指定输出的文件

你可以用

ls 2>1测试一下,不会报没有2文件的错误,但会输出一个空的文件1;
ls xxx 2>1测试,没有xxx这个文件的错误输出到了1中;
ls xxx 2>&1测试,不会生成1这个文件了,不过错误跑到标准输出了;
ls xxx >out.txt 2>&1, 实际上可换成 ls xxx 1>out.txt 2>&1;重定向符号>默认是1,错误和输出都传到out.txt了。

类别: 无分类 |  评论(0) |  浏览(81) |  收藏
2018年10月20日 09:47:12

使用nginx做反代时遇到413 Request Entity Too Large的解决方法

在使用nginx做反向代理的时候,被反代的系统在上传文件的时候遇到413 错误 :Request Entity Too Large

原因是nginx限制了上传文件的大小,在nginx中可以配置最大允许的文件大小:

打开nginx主配置文件nginx.conf,找到http{},添加
client_max_body_size 50m;

这里设置成了最大50m,你可以根据自己系统的需求自己来进行设置

类别: 无分类 |  评论(0) |  浏览(88) |  收藏
2018年10月20日 09:44:03

解决上传文件时 nginx 413 Request Entity Too Large 错误

一个使用Tomcat 发布的站点,使用Nginx做了代理,在上传文件时发生以下错误:

<html>
<head><title>413 Request Entity Too Large</title></head>
<body bgcolor="white">
<center><h1>413 Request Entity Too Large</h1></center>
<hr><center>nginx/1.10.3</center>
</body>
</html>
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->
<!-- a padding to disable MSIE and Chrome friendly error page -->在使用文件上传组件如:webuploader 上传时只会提示文件上传失败,
具体的错误需要打开浏览器的开发者工具才能看到。


产生原因:

上传文件的大小超出了 Nginx 允许的最大值,如果没有配置的话,默认是1M;

解决方法:

修改Nginx的配置文件(一般是:nginx/nginx.conf),在 http{} 段中增大nginx上传文件大小限制


#设置允许发布内容为8M
client_max_body_size 8M;
client_body_buffer_size 128k;修改完成后,测试并重新加载配置文件

./nginx.exe -t
./nginx.exe -s reload


Spring MVC环境中文件上传大小和文件类型限制以及超大文件上传bug问题



如果使用的是struts2框架,就可以在struts.xml中添加配置项:


<constant name="struts.multipart.maxSize" value="52428800" />


如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误。

post_max_size = 8M
upload_max_filesize = 6M修改完配置后,别忘记重新加载。

类别: 无分类 |  评论(0) |  浏览(75) |  收藏
2018年10月14日 11:33:00

浅析 4K 10bit和8bit有什么区别?

      我们目前主要接触到的图像多数是24bit或32bit颜色深度,它等于每通道8bit的 R、G、B或每通道8bitR、G、B、A色彩通道的相加,而8bit表示每个原色具有256个灰阶,即0-255对应色彩从黑到白的灰度级别,10bit表示单色彩通道具有1024个灰度级别,色阶范围是0-1023。8bit提供256个采样点,而10bit提供1024个采样点,其色彩精度是8bit的4倍。
      目前市销的显示器绝大多数都是6bit的TN和IPS面板,少数IPS面板可以达到8bit。国内著名的wiki、chd、hdchina等压制小组之前的作品都是8bit重编码,而官方的x264目前也只支持8bit,我们所用到的支持10bit编码的x264都是经过高手重编译的版本。普通MKV在6bit面板播放时,都是显示器以抖动(dither)的方式转换成8bit实现的。
      在此引用好像是taor大的一句话:“在二进制下对8bit的源数据进行有损编码,造成相同量化损失时,以8bit为100%的error(残差)时,9bit为50%的error,10bit为25%,12bit为6.25%……”其实就是说8bit转换为10bit是无损的,而10bit转换为8bit是有损的,换句话说,由低位深向高位深的转换是无损的,反之则是有损的。一般显示器由10位dither为8bit总要比8位dither为8bit的损失要小得多。因此,10bit片源在播放画质方面是极占优势的。
        而我们有时为了达到更佳画质,会极端的使用madvr解码器,普遍理解madvr解码器解码效果最好,那是因为madvr内部是不管你8bit还是10bit输入,都先升到16bit进行处理,最后再dither成8bitRGB32进行输出,所以它才能实现最高精度的转换和最小的error。而8bit转换成RGB后远远到达不了8bitRGB的16777216色(目前大部分高清视频就是属于8bit-Rec709的情况),只有用10bit及以上转换为8bitRGB才能达到16.7M色。
      由以上论述得出结论:10bit重编码,实际上就是用更高位深来进行数据的有损编码,而且bit越高效果越好。一句话:重编码压缩率更高,以更低的码率提供更接近原盘画质的还原效果,这已经足够我们去尝试了。各位,心里有个数没有哦?
      其实,10bit有自己的劣势,请看下文:
        1、首先也是最要命的就是不支持绝大多数的硬盘播放机,但解决方法也相对简单,由生产厂商推出相应的固件即可,问题是啥时才能推出呢?
        2、10bit不支持硬解,所以你的cpu不能太差;假如你为了追求画质而选择了madvr,那么甚至你的显卡也不要太差。
综上,10bit是否值得你去追求,呵呵,看过画质之后,自己评判吧。
续上:
        经过多次压制,得出简单硬性评判10bit码率的方法:
        相同压制参数下,10bit比8bit压制时间多20%,但画质可提升25%;
        相同体积,相同画质,10bit码率要比8bit低大约20%左右;
        相同码率,10bit比8bit体积节省将近20%左右。

类别: 无分类 |  评论(0) |  浏览(126) |  收藏
2018年07月18日 14:58:11

Nginx的 HTTP 499 状态码处理

1、前言

  今天在处理一个客户问题,遇到Nginx access log中出现大量的499状态码。实际场景是:客户的域名通过cname解析到我们的Nginx反向代理集群上来,客户的Web服务是由一个负载均衡提供外网IP进行访问,负载均衡后面挂了多个内网web站点业务服务器。出现的访问日志如下所示:



2、处理方法

    499错误是什么?让我们看看NGINX的源码中的定义:
  ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
  ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
  ngx_string(ngx_http_error_497_page), /* 497, http to https */
  ngx_string(ngx_http_error_404_page), /* 498, canceled */
  ngx_null_string,                    /* 499, client has closed connection */

     可以看到,499对应的是 “client has closed connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。

      测试nginx发现如果两次提交post过快就会出现499的情况,看来是nginx认为是不安全的连接,主动拒绝了客户端的连接.

      在google上搜索到一英文论坛上有关于此错误的解决方法:
      proxy_ignore_client_abort on;
      Don’t know if this is safe.
      就是说要配置参数 proxy_ignore_client_abort on;
      表示代理服务端不要主要主动关闭客户端连接。

      以此配置重启nginx,问题果然得到解决。只是安全方面稍有欠缺,但比总是出现找不到服务器好多了。

类别: 无分类 |  评论(0) |  浏览(115) |  收藏
2018年06月25日 15:42:15

syntax error, unexpected '[', expecting ')' php版本低不支持数组写法

因为服务器安装的是PHP5.2,所以选用Thinkphp3.1.3,在本地测试没问题,部署到服务器上就报已下错误
具体报错:Parse error: syntax error, unexpected '[', expecting ')' in /www/web/hrly/public_html/hrly/App/Common/common.php on line 14


【答】

你的PHP 版本是5.2的 你的数组写法却是5.4的 5.2中用array() 不能用[]

楼上正解 [](5.4版本以上) => array()

类别: 无分类 |  评论(0) |  浏览(126) |  收藏
« 1 2345» Pages: ( 1/20 total )