1. 现象
放假期间收到zabbix报警,提示主站访问不了,报502。

2.排查思路及过程
因为是过年休息,放假前又没有更新,基本可以排除是更新和配置导致的问题。ssh连上服务器发现服务器连接和资源都没问题。这是一套lnamp架构的网站,就是nginx反向代理到Apache,所以考虑是Apache的问题,于是重启httpd服务。

重启httpd服务的时候启动失败,没有看到错误,所以去查看日志文件,看到如下报错:
tail -200 /var/log/httpd/error_log

[TIME 2016] [error] SSL Library Error: -8181 Certificate has expired
[TIME 2016] [error] Unable to verify certificate 'Server-Cert'. Add "NSSEnforceValidCerts off" to nss.conf so the server can start until the problem can be resolved.
可以看到是证书过期了,并且给出了一种解决方法是添加‘NSSEnforceValidCerts off’到nss.conf服务器就可以启动,就是不验证证书过期时间。

Apache是用https需要mod_nss的模块支持,我的理解就是使用https需要安装mod_nss,下面给一个官方说明:
   The mod_nss module provides strong cryptography for the Apache Web server via the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols using the Network Security Services (NSS) security library.

我的解决方法是重新生成新的证书
cd /etc/httpd/alias
#删除旧的证书
rm -f *.db
#创建新证书
/usr/sbin/gencert /etc/httpd/alias > /etc/httpd/alias/install.log 2>&1
#查看证书信息
certutil -d /etc/httpd/alias -L -n Server-Cert
Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 3 (0x3)
    Signature Algorithm: PKCS #1 SHA-1 With RSA Encryption
    Issuer: "CN=Certificate Shack,O=example.com,C=US"
    Validity:
        Not Before: Mon Feb 15 02:05:10 2016
        Not After : Sat Feb 15 02:05:10 2020
现在可以看到证书的有效期是4年,新生成的证书到2020年过期。httpd服务可以正常启动。

启动httpd服务后发现首页还是不能访问,可以确认服务都正常启动配置没有问题。继续查看httpd的错误日志发现了新的报错:
[TIME 2016] [error] SSL Library Error: -8038 SEC\_ERROR\_NOT\_INITIALIZED  
[TIME 2016] [error] NSS_Initialize failed. Certificate database: /etc/httpd/alias.

