php fsockopen(): unable to connect to java.net.NoRouteToHostException:


如查是在centos 上连装如memache 或 httpsqs 等服务时出现这个报错:
fsockopen(): unable to connect to 127.0.0.1:6677 (Permission denied)
或者java 出现:java.net.NoRouteToHostException: No route to host
则是redhat 系的 SELinux 所以限制了连接所至,不注意这点还真是想破脑呆也找不出问题来。
selinux是一套linux的安全系统,它指定了应用程序可以访问的磁盘文件、网络端口等等
关闭SELinux的方法:
修改/etc/selinux/config文件中的SELINUX=enforcing 为 disabled ,然后重启(注意,这里是
重启机器,如果是在线运行的机器,重启是不可能的)。
修改selinux的http策略,使得httpd进程可以访问网络,这样也就可以使用memcache了
命令:setsebool -P httpd_can_network_connect true
如果不想重启系统,使用命令: setenforce 0

ok 这个问题就解决了,你的服务也可以正常访问了


Linux Redis 的安装


费话不多说,直接开始:
wget http://redis.googlecode.com/files/redis-2.6.11.tar.gz
tar xzf redis-2.6.11.tar.gz
cd redis-2.6.11 #这就是你的安装目录了,比如我的就是:/home/redis-2.6.11
make

以上安装就完成了,下面我们要做些配置了
vi /etc/sysctl.conf

加一行:
vm.overcommit_memory = 1

保存
再执行以下命令,让修改结果立即生效:
/sbin/sysctl -p

下一步就是redis 的一些配置
cd home
mkdir redis
cd redis
mkdir cfg //放配置文件
mkdir db //db
mkdir log //日志目录
cp /home/redis-2.6.11/redis.conf /home/redis/cfg
cd /home/redis/cfg

修改以下为:
vi redis.conf

daemonize yes
pidfile /var/run/xxxredis.pid # xxx 为你redis 的名字,因为一台机器上可能存在多个redis
port 8897 #这是redis 的端口
loglevel verbose #日志级别 verbose为本人用
logfile /home/redis/log/redis.log
dbfilename dump.rdb #db 名字
dir /home/redis/db #db 的路径

保存
cd /home/redis

写几个脚本方便体用
启动脚本
vi start.sh
/home/redis-2.6.11/src/redis-server /home/redis/cfg/redis.conf

保存
关闭脚本
vi shutdonw.sh
/home/redis-2.6.11/src/redis-cli -p 8897 shutdown

保存
打开脚本
vi open.sh
/home/redis-2.6.11/src/redis-cli -p 8897

保存
执行下面的命令:
chmod 775 *.sh

OK 现在我们的配置工作完成了:
启动reids
./start.sh

查看一下 log 目录下的日志,看是否成功!


修改Linux内核参数,减少TCP连接中的TIME-WAIT sockets


新增的一组Apache服务器上线以来,我用netstat -an命令发现服务器中有大量状态为TIME-WAIT的TCP连接,于是用/sbin/sysctl -a查看了一下Linux的各项内核参数,并翻阅有关资料,决定修改其中的两项参数,以达到减少TCP连接中TIME-WAIT sockets的目的。
vi /etc/sysctl.conf

编辑/etc/sysctl.conf文件,增加三行:
引用
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

如果想更好:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 90
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 10000 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_conntrack_max = 655360

  说明:
  net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
 net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
如果出现ping sendmsg: Operation not permitted 时报这个错就必需加 net.ipv4.ip_conntrack_max = 655360
  再执行以下命令,让修改结果立即生效:
  /sbin/sysctl -p

  用以下语句看了一下服务器的TCP状态:
  netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

  返回结果如下:

ESTABLISHED 1423

  FIN_WAIT1 1
  FIN_WAIT2 262
  SYN_SENT 1
  TIME_WAIT 962

  效果:处于TIME_WAIT状态的sockets从原来的10000多减少到1000左右。处于SYN_RECV等待处理状态的sockets为0,原来的为50~300。
增加统的最大连接数:
vi /etc/profile
ulimit -u 16384 -n 65536

source /etc/profile #生效
ulimit -a #查看


LINUX下查看CPU负载的所有命令


$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 4 329796 26040 4528 3379824 1 1 50 160 36 17 2 10 85 3 0

procs
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比
system 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
memory
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。
IO
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。


Mac os Nginx mysql php


先安装Mac ports ,先要安装XCODE
http://www.macports.org/install.php
https://distfiles.macports.org/MacPorts/
选跟自己系统版本相同的.bkg 安装

  1. 先把软件一路安装完
  2. port install nginx php5 +fastcgi +pear mysql5 mysql5-server spawn-fcgi php5-mysql php5-memcache php5-mcrypt php5-pear php5-curl php5-iconv php5-gd php5-posix memcached

需要比较长的时间,可以先去泡个咖啡,龟速网络的孩子们可以先去把个妹看场电影再回来。上面的php组件可按需安装。

  1. 设置Mysql
  2. -u _mysql mysql_install_db5

sudo /opt/local/lib/mysql5/bin/mysqld_safe &
sudo /opt/local/lib/mysql5/bin/mysql_secure_installation

按照引导完成Mysql的root用户,test用户等设置安装
默认mysqld不会设置my.ini文件,如果需要自定义,可建立一个,并做需要的修改:
sudo cp /opt/local/share/mysql5/mysql/my-medium.cnf/opt/local/etc/mysql5/my.cnf
sudo vi /opt/local/etc/mysql5/my.cnf

  1. 设置PHP
  2. /opt/local/etc/php5

sudo mv php.ini-development php.ini
sudo /opt/local/bin/spawn-fcgi -C 5 -p 9000 /opt/local/bin/php-cgi #启动fcgi,开发环境,起5个进程足矣,多了浪费。
sudo ln -s /opt/local/var/run/mysql5/mysqld.sock /tmp/mysql.sock #建立mysql soket连接,否则php无法连接mysql

  1. 设置Nginx
  2. /opt/local/etc/nginx #

sudo mv nginx.conf.example nginx.conf #建立nginx的配置文件
sudo vi nginx.conf #修改vitualhost的配置,大约的参考为:(更详细的配置,可以参考我之前所写的 Ubuntu下使用Nginx+PHP教程

test.conf
server {

listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
    #root share/nginx/html;
    root /data/php_workspaces;
    index index.html index.htm index.php;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
location ~ \.php$ {
    root share/nginx/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /data/php_workspaces$fastcgi_script_name;
    include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}

}

sudo nginx -t #测试nginx
nginx: the configuration file /opt/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /opt/local/etc/nginx/nginx.conf test is successful
sudo nginx #如果测试成功,则启动

检测配置文件是否有效 sudo nginx -t

重启

sudo nginx -s reload
sudo echo "< ?php phpinfo();" --> /data/php_workspaces/index.php

浏览器打开 127.0.0.0.1 应该可以看到phpinfo的信息页面了。
接下来,如果都OK的话,将这几个服务都设置为开机启动
sudo launchctl load -w /Library/LaunchDaemons/org.macports.nginx.plist#设置NGINX
sudo launchctl load -w/Library/LaunchDaemons/org.macports.mysql5.plist
cd /Library/LaunchDaemons/ #建立一个fastcgi的启动脚本
sudo vi com.luochunhui.php-fastcgi.plist