配置Lnmp环境中的Nginx与Php

1.编写nginx的启动脚本:vim /etc/init.d/nginx ,加入如下内容:
#!/bin/bash
# chkconfig: - 30 21 #chkconfig后面的数字分别表示:在0-6中的第几级别,启动该服务的顺序,关闭该服务的顺序,也可以用ls -l /etc/rc.d/rc*.d/*nginx查看。
# description: http service.
# Source Function Library
. /etc/init.d/functions #所用的全局的函数。
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx" #变量
NGINX_CONF="/usr/local/nginx/conf/nginx.conf" #变量
NGINX_PID="/usr/local/nginx/logs/nginx.pid" #变量
RETVAL=0
prog="Nginx"

start() {
         echo -n $"Starting $prog: "
         mkdir -p /dev/shm/nginx_temp
         daemon $NGINX_SBIN -c $NGINX_CONF
         RETVAL=$?
         echo
         return $RETVAL
}

stop() {
         echo -n $"Stopping $prog: "
         killproc -p $NGINX_PID $NGINX_SBIN -TERM
         rm -rf /dev/shm/nginx_temp
         RETVAL=$?
         echo
         return $RETVAL
}

reload(){
         echo -n $"Reloading $prog: "
         killproc -p $NGINX_PID $NGINX_SBIN -HUP
         RETVAL=$?
         echo
         return $RETVAL
}

restart(){
         stop
         start
}

configtest(){
     $NGINX_SBIN -c $NGINX_CONF -t
     return 0
}

case "$1" in
   start)
         start
         ;;
   stop)
         stop
         ;;
   reload)
         reload
         ;;
   restart)
         restart
         ;;
   configtest)
         configtest
         ;;
   *)
         echo $"Usage: $0 {start|stop|reload|restart|configtest}"
         RETVAL=1
esac

exit $RETVAL
保存退出。
chmod 755 /etc/init.d/nginx
chkconfig --add nginx
chkconfig nginx on 
service nginx start

2.编写nginx配置文件: vim /usr/local/nginx/conf/nginx.conf ,清空原来的配置,加入如下内容:
user nobody nobody; #启动nginx子进程的用户主和用户组
worker_processes 2; #子进程数目
error_log /usr/local/nginx/logs/nginx_error.log crit; #错误日志和错误日志的级别
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events{
use epoll; #使用epoll模式 
worker_connections 6000; #单个子进程处理的最大请求
}
http{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 3526;
server_names_hash_max_size 4096;
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]' #日志格式
'$host "$request_uri" $status'
'"$http_referer" "$http_user_agent"';
sendfile on;
tcp_nopush on;
keepalive_timeout 30;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path /usr/local/nginx/client_body_temp;
proxy_temp_path /usr/local/nginx/proxy_temp;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
tcp_nodelay on;
gzip on;                           #启用压缩
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm application/xml; #要压缩的文件格式,不支持要压缩图片

server{ #该段是配置一个单独的虚拟主机
listen 80 default_server; #default_server是设置成默认的虚拟主机
server_name localhost; #此处写域名,多个域名用空格隔开
index index.html index.htm index.php;
root /usr/local/nginx/html/; #设置网站根目录
allow 127.0.0.1; #设置网站访问的权限,与apache有些不同,此处ip一旦匹配第一条规则将不再往下匹配。
deny all;               
location ~ \.php$ { #此段是配置nginx解析php,用不到php可以不写此段。
include fastcgi_params;
#fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;      #网页存放的目录
}
}
}
保存退出。
检查配置文件书写正确与否:/usr/local/nginx/sbin/nginx -t