百度了下发现是权限问题,重新授下权搞定。
chown root.apache /etc/httpd/alias/*.db
chmod 0640 /etc/httpd/alias/*.db

摘自解决一次由于SSL证书到期导致的网站不能访问的问题(Nginx,php,Apache):http://branguo.blog.51cto.com/9768383/1742157
背景:Raspberry Pi下的FreeBSD关机时候出现:

========================================================
刚搞uboot 学习下 写下来这些自己的小经验
我的终端用的是SecureCRT.exe
烧写uboot后 提示 Hit any key to stop autoboot : 几秒后 aoto运行
如果没有设置好 按键是没有用的 解决方法是:
选择 你打开的串口的会话设置  再选择 键映射  当然还有其他的方法 这里你映射几个键 既可以了

来自:http://blog.sina.com.cn/s/blog_6b94d5680100ms8g.html
SecureCRT 更改键盘映射功能 : http://blog.chinaunix.net/uid-20773865-id-4040702.html
背景:在Raspberry Pi上装了一个FreeBSD,之前是linux,用ssh连接时出现问题,这个ssh其实linux上也是一样的,于是按linux上的办法解决了该问题,重启动sshd后,用我的手机重新ssh到Raspberry pi上,提示error消失,连接正常。
root@rpi2:/usr/local # Feb 18 03:50:39 rpi2 sshd[4917]: error: Could not load host key: /etc/ssh/ssh_host_dsa_key
魅族手机ssh访问:
Feb 18 03:50:41 rpi2 sshd[4917]: error: PAM: authentication error for root from meizu-mx4-pro.lan

Could not load host key: /etc/ssh/ssh_host_dsa_key,那就生成这个key:
root@rpi2:/usr/local # ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
SHA256:0gV9unsS+HmqgE0j45aqtNQVhVsYNUiX2pgBbbmBLbM root@rpi2
The key's randomart image is:
+---[DSA 1024]----+
|   .*oB=o.       |
|   + @oo... .    |
|    =.@   .o     |
|   E *.o ..      |
|    o.+ S. .     |
|  ...B o. o      |
| o .= o  . +     |
|o .o   .  = o    |
|.o.     ...=     |
+----[SHA256]-----+

重新启动ssh服务:
root@rpi2:/usr/local # /etc/rc.d/sshd restart
Performing sanity check on sshd configuration.
Could not load host key: /etc/ssh/ssh_host_dsa_key
Stopping sshd.
Waiting for PIDS: 799.
Performing sanity check on sshd configuration.
Could not load host key: /etc/ssh/ssh_host_dsa_key
Starting sshd.



参考自:http://blog.163.com/zhengjiu_520/blog/static/3559830620118851822482/
配置FreeBSD下的Wifi主要参考这两篇文章即可,树莓派下的也大体一样一样的没有什么大的区别:
http://www.111cn.net/sys/freebsd/59534.htm
国外有一个文章在后面有写。
总之,按这样来配置连接上了家里的路由器。

Raspberry Pi Model B+ Run FreeBSD11+Apache+PHP+MySQL+Webmin+Wordpress:
http://www.bigsea.com.cn/archives/1393/

ifconfig -a时没有wlan0,是因为没有配置及没有启动服务:service netif start
root@rpi2:~ # ifconfig wlan0
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 3c:46:d8:8e:7d:dc
        inet6 fe80::3e46:d8ff:fe8e:7ddc%wlan0 prefixlen 64 tentative scopeid 0x3
        groups: wlan
        ssid HiWiFi_256ECA channel 4 (2427 MHz 11g) bssid d4:ee:07:25:6e:ca
        country US authmode WPA2/802.11i privacy ON deftxkey UNDEF
        AES-CCM 2:128-bit txpower 0 bmiss 7 scanvalid 60 bgscan
        bgscanintvl 300 bgscanidle 250 roam:rssi 7 roam:rate 5 protmode CTS
        wme roaming MANUAL
        media: IEEE 802.11 Wireless Ethernet DS/1Mbps mode 11g
        status: associated
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

其中“status: associated”表示无线网络已经连接,可以上网冲浪了。
固定你的 resolv.conf
如果你用DHCP,有一个问题可能会不断地搔扰你,就是/etc/resolv.conf里所记录的 DNS 会时不时地被修改。当然除了暴力地
代码如下  复制代码
#chflags schg /etc/resolv.conf

让它不能被修改外,还可以很简单地解决此问题,就是往/etc/dhclient.conf里添加
代码如下  复制代码

prepend domain-name-servers 8.8.8.8, 8.8.4.4;
# See ``man 5 dhclient.conf'' for details.
修改成自己的:
prepend domain-name-servers 114.114.114.114, 123.125.81.6;
# See ``man 5 dhclient.conf'' for details.
详细配置WIFI可查看FreeBSD官方文档。

=========================================================================
USB硬件信息:
root@rpi2:~ # dmesg | grep urtwn0
urtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 4> on usbus0
urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R
urtwn0: at uhub1, port 3, addr 4 (disconnected)
urtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 4> on usbus0
urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R

root@rpi2:~ # cat /var/log/messages | grep urtwn0
Feb 17 11:19:16 rpi2 kernel: urtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 4> on usbus0
Feb 17 11:19:16 rpi2 kernel: urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R
Feb 17 11:39:37 rpi2 kernel: urtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 4> on usbus0
Feb 17 11:39:37 rpi2 kernel: urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R
Feb 17 14:15:35 rpi2 kernel: urtwn0: at uhub1, port 3, addr 4 (disconnected)
Feb 17 14:20:14 rpi2 kernel: urtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 4> on usbus0
Feb 17 14:20:14 rpi2 kernel: urtwn0: MAC/BB RTL8188EU, RF 6052 1T1R

启动时信息提示:
root@rpi2:~ # ifconfig wlan create wlandev urtwn0
ieee80211_load_module: load the wlan_amrr module by hand for now.
wlan0: Ethernet address: 3c:46:d8:8e:7d:dc
wlan0


拔下无线Wifi的USB时提示:
root@rpi2:~ # ugen0.4: <Realtek> at usbus0 (disconnected)
urtwn0: at uhub1, port 3, addr 4 (disconnected)


查看网络:
root@rpi2:~ # ifconfig wlan0 up scan
wlan0: ieee80211_new_state_locked: pending INIT -> SCAN transition lost
SSID/MESH ID    BSSID              CHAN RATE    S:N     INT CAPS
123456          b8:55:10:1a:9d:05    6   54M  -77:-95   100 EP   RSN HTCAP WME
ChinaNet-iYDT   fc:e3:3c:54:b8:ec   11   54M  -93:-95    98 EP   HTCAP WPS WPA WME
CALT            40:16:9f:55:33:2c    7   54M  -90:-95   100 EPS  RSN WPA WME HTCAP ATH WPS
ChinaNet-Kjvz   60:b6:17:79:14:b7    2   54M  -89:-95   100 EP   HTCAP WPA WME
CU_VGSU         88:cf:98:dd:fa:18    3   54M  -91:-95   100 EP   HTCAP RSN WME
HiWiFi_256ECA   d4:ee:07:25:6e:ca    4   54M  -69:-95   100 EP   HTCAP WPA RSN WME
jiaweiyi        8c:be:be:2f:ae:5b    8   54M  -93:-95   100 EP   RSN HTCAP WPS WPA WME
ChinaNet-qePR   60:b6:17:78:89:3e   10   54M  -79:-95   100 EP   HTCAP WPA WME


service netif start     # 这个能自动帮你连接无线获取IP地址,当然如果配置正确的话,开机就可以自动连接上无线了。

实践来源:http://jackxiang.com/post/7492/



—————————————————————————————————————————————————————————————
Setting up USB WiFi under FreeBSD is not a very hard task.
We can use official handbook.
But in my opinion it’s too complex.
Here is a simple guide how to configure USB WiFi.
Our goal is to configure WiFi interface to connect and use available wireless network.
I use Miniature WiFi Module from Adafruit.
This is in reality Realtek RTL8188CUS.
elinux.org says this is a problem adapter.
And I had some problems with it under Raspbian.
There was no driver for this adapter in FreeBSD-10.0-RELEASE.
Driver for this adapter appears in stable images in March.
This is good for us, so we don’t need to adding it into kernel.
During boot we can see our adapter:
点击在新窗口中浏览此图片
After boot we can see it in interfaces list:
点击在新窗口中浏览此图片
If we try to up this interface we will see some warning and error messages:
urtwn-rtl8192cfwT: You need to read the LICENSE file in /usr/share/doc/legal/realtek/.
urtwn-rtl8192cfwT: If you agree with the license, set legal.realtek.license_ack=1 in /boot/loader.conf.
module_register_init: MOD_LOAD (urtwn-rtl8192cfwT_fw, 0xc2aa24f0, 0) error 1
urtwn-rtl8192cfwT: could not load firmware image, error 8
urtwn0: failed loadfirmware of file urtwn-rtl8192cfwT
点击在新窗口中浏览此图片
We need to add this two strings to file /boot/loader.conf:
legal.realtek.license_ack=1
if_urtwn_load="YES"
点击在新窗口中浏览此图片
After reboot we can continue.
Next step is creating wlan interface:
ifconfig wlan0 create wlandev urtwn0
Then we can to up this wlan interface and scan available wireless networks:
ifconfig wlan0 up scan
点击在新窗口中浏览此图片
For permanent use WiFi connection we need to add this two strings to file /etc/rc.conf:
wlans_urtwn0="wlan0"
ifconfig_wlan0="WPA DHCP"
点击在新窗口中浏览此图片
And we need to configure authentication in file /etc/wpa_supplicant.conf
点击在新窗口中浏览此图片
After reboot we can check network connection:
点击在新窗口中浏览此图片
It works!


背景:近来国家防火墙对chrome的封锁,直接在chrome的扩展里下截图插件不行了,想找个这样的都不行,特别是整个网页截图,要是一般的QQ截图都成,Chrome扩展好像要重启一下chrome浏览器才能用,伴随这个chrome升级有些截图插件也用不了,最后用了遨游浏览器自带的网页面存为图片解决了该问题:-)。

     捕捉网页截图 - FireShot,它还能保存为PDF,相当好使哟~
     在Chrome中安装了网页截图插件以后,当用户打开任何一个网页的时候都可以通过Chrome右上角的网页截图插件按钮来启动截图功能,当点击按钮以后该插件会提示用户选择部分截图还是网页截图,进而完成自己的网页截图操作。总得来说截图功能可以分下面几个步骤完成:
1.点击截图插件按钮来选择是部分截图还是全屏截图。
2.选取需要截图的范围(全屏截图不需要)。
3.对截取成功的图片进行编辑操作,其中支持文字、箭头、注释等操作、
4.保存相应的图片到本地计算机中(也可以把截取的图片通过截图插件进行分享)。
网页截图(Webpage Screenshot)不仅提供了简单的网页截图功能,用户同样可以在截图的过程中就对图片进一步处理,比如编辑文字、画上箭头标识、写上图片的备注信息等。
Chrome截图插件
在使用截图插件进行全屏截图的时候,用户只需要选择全屏截图即可快速地把当前网页的所有画面都保存成图片(包括不可见部分),在截图完成以后,用户同样可以使用其中的文字和图画对截图进一步地修改。
截图插件
使用Webpage Screenshot截图以后,用户可以使用波浪形、文字、马赛克、矩形、圆形、箭头、再此截图对该图片进行编辑,在截图完成以后用户可以快速地通过社交网站进行分享和保存。
Chrome截图打印
通过网页截图插件不仅可以对当前截图下来的图片进行保存和分享操作,用户还可以对当前截图的页面直接调用快速打印的功能,用户可以现在直接打印部分网页的截图信息和用户对图片的相关注释。
如果您对Chrome浏览器的截图功能非常感兴趣,这里可以为您推荐另一款好用的Chrome截图插件:Chrome快速打印和截图插件:Save the trees (print & screenshot)。
点击转到网页截图 - Webpage Screenshot下载页面:
http://chromecj.com/blogging/2014-08/30/download.html

来自:http://chromecj.com/blogging/2014-08/30.html
背景:FiddlerHook这个小工具的插件在Firefox下配置后很方便,近来升级Firefox居然给禁用了,提示扩展未被验证而被禁用,要配置这个fiddler还得去Firefox的工具->选项->网络->连接->配置 Firefox 如何连接至国际互联网里的手工配置代码->127.0.0.1 8888,是不是太麻烦了,有这个fiddler2提供的Firefox插件多方便:use fidder automatic。

在 扩展 页面 点击右上角的 齿轮 状 的按钮,选择 “检查更新”,将扩展更新到最新版,
如果扩展已是最新版,请向该发布该扩展的公司反馈,请该公司尽快将扩展上传至 火狐的扩展中心,进行签名。

已经和以上公司反馈过,但一直没有提交扩展签名
目前绕过签名校验的方法:about:config 中 xpinstall.signatures.required 设置为false。
背景:今天在swoole群里贴了一个nodejs和swoole的形象区别,于是出现了两派互相不服的文字争论,nodejs高大上的部署方式-PM2和swoole自带的一个辩论。

下面3点摘自:http://blog.csdn.net/leftfist/article/details/41891407
1)CPU密集型任务存在短板
如上所述,nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。结论是:NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。

2)无法利用CPU的多核
最开始,线程只是用于分配单个处理器处理时间的一种机制。但假如操作系统本身支持多个CPU/内核,那么每个线程都可以得到一个不同自己的CPU/内核,实现真正的“并行运算”。在这种情况下,多线程程序可以提高资源使用效率。Node.js是单线程程序,它只有一个event loop,也只占用一个CPU/内核。现在大部分服务器都是多CPU或多核的,当Node.js程序的event loop被CPU密集型的任务占用,导致有其它任务被阻塞时,却还有CPU/内核处于闲置的状态,造成资源的浪费。

解决方案
利用原生模块或第三方模块,开辟进程或子进程,用于处理这些特殊的任务。
3)如果有异常抛出,因为是单线程,整个项目将不可用。但这归根到底是代码的问题,糟糕的代码,不管什么体系,都会有问题,即使不崩溃。解决办法是用pm2等工具来运行?

说到密集型计算:其实PHP也好不到哪儿去,这块还得c和c++,解释性的语言对于密集型计算都好不到哪去,这块即使是nginx也可能出现事件队列出现阻塞的情况,(见:http://jackxiang.com/post/8433/):
       nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。
=======================================================================================
附录,对话记录,QQ及Email均*替代,保留昵称:
回忆未来-向东-Jàck(********7693) 15:48:05
作为顾问,必须把这个swoole形象化,
swoole解决了nodejs的这样一个问题:
点击在新窗口中浏览此图片
无聊咔咔(*******) 15:51:47
用swoole就不用部署啊阅读全文
背景:像webserver啥的开机启动其他程序的shell脚本,链接:https://jackxiang.com/post/7433/ 里写到:  /etc/rc.d/rc.local ,而后做了软连接,/etc/rc.local -> rc.d/rc.local,而这样久后,就以为写在/etc/rc.local就成了,导致开机还真没启动,得注意这个问题。
方法一:
直接建立新文件之后,建立软链接,source文件一定得放在/etc/rc.d里面。
1)vi /etc/rc.d/rc.local
2)ln  软链接,ln [options] source dist, cd /etc ;ln -s  rc.d/rc.local  /etc/rc.local    ==>形成: /etc/rc.local -> rc.d/rc.local  


方法二:
更标准一些,根据开机启动级别是3进行配置(/etc/rc.d/rc3.d 里面去指向/etc/rc.local也行,总之得有一个在/etc/rc.local里自启动才行)
操作如下:

引用:
到后来,有几台服务器突然被重启了,这时候领导问,怎么开机启动的脚本没起作用,还被批了一顿,哎,做事虎头蛇尾,活该!
然后去查,一直没查到原因,
手动执行都是正确的,在排除了权限原因和脚本问题后,很郁闷,怎么放到开机启动项目中就无法执行了呢。
于是去查linux开机启动过程信息。google下,看了下关于一些开机启动启的资料,发现了开机启动程序的级别为3.
果断顺藤莫瓜,找到了这个目录 /etc/rc.d/rc3.d,进去一看恍然大悟。

我的rc.local文件是在 /etc/rc.local中(网上都是说写在这里,我是按照网上来弄的),
而我查看了系统指向rc.local文件的路径是 /etc/rc.d/rc.local,
后来把开机启动的脚本配置到/etc/rc.d/rc.local中(或者把S99local指向 /etc/rc.local也行),重启检查,成功!

总结:主要还是对linux系统不熟悉,这是个漫长的过程,有时间得多看看这方面的书籍。

法二来自:http://www.cnblogs.com/montya/archive/2011/09/09/2172001.html



linux下rc.local中的服务开启失败分析:
linux下可以在rc.local中设置开机启动任务。开机时,系统会根据 /etc/inittab中设置的运行级别,开启/etc/rc.d下相应的服务。如多用户启模式为3,则系统会开启/etc/rc.d/rc3.d/下的服务。

/etc/rc.d/rc3.d/的目录列表:

20140323164552

其中K表示需关闭的服务,S表示开启服务,后面的数据表示关闭或开启的顺序。/etc/rc.d/rc3.d/下的服务一般通过软连接,指向到/etc/init.d中。


S99local一般会通过软链接指到/etc/rc.d/rc.local

ls -al /etc/rc.d/rc3.d/S99local
lrwxrwxrwx. 1 root root 11 Dec 17 2012 /etc/rc.d/rc3.d/S99local ->../rc.local
ls -al /etc/rc.local
lrwxrwxrwx. 1 root root 13 Dec 17 2012 /etc/rc.local -> rc.d/rc.local
ls -al /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 149 Mar 21 13:17 /etc/rc.d/rc.local

如果在rc.local中添加了服务,但开机时未能所开启。则可以通过方排查:
1. 根据运行级别查看rc.local文件链接指是否正确。
2. rc.local文件有没执行限制,导致执行失败,给 chmod +x 给 rc.local添加执行权限。
3. 查看/var/log/boot.log有没报错信息,是不是执行出错了, rc.local中的服务要写 sheel命令的绝对路径, 如Erlang服务,不能直接写 erl,需添加绝对路径/usr/local/bin/erl。
4. 因为rc.local是等待 /etc/init.d的服务都开启后才执行的,所以如果/etc/init.d中的服务未开启完成,rc.local是不会执行的。如启动了firstboot服务,将会导致多用户模式下rc.local不能执行, 可通过 chkconfig –del 把 firstboot服务去除。服务开启时都会写启动日志,可通过/var/log/boot.log查看服务启动与否,再结合/etc/rc.d/rcx.d/下服务启动顺序排查哪些服务阻塞了。可结合 ps awux | grep ServerName 一起排查。

From:http://www.kongqingquan.com/archives/152
问题如下:
2016/02/16 16:29:05 [error] 11925#0: *50 recv() failed (104: Connection reset by peer) while reading response header from upstream

解决办法:
Nginx出现502 Bad Gateway 错误,
查了Nginx的错误日志为:
2014/08/02 16:14:31 [error] 17029#0: *17941 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 210.61.12.2, server: blog.lixiphp.com, request: “POST /api/1.0 HTTP/1.1″, upstream: “fastcgi://127.0.0.1:9000″, host: “blog.lixiphp.com”2014/08/02 16:24:52 [error] 29615#0: *3 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 58.220.197.35, server: blog.lixiphp.com, request: “GET /404 HTTP/1.1″, upstream: “fastcgi://127.0.0.1:9000″, host: “blog.lixiphp.com”
不要使用php-fpm的request_terminate_timeout,最好设成request_terminate_timeout=0;
vi /etc/php-fpm.d/www.conf
修改为:
; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the ‘max_execution_time’ ini option
; does not stop script execution for some reason. A value of ’0′ means ‘off’.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_terminate_timeout = 0
因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。
重启 php-fpm 和 Nginx 一切正常。
service nginx restart
killall php-fpm
php-fpm
再打开就OK了。

来自:http://www.th7.cn/Program/php/201408/254237.shtml
背景:自从PHP引入了一个叫OPcache的扩展,那么如何看OPcache呢,这儿有一个扩展分析PHP代码的性能叫VLD。

需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode
下载与安装VLD
# wget http://pecl.php.net/get/vld-0.11.2.tgz
# tar zxvf vld-0.11.2.tgz
# cd ./vld-0.11.2
# /usr/local/php/bin/phpize              或者直接phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld
# make && make install
---------------------------------
编辑php.ini文件激活vld扩展:
php.ini位置
#cd /usr/local/php/lib
增加
extension=vld.so

重启Apache:
# /usr/local/apache2/bin/apachectl restart
---------------------------------
查看phpinfo()信息


--------------------------------
至此,VLD就安装完了。写个简单的test.php
[php] view plain copy
$a='123';  
echo $a;  



# php -dvld.active=1 ./test.php
如果没有设置php环境变量的话

#/usr/local/php/bin/php  -dvld.active=1  test.php

查看结果
。。。。
下面是举例说明怎么看...
更多请转向:http://blog.csdn.net/21aspnet/article/details/7002644
背景:有时候需要比对一下文件,再就是如何快速的跳转到下一个不同,及从一个文件拷贝不同到另一个文件,这些在vimdiff支持到,截取部分备用。

光标移动
接下来试试在行间移动光标,可以看到左右两侧的屏幕滚动是同步的。这是因为"scrollbind"选项被设置了的结果,vim会尽力保证两侧文件的对齐。如果不想要这个特性,可以设置:
:set noscrollbind
可以使用快捷键在各个差异点之间快速移动。跳转到下一个差异点:
]c
反向跳转是:
[c
如果在命令前加上数字的话,可以跳过一个或数个差异点,从而实现跳的更远。比如如果在位于第一个差异点的行输入"2]c",将越过下一个差异点,跳转到第三个差异点。
回页首
文件合并
文件比较的最终目的之一就是合并,以消除差异。如果希望把一个差异点中当前文件的内容复制到另一个文件里,可以使用命令
dp (diff "put")
如果希望把另一个文件的内容复制到当前行中,可以使用命令
do (diff "get",之所以不用dg,是因为dg已经被另一个命令占用了)
如果希望手工修改某一行,可以使用通常的vim操作。如果希望在两个文件之间来回跳转,可以用下列命令序列:
Ctrl-w, w
在修改一个或两个文件之后,vimdiff会试图自动来重新比较文件,来实时反映比较结果。但是也会有处理失败的情况,这个时候需要手工来刷新比较结果:
:diffupdate
如果希望撤销修改,可以和平常用vim编辑一样,直接
<ESC>, u
但是要注意一定要将光标移动到需要撤销修改的文件窗口中。


来自:https://www.ibm.com/developerworks/cn/linux/l-vimdiff/
背景:把mysql换成mysqli时出现,连接数过多,其实际上并不是,原因是我挪动了一下php的sock文件位置导致,因这几个socket修改没有修改完全,于是出现了too many connections ,从mysql里show processlist并没有发现真的有连接,其实用tshark抓下包估计能看到(http://jackxiang.com/post/7458/),并没有发出请求,而估计是mysqli的客户端自己报出来的,别看这个问题小,搞了老半天,都想重新安装Php了,发现原来是路径写错了同时mysqli的客户端提示连接数过多的误提示导致方向走错了。如下:


修改后记得重启动php-fpm:
[root@iZ25z0ugwgtZ etc]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

还会出现在localhost时连接找不到sock时提示诡异,如下:Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in
开始的回答有点不严谨,估计也没有解决问题,修改了答案,解决办法如下,或配置php.ini,参考:http://jackxiang.com/post/8499/

问题出现的原因:
当主机填写为localhost时MySQL会采用 unix domain socket连接,当主机填写为127.0.0.1时MySQL会采用TCP/IP的方式连接。使用Unix socket的连接比TCP/IP的连接更加快速与安全。这是MySQL连接的特性,可以参考官方文档的说明4.2.2. Connecting to the MySQL Server:

On Unix, MySQL programs treat the host name localhost specially, in a way that is
likely different from what you expect compared to other network-based programs.
For connections to localhost, MySQL programs attempt to connect to the local server
by using a Unix socket file. This occurs even if a --port or -P option is given to
specify a port number. To ensure that the client makes a TCP/IP connection to the
local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP
address or name of the local server. You can also specify the connection protocol
explicitly, even for localhost, by using the --protocol=TCP option.
这个问题有以下几种解决方法:

使用TCP/IP代替Unix socket。即在连接的时候将localhost换成127.0.0.1。
修改MySQL的配置文件my.cnf,指定mysql.socket的位置:
/var/lib/mysql/mysql.sock (你的mysql.socket路径)。
直接在php建立连接的时候指定my.socket的位置(官方文档:mysqli_connect)。比如:
$db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock')
如果哪里没有说清楚或者说错了,欢迎提出了~~
______________________排查要点如下_______________________________
warning: mysqli::real_connect(): (hy000/1040): too many connections in:
出现场景 :手动编译安装mysql,并制定安装位置,php以localhost方式连接mysql
原因分析 :手动编译安装制定位置后所有的mysql文件都在制定的目录或者data目录下面,php默认只会寻找/temp/mysql.sock找这个sock文件,所以会导致sock文件无法找到。
解决方法 :
1.给sock文件做个软链


ln -s /data/mysqldb/mysql.sock /tmp/mysql.sock;
或者
2.修改php的默认mysql.sock连接地址


mysql.default_socket=/data/mysqldb/mysql.sock
3.使用tcp socket的方式进行连接


mysql('127.0.0.1','username','passwod');

来自:http://ju.outofmemory.cn/entry/144221
背景:mysqli连接数据库,pdo连接mysql都有,这块很多老代码都是用的mysql,为此,伴随PHP7的强制升级,对mysql不再支持了。So,对mysqli这块可以研究研究是很有必要的:-),demo代码如下:

运行结果:
[root@iZ25z0ugwgtZ mysql]# php test.php
Array
(
    [0] => 001
    [1] => jackX
)
Array
(
    [0] => 001
    [1] => jackX
)
Array
(
    [0] => 001
    [1] => jackX
)

——————————————————————————————————————————————————————————————
问题一:当用localhost时出现 mysql数据库 Too many connections
出现这种错误明显就是 mysql_connect 之后忘记 mysql_close;
当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢?

正常的mysql_connect 之后调用 mysql_close()关闭连接
但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_close();
所以在程序return 之前一定要判断是否close(),最稳妥的方法就是在写任何函数时都只有一个出口!
还有可以通过修改mysql配置文件来加大允许连接的数量!

有时你的服务器是经常出现这样的错误呢:
错误信息如下:
Can not connect to MySQL server

Error: Too many connections
Errno.: 1040

Similar error report has beed dispatched to administrator before.

从官方文档知道linux上面编译安装的mysql默认的连接为100个
文档:http://dev.mysql.com/doc/refman/5.0/en/too-many-connections.html

mysql官方告诉我们需要修改max_connections的值,那么我们怎么去修改呢?有两种方法
1、修改配置文件文件
修改/etc/my.cnf这个文件,在[mysqld] 中新增max_connections=N,如果你没有这个文件请从编译源码中的support-files文件夹中复制你所需要的*.cnf文件为到 /etc/my.cnf。我使用的是my-medium.cnf,中型服务器配置。例如我的[mysqld]的内容如下
[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-locking
key_buffer = 160M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
max_connections=1000

由于对mysql还不是很熟悉,所以很多参数没有修改。哈哈。。

2、非使用mysqld脚本自动启动的用户。
修改$MYSQL_HOME/bin/mysqld_safe文件
例如:/usr/local/mysql/bin/mysqld_safe这个文件
grep -n ‘max_connection’ $MYSQL_HOME/bin/mysqld_safe
修改对应行号的max_connections参数值

来自:http://www.2cto.com/database/201306/218126.html



问题二:当在测试时出现[root@iZ25z0ugwgtZ mysql]# php  test.php
PHP Warning:  mysqli::mysqli(): (HY000/2002): No such file or directory in /data/codesdev/testdemo/mysql/test.php on line 2
Connect failed: No such file or directory
将'localhost'修改为'127.0.0.1'之后链接正常!
当主机填写为localhost时MySQL会采用 unix domain socket连接,当主机填写为127.0.0.1时MySQL会采用TCP/IP的方式连接。使用Unix socket的连接比TCP/IP的连接更加快速与安全。这是MySQL连接的特性,可以参考官方文档的说明4.2.2. Connecting to the MySQL Server:

On Unix, MySQL programs treat the host name localhost specially, in a way that is
likely different from what you expect compared to other network-based programs.
For connections to localhost, MySQL programs attempt to connect to the local server
by using a Unix socket file. This occurs even if a --port or -P option is given to
specify a port number. To ensure that the client makes a TCP/IP connection to the
local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP
address or name of the local server. You can also specify the connection protocol
explicitly, even for localhost, by using the --protocol=TCP option.
这个问题有以下几种解决方法:

使用TCP/IP代替Unix socket。即在连接的时候将localhost换成127.0.0.1。
修改MySQL的配置文件my.cnf,指定mysql.socket的位置:
/var/lib/mysql/mysql.sock (你的mysql.socket路径)。
直接在php建立连接的时候指定my.socket的位置(官方文档:mysqli_connect)。比如:
$db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock')
如果哪里没有说清楚或者说错了,欢迎提出了~~

来自:https://segmentfault.com/q/1010000000328531
解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future:
mysqli 更严谨 安全 高效

php 5个版本,5.2、5.3、5.4、5.5,怕跟不上时代,新的服务器直接上5.5,但是程序出现如下错误:Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in,看意思就很明了,说mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代。

解决方法1:
禁止php报错
display_errors = On
改为
display_errors = Off

鉴于这个服务器都是给用户用的,有时候他们需要报错(…都是给朋友用的,^_^),不能这做,让他们改程序吧,看方案2.

解决方法2:
<?php
error_reporting(E_ALL ^ E_DEPRECATED);

以上来自:http://www.cnblogs.com/bjxing/p/3555929.html
————————————————————————————————————————————————————————————



解决The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in 报错
很明显的提示 mysql扩展模块就要被放弃使用了,所以请使用mysqli代替

这个说明你的php版本过高造成的。

解决方法:
把mysql的相关模块全都改为mysqli就行了。
比如:
1、mysql_connect 改为mysqli_connect

2、mysql_query 改为mysqli_query

3、mysql_close 改为 mysqli_close

4、mysql_select_db 改为 mysqli_select_db

5、mysql_error 改为 mysqli_error

等等!
来自:http://www.inbeijing.org/archives/1017


———————————————————————————————————
mysql_select_db  ==> mysqli_select_db:


来自:http://www.runoob.com/php/func-mysqli-select-db.html


用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): too many connections in :
https://jackxiang.com/post/8500/
最近新版火狐打开很多https连接都报错:(错误码: ssl_error_no_cypher_overlap)
一直还在叨叨火狐的问题,后来多方搜索才发现是因为火狐使用的dns被墙了
修改hosts文件即可解决,加入以下内容:

来自:http://www.aknife.cn/zhuanzai/firefox-ssl-error.html
背景:linux长时间无动作会断掉,此时需要发送点东西保持活动,这个ping估计是有点类似于SecureCRT里终端,发送协议NO-OP每[10]秒。
防止ssh时断连.bat
背景:之前配置成功过,找了很多文章,特别是国外的,现在国内也有兄弟在做这个,于是做一个转载,配置热点有好处,可以连接上去操作树莓派。

     本文是基于在某东购买的usb无线网卡(RTL8188CUS芯片)来制作无线热点。本来想制作一个一键脚本,不过先把实现的过程记录下来。
参考文章
Turn Your Raspberry Pi Into a WiFi Hotspot with Edimax Nano USB EW-7811Un (RTL8188CUS chipset)
Why won’t dnsmasq’s DHCP server work when using hostapd?阅读全文
碰到问题一:



安装了MySQL,然后用 telnet ip 3306,端口后报BHost '127.0.0.1' is not allowed to connect to this MySQL serverConnection closed by foreign host,虽然自己以前也碰到过,后来解决了,但是觉得还是值得贴出来,估计会有很多人同样碰到过,贴个解决办法:

MySQL>UPDATE MySQL.user SET Host='%' WHERE Host='localhost';  
MySQL>GRANT ALL PRIVILEGES  

这样搞如果该服务器在外网,有可能不安全,因为%的意思是谁都都可以连接的意思,最好是指定IP地址能连接,如问题二所示。

碰到问题二:


处理方法有二个
1、(如何解决客户端与服务器端的连接(mysql) :xxx.xxx.xxx.xxx is not allowed to connect to this mysql serv
) 授权法。例如,你想myuser使用mypassword从任何主机连接到mysql服务器的话。

GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@'%’ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
如果你想允许用户myuser从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码

GRANT ALL PRIVILEGES ON *.* TO ‘root’@’192.168.1.3′ IDENTIFIED BY ‘mypassword’ WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO ‘root’@’10.10.40.54′ IDENTIFIED BY ’123456′ WITH GRANT OPTION;

2、 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称”%”
这个是因为权限的问题,处理方式如下:

shell>mysql --user=root -p
输入密码

mysql>use mysql
mysql>GRANT SELECT,INSERT,UPDATE,DELETE ON [db_name].* TO [username]@[ipadd] identified by '[password]';

[username]:远程登入的使用者代码
[db_name]:表示欲开放给使用者的数据库称
[password]:远程登入的使用者密码
[ipadd]:IP地址或者IP反查后的DNS Name,此例的内容需填入'60-248-32-13.HINET-IP.hinet.net' ,包函上引号(')

(其实就是在远端服务器上执行,地址填写本地主机的ip地址。)

也可以这样写

mysql -u root -pvmwaremysql>use mysql;mysql>update user set host = ‘%’ where user = ‘root’;mysql>select host, user from user;

分别来自:
http://database.51cto.com/art/201006/204016.htm
http://www.111cn.net/database/mysql/42040.htm
背景:Nginx直接连接redis,不用php的扩展连接,一定程序上提高了redis性能,但是在程序逻辑的可控制上会弱一点,用来做一些单纯的高并发登录没有问题,逻辑重点这种玩法并不能带来很大的提升。
需要下载第三方模块ngx_http_redis-0.3.2.tar.gz,并需要重新编译nginx。
注意要注释掉ngx_http_redis_module.c文件的145行
/*static ngx_str_t  ngx_http_redis_db  = ngx_string("redis_db");*/
否则会报错,意思是这个定义的redis_db在程序里没有使用,算是个警告报错,注释掉安装即可

