东东东 陈煜东的博客

标签存档: 网站建设

让php-fpm开机启动启动

开机启动程序对于一些服务程序特别需要,因为有时候需要重启,但是每次重启后需要重新启动一些程序会比较麻烦,服务受影响的时间更长了。对于搭建Web服务,可以参考搭建Web网站服务教程

在编译安装php—fpm后,默认是不会开启自动启动的,需要进行一些配置才能开机启动。

执行vim /etc/init.d/php-fpm新建下面的内容:

#!/bin/sh
#
# php-fpm - this script starts and stops the php-fpm daemin
#
# chkconfig: - 85 15
# processname: php-fpm
# config:      /usr/local/php/etc/php-fpm.conf

set -e

#PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="php-fpm daemon"
NAME=php-fpm
DAEMON=/usr/local/php/sbin/$NAME     #这里设成自己的目录
CONFIGFILE=/usr/local/php/etc/php-fpm.conf   #这里设成自己的目录
PIDFILE=/var/run/$NAME.pid   #这里设成自己的目录
SCRIPTNAME=/etc/init.d/$NAME   #这里设成自己的目录

# If the daemon file is not found, terminate the script.
test -x $DAEMON || exit 0

d_start(){
   $DAEMON -y $CONFIGFILE || echo -n " already running"
}

d_stop(){
   kill -QUIT `cat $PIDFILE` || echo -n " no running"
}

d_reload(){
   kill -USR2 `cat $PIDFILE` || echo -n " could not reload"
}

case "$1" in
   start)
       echo -n "Starting $DESC: $NAME"
       d_start
       echo "."
       ;;
   stop)
       echo -n "Stopping $DESC: $NAME"
       d_stop
       echo "."
       ;;
   reload)
       echo -n "Reloading $DESC configuration..."
       d_reload
       echo "Reloaded."
       ;;
   restart)
       echo -n "Restarting $DESC: $NAME"
       d_stop
       # Sleep for two seconds before starting again,
       # this should give the nginx daemon some time to perform a graceful stop
       sleep 2
       d_start
       echo "."
       ;;
   *)
       echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload)" >&2
       exit 3
       ;;
esac
exit 0

添加可执行权限

chmod +x /etc/init.d/php-fpm

添加到开机自动启动

chkconfig --add php-fpm
chkconfig php-fpm on

这样后,php-fpm就会开机自动启动了,而且可以使用以下命令进行重启

service php-fpm start
service php-fpm stop
service php-fpm reload

另外一种平滑重启php-fpm可以使用kill -USR2 php-fpm.pid来进行,通过service命令就快很多啦。

参考文章:http://www.cnblogs.com/buffer/archive/2011/08/15/2138762.html

 

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 让php-fpm开机启动启动 – https://www.chenyudong.com/archives/add-php-fpm-to-autostart.html

分类: 网站建设

nginx 反向代理 proxy

上次说了,有个需求,是使用nginx做反向代理用的。可以看看具体的nginx的安装。另外还有一篇介绍Squid的正向代理

基本的nginx反向代理设置

要配置一下nginx,进入到${nginx}/conf/nginx.conf,增加一个服务器。

增加一条server记录

server {
        listen 80;  # 端口
        server_name testproxy; # 域名

        location / {
                proxy_pass http://www.chenyudong.com/;  # 需要访问的网站
                proxy_redirect off;                 # 重定向关闭
                proxy_set_header Host $host;        # 设置一下访问头
        }
    }

注意:通过上面的方法,只是服务器简单的将文件下载下来,然后就未加工的提交给用户了。也就是里面的链接是不会出现替换的,原来是什么就该是什么。

那么要替换某些URL要怎么做的?

替换网页里某些关键字或链接

如果需要替换关键字或者链接,该怎么办呢?

我们需要重新编译一下nginx,对,重新编译。在编译的时候添加参数--with-http_sub_module。也就是编译的命令./configure --with-http_sub_module。然后的安装过程见这篇文章。

接下来需要修改一下${nginx}/conf/nginx.conf配置。

server {
        listen 80;  # 端口
        server_name testproxy; # 域名

        ##将页面出现的www.baidu.com改成google.com
        sub_filter 'www.baidu.com' 'google.com';

        ## off:在符合的地方,替换所有出现的地方。默认为on:只替换第一个出现的地方
        sub_filter_once off;

        location / {
                proxy_pass http://www.google.com/;  # 需要访问的网站
                proxy_redirect off;                 # 重定向关闭
                proxy_set_header Host $host;        # 设置一下访问头
        }
    }

需要关心用于的真实IP了

说明:这个用户的真实IP指的是,直接和我们服务器连接的那个IP,用户可以躲在代理后面,这种情况获取不到用户真实IP,想要获得,成本很高,还不一定能获得到。下文说的都是基于这个前提条件的。

以上配置,是多么美好啊,应该能正常工作了。但是还是有些不足,就是我们对用户真实IP的获取上,已经无法通过_SERVER['REMOTE_ADDR']获取,因为这个获取的值是前台的nginx的IP。

nginx反向代理

nginx反向代理