也可以把虚拟主机那一段拿出来,单独写入一个虚拟主机配置文件,方法如下:
将虚拟主机那一段即“server{”开头那一段剪切掉,写上:include /usr/local/nginx/conf/vhosts/*.conf; 保存退出。
检查配置文件书写正确与否:/usr/local/nginx/sbin/nginx -t 
mkdir  /usr/local/nginx/conf/vhosts/
vim /usr/local/nginx/conf/vhosts/default.conf
将虚拟主机那一段粘贴修改成如下:
server{ #该段是配置一个单独的虚拟主机
listen 80 default_server; #default_server是设置成默认的虚拟主机,也可以只写default。
server_name  www.111.com  111.com  www.222.com; #此处写域名,多个域名用空格隔开。也可以写localhost
index index.html index.htm index.php; #解析的网页格式
root /usr/local/nginx/html/; #设置网站根目录
access_log /tmp/1.log combined_realip; #日志存放地址和日志格式
#allow 192.168.1.1; #设置网站访问的权限,与apache有些不同,此处ip一旦匹配第一条规则将不再往下匹配。
#deny all;               
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)${#此段是配置静态文件不记录日志。此行是过滤指定格式文件。
expires      30d;#配置缓存生命周期
access_log off;#配置静态文件不记录日志,或者改为:access_log /dev/null;,效果相同。
}
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)${#此段是配置防盗链。此行是过滤指定格式文件。~*为不区分大小写匹配。
                valid_referers none blocked server_names  *.taobao.com *.baidu.com *.google.com *.google.cn *.soso.com ;#对这些域名的网站不设置防盗链。
                if ($invalid_referer){
rewrite ^/ http://www.example.com/nophoto.gif; #发现被盗链则跳转到一个固定图片上。或者返回403,拒绝访问:return 403;
}
}
if ($host != 'www.111.com' ){ #设置域名重定向
        rewrite  ^/(.*)$  http://www.111.com/$1  permanent;#permanent表示永久重定向,返回码是301。redirect表示临时重定向,返回302。
}
location ~ \.php$ { #此段是配置nginx解析php,用不到php可以不写此段。
include fastcgi_params;
#fastcgi_pass unix:/tmp/php-fcgi.sock; #每个虚拟主机配置文件的server监听不同的socket,php-fpm配置文件中不同的pool监听相应的socket,这样网站就隔开了。
fastcgi_pass 127.0.0.1:9000;#或者每个虚拟主机配置文件的server监听不同的端口,php-fpm配置文件中不同的pool监听相应的端口,这样网站就隔开了。
        fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;      #网页存放的目录
}
}
保存退出。
检查配置文件书写正确与否:/usr/local/nginx/sbin/nginx -t 
启动nginx:/etc/init.d/nginx start
测试:curl http://ip/index.html -i        #ip为主机ip


3.编写php-fpm的配置文件:vim   /usr/local/php/etc/php-fpm.conf ,把之前的内容清空,然后写入如下配置:
[global] #全局参数
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
 
[www1] #池子pool的名称,可配置多个池子
listen = /tmp/php-fcgi.sock #或者写成:listen = 127.0.0.1:9000。和nginx虚拟主机配置文件中这段一致:#fastcgi_pass unix:/tmp/php-fcgi.sock;
user = php-fpm #启动php-fpm时,其子进程所属账户
group = php-fpm # 启动php-fpm时,其子进程所属组
listen.owner = nobody #和nginx的配置文件一致,listen = /tmp/php-fcgi.sock中
listen.group = nobody #和nginx的配置文件一致,
pm = dynamic #子进程启动方式。专用服务器的pm可设为static。静态static时则子进程数固定为pm.max_children。动态dynamic时则先启动pm.start_servers个子进程,之后在pm.min_spare_servers和pm.max_spare_servers影响下动态变化。
pm.max_children = 50 #最大子进程数。若pm = static,则子进程数由该值确定。
pm.start_servers = 20 #启动时子进程数。若pm = dynamic,则子进程数由该值影响。
pm.min_spare_servers = 5 #空闲子进程数最小值,如果空闲进程小于此值,则创建新的子进程。若pm = dynamic,则子进程数由该值影响。
pm.max_spare_servers = 35 #空闲子进程数最大值,如果空闲进程大于此值,此进行清理。若pm = dynamic,则子进程数由该值影响。
pm.max_requests = 500 #一个子进程最大请求数
rlimit_files = 1024 #打开的最大文件数
slowlog = /tmp/slow.log #慢查询日志的路径
request_slowlog_timeout = 1 #慢查询日志的超时时间
php_admin_value[open_basedir]=/data/www/:/tmp/ #配置open_basedir
[www2] 
listen = /tmp/php-www2.sock #这里要和www1里的用不同的名称,不同的pool监听不同的socket。一台机器内通信用socket或者ip端口通信,多台机器只能用ip端口通信。
user = php-fpm 
group = php-fpm
listen.owner = nobody
listen.group = nobody
pm = dynamic
pm.max_children = 50 
pm.start_servers = 20 
pm.min_spare_servers = 5 
pm.max_spare_servers = 35 
pm.max_requests = 500 
rlimit_files = 1024 
保存退出。
检查配置文件书写正确与否:/usr/local/php/sbin/php-fpm -t 
启动php-fpm:/etc/init.d/php-fpm start


4.设置用户认证
由于nginx没有相关功能,设置用户认证要依赖apache的htpasswd命令。首先需要安装apache,可以使用yum install httpd 安装。
/usr/local/apache/bin/htpasswd -c /usr/local/nginx/conf/.htpasswd  test#生成密码文件,创建用户test,第一次添加时需要加-c参数,第二次添加时不需要-c参数。
vim /usr/local/nginx/conf/vhosts/default.conf #在nginx配置文件中的server段内location ~ \.php$行上方添加如下内容
location  ~ .*admin\.php$  { #匹配对于含admin.php的页面进行用户认证
#root /data/www/123/;#针对某个目录设置用户认证。这里貌似不行,因为和全局的root设置冲突。
auth_basic    "Auth";#可能是用户认证的提示
auth_basic_user_file   /usr/local/nginx/conf/.htpasswd;#指定刚刚生成的用户认证密码文件。
#加下面几行配置是因为要解析php文件
include fastcgi_params;
#fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;      #网页存放的目录
 }
保存退出。
检查配置文件书写正确与否:/usr/local/nginx/sbin/nginx -t 
重启nginx:/etc/init.d/nginx restart
测试:curl -I -uuser:passwd -x127.0.0.1:80  www.111.com/admin.php       #其中uer:passwd分别指定用户认证的用户名和密码。
如果一个php页面匹配了这段:“ location  ~ .*admin\.php$  ”,就不再匹配下一段:“location ~ \.php$”。因为它是按照上下匹配的顺序来执行的。


5.日志相关
日志切割
nginx没有默认的日志切割脚本,需要自己写。
vim /usr/local/sbin/nginx_logrotate.sh
#! /bin/bash #方法一
pid=`cat /usr/local/nginx/logs/nginx.pid` #定义变量pid
d=`date -d "-1 day" +%Y%m%d` #定义被分割的日志名
mv /tmp/12.log /tmp/$d.log#将日志重命名
kill -HUP $pid #杀死并重启nginx进程,这样可以重新生成log文件了
gzip -f  /tmp/$d.log #将分割好的日志强制压缩,若压缩文件存在则替换
#! /bin/bash #方法二
datedir=`date +%Y%m%d` #定义被分割日志所存放的目录的名称
/bin/mkdir  /home/logs/$datedir >/dev/null 2>&1 #新建存放被分割文件的的目录
/bin/mv /home/logs/*.log /home/logs/$datedir #将被分割的日志移动到相应文件夹内
/bin/kill -HUP `cat /var/run/nginx.pid` #杀死并重启nginx进程,这样可以重新生成log文件了
日志格式,在主配置文件里定义。
log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format main1 '$proxy_add_x_forwarded_for - $remote_user [$time_local] ' 
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';#此日志格式为,ip不仅记录代理的ip还记录远程客户端真实IP。
错误日志error_log日志级别 
error_log 级别分为 debug, info, notice, warn, error, crit  默认为crit,该级别在日志名后边定义格式为:error_log  /your/path/error.log crit;  
crit 记录的日志最少,而debug记录的日志最多。如果你的nginx遇到一些问题,比如502比较频繁出现,但是看默认的error_log并没有看到有意义的信息,那么就可以调一下错误日志的级别,当你调成error级别时,错误日志记录的内容会更加丰富。


6. 访问控制
限制只让某个ip访问 
allow          219.232.244.234;
deny           all;
禁止某个IP或者IP段访问站点。首先建立下面的配置文件放在nginx的conf目录下面,命名为deny.ip。
cat  deny.ip
deny 192.168.1.11;
deny 192.168.1.123;
deny 10.0.1.0/24;
在nginx的配置文件nginx.conf中加入:include deny.ip; 
重启一下nginx的服务:/usr/local/nginx/sbin/nginx  reload 就可以生效了。 
deny.ip 的格式中也可以用deny all; 
如果你想实现这样的应用,除了几个IP外,其他全部拒绝,那需要你在deny.ip 中这样写:
allow 1.1.1.1; 
allow 1.1.1.2;
deny all;
使用 user_agent 控制客户端访问,其中location这个括号可以不要:
location / {
if ($http_user_agent ~* 'bingbot/2.0|MJ12bot/v1.4.2|Spider/3.0|YoudaoBot|Tomato|Gecko/20100315'){
return 403;
}
}


7.Nginx的Rewrite模块设置
nginx的rewrite用到了HttpRewriteModule,相当于apache的rewriterule。规则与Apache几乎完全一致,不同的是最后的flag标记,多数情况下把原有apache的rewrite规则加上引号即可直接使用。rewrite可以用在server,location和if条件判断块中,命令格式为:rewrite 正则表达式 替换目标 flag标记。
nginx的if条件判断在server和location两种情况下可以使用,条件可以为:正则表达式匹配,文件和目录判断,返回http代码(例如设置防盗链)。

正则表达式匹配:
~ 为区分大小写匹配 
~* 为不区分大小写匹配 
!~ 为区分大小写不匹配
!~* 为不区分大小写不匹配

文件和目录判断:
-f和!-f用来判断是否存在文件 
-d和!-d用来判断是否存在目录 
-e和!-e用来判断是否存在文件或目录 
-x和!-x用来判断文件是否可执行

flag标记有以下几种:
last:完成rewrite后不再匹配后面的规则,相当于Apache里的[L]。这个最常用。
break:完成rewrite后中止Rewirte,不再继续匹配。与last类似。
redirect:临时重定向,返回302。
permanent:永久重定向,返回301。
注意:last和break用来实现URL重写,浏览器地址栏的URL地址不变,但是在服务器端访问的路径发生了变化,重定向时即使不加if条件也不会产生死循环。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址,重定向时如果不加if条件会产生死循环。

举例如下:
例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,$2对应第二个括号(.*)中对应的字符串:
location /download/ { rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break; }

例如下面设定nginx在用户使用ie的使用重定向到/nginx_msie/目录下:
if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /nginx_msie/$1 break; }

例如下面设定nginx在文件和目录不存在的时候重定向:
if (!-e $request_filename) { proxy_pass http://127.0.0.1; }

例如设置nginx防盗链:
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.test.com www.test1.com;
if ($invalid_referer) {
return 404;
}


例如设置域名重定向:
假设server段内server_name行为:server_name  www.111.com  111.com  www.222.com ,加入下面三行:
if ($host != 'www.111.com' ) {
rewrite  ^/(.*)$  http://www.111.com/$1  permanent;#permanent表示永久重定向,返回码是301。redirect表示临时重定向,返回302。
}
保存退出。
检查配置文件书写正确与否:/usr/local/nginx/sbin/nginx -t 
重启nginx:/etc/init.d/nginx restart
测试:curl -I  -x127.0.0.1:80  111.com/123     #测试能否跳转到www.111.com/123。

例如要求访问www.abc.com时,跳转请求到 www.abc.com/abc/:
if ($document_uri !~ 'abc'){
rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
}
$document_uri表示访问的url 
如果只加rewrite规则,而不限定条件,那么会造成死循环。
例如:rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;则会访问到:http://www.abc.com/abc/abc/abc/abc/....

Wordpress的重定向规则:
if (!-e $request_filename) {
rewrite ^/(index|atom|rsd)\.xml$ http://feed.shunz.net last;rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;rewrite ^ /index.php last;
}

nginx的rewrite不支持if嵌套也不支持逻辑或和逻辑并。apache的rewrite是支持或者的,用个OR就可以,如果不加OR,多个RewriteCond 罗列累加就是并且的意思。然后nginx的rewrite就没有这么好了。那么如何去实现这样复杂的功能呢?这就用到了标记功能。
现在出一个简单的需求: 要求访问uri以 /abc/开头的请求,并且user_agent带有ie6或者firefox关键词的请求需要禁止访问。实现方法为:
set $rule 0;
                if ($document_uri ~ '^/abc')
                {
                        set $rule "${rule}1";
                }
                if ($http_user_agent ~* 'ie6|firefox')
                {
                       set $rule "${rule}2";
                }
                if ($rule = "012")
                {
                        deny all;
                }
实践发现,如果定义超过3条rule,当条件中包含两条和两条以上的规则同时存在是,需要把两条规则的条件写到第4条规则前面。
例如,有一个这样的需求:实现rewrite的总前提是,所有请求必须以^/abc 目录为开头。其余规则如下:
1. user_agent 包含 'ipone' 或者'ipad'  或者'ipod' 的请求需要把 *htm 转发为 *html;
2. user_agent 不包含 'ipone' 或者'ipad'  或者'ipod' 并且user_agent 包含'ucweb'的请求需要把*htm 转发为 *html;
3. user_agent 不包含 'ipone' 或者'ipad'  或者'ipod' 并且user_agent 不包含'ucweb'的请求需要把*html 转发为 *htm;

规则语句为:
     set $rule 2;
        if ($document_uri ~* '^/abc')
        {
            set $rule "${rule}1";
        }
        if ($http_user_agent ~* 'ipad|iphone|ipod')
        {
            set $rule "${rule}2";
        }
        if ($rule = "212")
        {
            rewrite ^(.*)\.htm$ $1\.html redirect;
        }
        if ($http_user_agent !~* 'ipad|iphone|ipod')
        {
            set $rule "${rule}3";
        }
        if ($http_user_agent !~* 'ucweb')
        {
            set $rule "${rule}4";
        }
        if ($http_user_agent ~* 'ucweb')
        {
            set $rule "${rule}5";
        }
        if ($rule = "2134")
        {
            rewrite ^(.*)\.html$ $1\.htm redirect;
        }
        if ($rule = "2135")
        {
            rewrite ^(.*)\.htm$ $1\.html redirect;
        }
注意,上面规则把 $rule = "212" 放到了上面,如果放到下面则不能实现跳转。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于微信小程序的家政服务预约系统采用PHP语言和微信小程序技术,数据库采用Mysql,运行软件为微信开发者工具。本系统实现了管理员和客户、员工三个角色的功能。管理员的功能为客户管理、员工管理、家政服务管理、服务预约管理、员工风采管理、客户需求管理、接单管理等。客户的功能为查看家政服务进行预约和发布自己的需求以及管理预约信息和接单信息等。员工可以查看预约信息和进行接单。本系统实现了网上预约家政服务的流程化管理,可以帮助工作人员的管理工作和帮助客户查询家政服务的相关信息,改变了客户找家政服务的方式,提高了预约家政服务的效率。 本系统是针对网上预约家政服务开发的工作管理系统,包括到所有的工作内容。可以使网上预约家政服务的工作合理化和流程化。本系统包括手机端设计和电脑端设计,有界面和数据库。本系统的使用角色分为管理员和客户、员工三个身份。管理员可以管理系统里的所有信息。员工可以发布服务信息和查询客户的需求进行接单。客户可以发布需求和预约家政服务以及管理预约信息、接单信息。 本功能可以实现家政服务信息的查询和删除,管理员添加家政服务信息功能填写正确的信息就可以实现家政服务信息的添加,点击家政服务信息管理功能可以看到基于微信小程序的家政服务预约系统里所有家政服务的信息,在添加家政服务信息的界面里需要填写标题信息,当信息填写不正确就会造成家政服务信息添加失败。员工风采信息可以使客户更好的了解员工。员工风采信息管理的流程为,管理员点击员工风采信息管理功能,查看员工风采信息,点击员工风采信息添加功能,输入员工风采信息然后点击提交按钮就可以完成员工风采信息的添加。客户需求信息关系着客户的家政服务预约,管理员可以查询和修改客户需求信息,还可以查看客户需求的添加时间。接单信息属于本系统里的核心数据,管理员可以对接单的信息进行查询。本功能设计的目的可以使家政服务进行及时的安排。管理员可以查询员工信息,可以进行修改删除。 客户可以查看自己的预约和修改自己的资料并发布需求以及管理接单信息等。 在首页里可以看到管理员添加和管理的信息,客户可以在首页里进行家政服务的预约和公司介绍信息的了解。 员工可以查询客户需求进行接单以及管理家政服务信息和留言信息、收藏信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值