./configure --user=nginx --group=nginx  --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/software/module/ngx_http_redis-0.3.2


配置
location / {
    set $redis_key $uri;

    redis_pass     name:6379;
    default_type   text/html;
    error_page     404 = /fallback;
  }

$redis_db
The number of redis database (required for < 0.3.2).
For ngx_http_redis >= 0.3.2 is not obligatory, default value is "0" if not defined.
这个$redis_db可以不配,默认是0database。
更多官方的资料请参考:http://wiki.nginx.org/HttpRedis2Module

更多参考之Keepalived+nginx+redis主从+tomcat一机多实例实现会话共享:
http://lovelace.blog.51cto.com/1028430/1550198
https://www.nginx.com/resources/wiki/modules/redis2/
背景:阿里云没备案会不让配置host访问的,被拦截,直接用ip访问呢?应该没啥吧。
   比如我服务器ip是192.168.1.1,两个域名为user.a.com,manage.a.com都映射到了该ip上。nginx里如何配置,当我用ip访问时默认打开user.a.com;而另一个域名manage.a.com又不影响呢?

这样就可以了

  

nginx.conf里写:
include vhosts/*.conf;

ls /usr/local/nginx/conf/vhosts/
10.70.37.2*.conf  default.conf
———————————————
10.70.37.2*.conf
server_name 10.70.37.24;//写成IP

default.conf
server_name 127.0.0.1;

来自:http://www.dewen.io/q/2760
背景:批量修改多台机器里的密码,怎么办,一台机器知道后,拷贝到另外机器上的办法,采用第三种较好。
1)新建用户:useradd -m 用户名 //-m是建一个home
2)设置密码:passwd 用户名
3)一般需要修改/etc/passwd 下面的bash
4)将用户加入sudo组。

总之,一个同样的Unix/Linux的密码,经过一次后,其生成的密码shadow是不一样的,实践如下所示可证明:

但是你批量替换时,完全可以选一个就成,如:


接近博文的正题了:
多台机器要批量加时,可用secureCRT,或大公司用zookeeper结合shell实现conf前端web系统进行海量机器的密码新增:

————————————————介绍修改用户密码三种方法————————————————
第一种:
echo "123456"|passwd --stdin root
优点:方便快捷
缺点:如果你输入的指令能被别人通过history或者其他方式捕获,那么这样的方式是很不安全的,更重要的是如果密码同时含有单引号和双引号,那么则无法通过这种方法修改。


第二种:
a.首先将用户名密码一起写入一个临时文件.
cat chpass.txt
root:123456
zhaohang:123456
b.使用如下命令对用户口令进行修改:
chpasswd<chpass.txt
c.可以使用 123456 来登录系统,密码修改完毕.
优点:可以很快速方便的修改多个用户密码
缺点:明文密码写在文件里仍然显得不够安全,但是避免了第一种修改方式不能有特殊字符串密码的情况.


第三种:
a.用 openssl passwd-1 来生成用户口令(这块有一台后,其它就不用再生成了,直接:chpasswd -e < chpass.txt),连同用户名一起写入文件.
cat chpass.txt
root:$1$ri2hceVU$WIf.firUBn97JKswK9ExO0
zhaohang:$1$i/Gou7.v$Bh2K6sXmxV6/UCxJz8N7b.
b.使用如下命令对用户口令进行修改:
chpasswd -e < chpass.txt
c.可以使用 123456 来登录系统,密码修改完毕.
优点:可以很快速方便的修改多个用户密码
缺点:和上面两种相比大大增强了安全性

附加介绍:
openssl passwd -1 命令可以输出shadow里面的密码,把这个命令生成的秘串更改为你shadow里的密码,那么下次你登录系统就可以用你的生成密码的口令来登录了,使用这个命令,即使口令一样,多次执行生成的密码串也不一样。那个hash值对应的密码是完全随机的基于64位字符编码的28位长,因此要破解它是非常困难的,只要不用那些密码已经公布出来的hash值创建账号,即使这些密码文件被公布也还是比较安全的。使用旧的unix哈希可以去掉 -1 参数。

[root@WEB01~]# openssl passwd -1
Password:123456
Verifying-Password:123456
$1$ri2hceVU$WIf.firUBn97JKswK9ExO0

也可以直接使用如下命令来直接生成:
[root@WEB01 ~]# openssl passwd -1 123456

来自:http://blog.chinaunix.net/uid-561779-id-166621.html
背景:由于数据库服务器安装在数据库机上,因此,在linux中只需安装mysql的客户端库就可以了。那么这个PHP下的mysql client要不要安装?再就是如果想在这台机器上连接mysql  server,客户端要不要安一个呢,当然要,且只安mysql的client客户端。
方法一:从编译好的包里释放安装:
一)有rpm包的情况:
MySQL-client-5.0.22-0.i386.rpm //mysql -uroot 这个client的一个包 标准MySQL客户程序。你可能总是需要安装这个包。
MySQL-devel-5.0.22-0.i386.rpm  //要想用c去连接这个mysql的lib库
(安装好以后,在 /usr/include/mysql/ 目录中存放有libmysqlclient的头文件mysql.h,在 /usr/lib/mysql/ 目录中存放有mysql的库文件,但只有.a结尾的(即静态库)库文件(包括libmysqlclient.a),没有.so(共享库)文件。)
键入以下命令安装:

#rpm -ivh MySQL-client-5.0.22-0.i386.rpm
#rpm -ivh MySQL-devel-5.0.22-0.i386.rpm

使用如下命令编译一个简单的测试程序(代码在本文结尾处给出):
#gcc -c -I/usr/include/mysql mysql-test.c
此命令成功生成了目标文件mysql-test.o。
继续键入以下命令。
#gcc -o --static mysql-test mysql-test.o -L/usr/lib/mysql -lmysqlclient

注意参数的顺序,gcc有时会因为某些参数顺序不对而报错,某些相关参数的具体顺序应该如何,还望高人指点。
以上命令确给出了数不清的“引用未定义符号”的错误信息,引用未定义符号的是libmysqlclient.a
带着希望折腾了许久,最后决定从源码包安装mysql客户端程序库。

卸载MySQL-client与MySQL-devel:
#rpm -e MySQL-client
#rpm -e MySQL-devel

二)yum 安装,其实是一样的,只是在网上安装,看来centos7上新的db数据库会向mariadb转的趋势啊:
[root@iZ25z0ugwgtZ logs]# yum search mysql|grep dev
mysql++-devel.x86_64 : MySQL++ developer files (headers, examples, etc.)
mariadb.x86_64 : A community developed branch of MySQL
mariadb-devel.i686 : Files for development of MariaDB/MySQL applications
mariadb-devel.x86_64 : Files for development of MariaDB/MySQL applications


方法二:从源码里通过参数只编译安装客户端:
[root@iZ25dcp92ckZ vhost]# ldconfig -v|grep mysql
/usr/lib64/mysql:  这个路径在哪儿配置的呢?在:vi /etc/ld.so.conf  自己加上想要找的动态链接库:/usr/local/inotify-tools-3.14/lib
        libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
从源码包安装mysql客户端程序库。
#tar -zxvf mysql-5.0.22.tar.gz (mysql-5.0.22.tar.gz位于/root目录)
#cd mysql-5.0.22
进入mysql-5.0.22目录,阅读 INSTALL-SOURCES 文件,并看到几个关键选项:
1、--without-server
只编译安装客户端程序库,不编译mysql服务器程序,这在本机只需要libmysqlclient时很有用。

Mysql高版本用了boost和cmake(MySQL 5.5版本以后,使用CMake编译工具)参数是这样和./configure对应的,参见链接,http://www.linuxeye.com/Linux/MySQL-cmake-options.html,-DWITH_SERVER=0,总之,这个cmake有些参数不支持和configure还不太一样,这个DWITH_SERVER 是臆想出来的:


2、--enable-thread-safe-client
让libmysqlclient中的例程具有线程安全性,要编写多线程的mysql客户端程序时就少不了了,这要求本地拥有多线程库。
3、--prefix 指定安装目录
启动configure脚本:
#mkdir /usr/local/mysql
#./configure --without-server --enable-thread-safe-client --prefix=/usr/local/mysql
大概6分钟后,configure脚本生成好所有的Makefile后退出。
当前目录下执行make进行编译:
#make
这个过程除了时间长一点以外没有别的,大概一个钟头后make完成编译任务。
安装:
#make install
这个过程也比较快,约两三分钟。
安装完成以后,mysql.h文件在 /usr/local/mysql/include/mysql/目录中(这里include目录中还有一个mysql子目录)。
以lib开头的库文件在/usr/local/mysql/lib/mysql/目录中(与mysql.h的情况一样,这里lib目录中还有一个mysql子目录)。
此时再来链接测试程序的目标文件:
#gcc -o mysql-test mysql-test.o -L/usr/lib/mysql -lmysqlclient
OK,一切正常,链接成功。
执行一下:
#./mysql-test
系统这时又发出错误提示:Loading libmysqlclient.so.15 Error; No Such File!
将/usr/local/mysql/lib/mysql/目录中的libmysqlclient.so.15.0.0复制到/usr/lib/目录下:
#cp /usr/local/mysql/lib/mysql/libmysqlclient.so.15.0.0 /usr/lib/libmysqlclient.so.15
#./mysql-test
屏幕打印出:mysql_init() successed.后就不动了.
约莫90秒后打印libmysqlclient的提示信息:Can not connect to mysql server(110)
这时在windows xp的msdos控制台键入:
>netstat -na
看到了系统已经打开了3306端口,即mysql server确实在运行。
最后注意到xp中启用了系统防火墙, 禁用系统防火墙后回到linux的ppty键入:
#./mysql-test
这时,黎明的曙光终于出现了,提示信息告诉我,它已经连接上了XP中的mysql server。

以上主要参考:http://blog.chinaunix.net/uid-26466663-id-3358199.html

mysql中的两个包 libmysqlclient-devel和mysql-devel 有什么区别啊,为什么安装了mysql-devel就不能安装 libmysqlclient-devel了?
MySQL服务器。除非你只是想要与运行在其他机器上MySQL服务器连接,否则你将需要它。
分页: 17/196 第一页 上页 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 下页 最后页 [ 显示模式: 摘要 | 列表 ]