对于我们backend nginx代理,只能看到所有的请求是来自front nginx的,所以PHP程序想要获得用户的真实IP,需要做一些设置。

## front nginx 设置
server {
    listen          80;
    server_name     server.com;
    #access_log      /data/home/log/server.access.log main;

    location / {
        proxy_pass http://www.chenyudong.com/;
        proxy_redirect off;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

从HTTP_X_REAL_IP获取

通过增加HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR这两个变量,让后端的backend nginx从这里获取用户的真实IP。

设置用户真实IP头的结果

设置用户真实IP头的结果

我们可以看到,PHP中的HTTP_X_REAL_IPHTTP_X_FORWARDED_FOR已经获取到用户的真实IP了。

这还不够完美,这需要我们的程序重新使用_SERVER["HTTP_X_REAL_IP"]这样来取值。但是程序不是从头写起的,大家都在使用_SERVER['REMOTE_ADDR']获取,要替换,工程浩大,不适宜。那么就只能在程序的入口做个变量的替换了。

<?php
    _SERVER['REMOTE_ADDR'] = _SERVER["HTTP_X_REAL_IP"];
....
?>

来个狠的,就要从REMOTE_ADDR获取

如果你觉得上面还是不太爽,我就是从那里取值。

在上面front nginx的配置基础上不变。这次我们对backend nginx做配置:

 location ~ ^.+\.php {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          fastcgi_param REMOTE_ADDR $HTTP_X_REAL_IP;
  }

就是高亮的第六行,添加fastcgi_param REMOTE_ADDR $HTTP_X_REAL_IP;,把REMOTE_ADDR这个变量在这里就给他替换了。看看替换的结果:

替换REMOTE_ADDR变量

替换REMOTE_ADDR变量

经过这么一折腾,我们的PHP就可以和以前一样工作了。

这样就好了吗?

如果你觉得这样,就可以了,那就错了。虽然我们的PHP正确获得了用户的IP,但是nginx要打access的log,看看他的log,你会发现请求的IP还是front nginx的那个IP。

要解决这个问题,我们就要再修改一把。并且这个解决方案比上一步来的更好一些。完全可以替换上一部的方案。

前端的front nginx的配置和前面一样。

## front nginx 设置
server {
    listen          80;
    server_name     server.com;
    #access_log      /data/home/log/server.access.log main;

    location / {
        proxy_pass http://www.chenyudong.com/;
        proxy_redirect off;
        proxy_set_header X-real-ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

后台的backend nginx要使用set_real_ip_fromreal_ip_header这两个指令,这两个是在nginx的HttpRealipModule中,这个模块默认不被编译,因此需要在编译是添加--with-http_realip_module参数

## 源码编译增加参数
./configure --with-http_realip_module

## yum 安装默认是有安装的,可以
nginx -V ##查看一下编译的参数

后端的backend nginx配置

## backend nginx
location ~ ^.+\.php {
          fastcgi_pass 127.0.0.1:9000;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          include fastcgi_params;
          set_real_ip_from   10.221.0.197;
          #set_real_ip_from   100.100.0.0/16;
          #set_real_ip_from  2001:0db8::/32;
          real_ip_header     X-Real-IP;
}

第7行,set_real_ip_from定义了一个信任的IP地址,从这个信任的IP发送的可以替换用户的IP地址。如果值是unix,所有来自UNIX域的sockets都被信任。

IPv6 addresses are supported starting from versions 1.3.0 and 1.2.1.

第10行,real_ip_header定义了一个请求头,用于替换用户的真实IP。

这样的配置,我们的_SERVER['REMOTE_ADDR']还是用户的真实IP,而不是front nginx的IP。并且log里面的IP也是用户的真实IP。还等什么,赶快试一试吧。

参考资料:

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx 反向代理 proxy – https://www.chenyudong.com/archives/nginx-reverse-proxy.html

分类: 网站建设

nginx编译安装教程

有个需求,要是用nginx的反向代理功能。以前有使用过lnmp,但是这些还用不上,就先自己安装一个单独的nginx服务器就好了。 下载nginx 首先从http://wiki.nginx.org/InstallChs下载源代码。我下载的是http://nginx.org/download/nginx-1.0.2.tar.gz wget http://nginx.org/download/nginx-1.0.2.tar.gz 解压缩安装

tar -zxvf nginx-1.0.2.tar.gz
./configure

出现问题。说

checking for PCRE library … not found checking for PCRE library in /usr/local/ … not found checking for PCRE library in /usr/include/pcre/ … not found checking for PCRE library in /usr/pkg/ … not found checking for PCRE library in /opt/local/ … not found ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the module by using –without-http_rewrite_module option, or install the PCRE library into the system, or build the PCRE library statically from the source with nginx by using –with-pcre=<path> option.

运行yum命令

yum install pcre-devel

也可以参考安装教程http://www.asep.us/2011/05/30/nginx-instalation-pcre-library-not-found/ 出现gzip 类库

./configure: error: the HTTP gzip module requires the zlib library. You can either disable the module by using –without-http_gzip_module option, or install the zlib library into the system, or build the zlib library statically from the source with nginx by using –with-zlib=<path> option.

yum安装

yum install zlib zlib-devel

或者自己编译安装,下载地址:http://zlib.net/zlib-1.2.7.tar.gz 继续安装

你可能还会使用openssl组件,

yum install openssl openssl-devel
./configure --with-http_ssl_module --with-ipv6
make
make install

启动nginx /usr/local/nginx/sbin/nginx 关闭nginx /usr/local/nginx/sbin/nginx -s stop 几个常用的命令

  Nginx -s stop         快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。(quick exit)
  Nginx -s quit         平稳关闭Nginx,保存相关信息,有安排的结束web服务。(graceful exit)
  Nginx -s reload       因改变了Nginx相关配置,需要重新加载配置而重载。(changing configuration,start a new worker,quitting an old worker gracefully.)
  Nginx -s reopen       重新打开日志文件。(reopenging log files)

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: nginx编译安装教程 – https://www.chenyudong.com/archives/nginx-install.html

分类: 网站建设

构建安全的网站登录模块

在开发一个网页的登录模块的时候,需要保证用户的密码安全。像之前的CSDN泄漏密码事件,就导致了许多的未加密的密码直接被知道了。对用户造成了不良的影响。所以构建一个安全的网站登录模块是很重要的事情的。

前提

本篇文章是在没有HTTPS协议下使用的,因为购买SSL证书需要一笔费用,而对于一些非企业的站点,这个费用还是比较多的。所以这篇文章是基于普通的HASH函数(常见的有MD5、SHA-512)进行的。

约定:明文密码 使用单词 password 表示

需要避免的事项

一个安全的网站的数据库要避免以下几条

  • 数据库中不能明文存储密码,即不能只是存储password
  • 不能存储密码的md5,不能存储md5(password)
  • 二次直接md5也是不安全的,不能存储md5(md5(password))

因为明文存储都懂的,万一数据库被攻破了,那密码就全知道了,不好。再就是一次的MD5是不安全的,现在完全能构造一个数据库,存储明文的key,和md5的value,这样通过对密文与数据库对比,就可以找到明文了。所以md5一次也是不安全的。另外两次的md5其实和一次的md5一样,也可以构造一个表,直接对比数据库。

基本要求

有以下的基本需求

  • 不能直接http明文发送密码
  • 不能直接传送密码的md5
  • 二次的密码md5也是不安全的
  • 同样的明文密码password对不同的用户存储不一样值
  • 防止重放攻击

如果http请求中直接传输明文密码,这样就需要数据库中要明文存储password了。其次普通的md5一次和两次md5的password也是没有安全效果的。另外在请求中要有一个是动态变化了,这样如果每次登录都使用同样的参数,第三方在截取http请求后,保存起来,将来可以伪造身份,进行登录。一般解决这个的办法就是添加验证码功能。随机生成一些字母或数字。

实现方法

下面介绍一个方案

数据库方面

针对数据库方面,数据库中不能保存md5(md5(password)),数据库中的密码值至少要有md5(username+md5(password)),这样每个用户名,及时明文密码相同,但是密文的密码却不一样。

网站前台

使用md5的js插件,在提交的时候将密码进行hash,然后和验证码一起在hash一下。提交

网站后台

对数据库中的存储的值和验证码进行hash,然后判断是否符合。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 构建安全的网站登录模块 – https://www.chenyudong.com/archives/build-website-login-security-module.html

分类: 网站建设

lnmp安装包nginx启用ipv6

网站增加了ipv6,使用了nginx服务器,但是使用ipv6地址直接访问nginx,不能连接。查看端口监听情况,并没有监听ipv6的80端口。

查看nginx是否启用ipv6

/usr/local/nginx/sbin/nginx -V  # 自己源码编译安装
/usr/bin/nginx -V               # yum或apt-get自动安装的
configure arguments:   --with-ipv6

省略了一些东西,如果输出中有--with-ipv6,那么说明ngnix已经安装了ipv6模块,否则要先安装ipv6模块。

修改nginx服务器配置文件

/usr/local/nginx/conf/nginx.conf

我装了apache后,原来的nginx配置全部又重新恢复了,我再次使用[::]:80不能绑定到ipv6的80端口上,出现

nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)

我检查80端口,就是没有被占用,换成其他的8080端口就正常。

最后,我是这样设置的,ipv6的80端口可以监听了。

listen 80;
listen [::]:80 ipv6only=on;

另外一种方法。这个方法是在普通的虚拟主机下可用的。

server{
    listen 80;  #此处监听所有ipv4地址
    listen [::]:80; #此处监听所有ipv6地址
    }

重新加载nginx服务器

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

查看端口监听

netstat -ntlp

tcp    0    0 0.0.0.0:80    0.0.0.0:*     LISTEN    1655/nginx.conf
tcp    0    0 :::80         :::*          LISTEN    1655/nginx.conf

0.0.0.0:80说明ipv4的80端口都在监控中。而:::80说明ipv6的80端口都在监控中。

现在就可以使用ipv6访问网站了。

推荐:观看ipv6网络电视

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: lnmp安装包nginx启用ipv6 – https://www.chenyudong.com/archives/lnmp-nginx-enable-ipv6.html

分类: 网站建设

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