Nginx默认虚拟主机
去掉 usr/local/nginx/conf/nginx.conf 中 的内容
Server
{
.....
}
vim /usr/local/nginx/conf/nginx.conf //增加
include vhost/*.conf; //注意;号别漏, 在conf目录下加个vhost目录
mkdir /usr/local/nginx/conf/vhost
cd !$
vim default.conf //加入如下内容
server
{
listen 80 default_server; // 有这个标记的就是默认虚拟主机
server_name 120.com;
index index.html index.htm index.php;
root /data/wwwroot/default;
}
mkdir -p /data/wwwroot/default/
echo "This is a default site." >/data/wwwroot/default/index.html
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl localhost
curl -x127.0.0.1:80 120.com
Nginx用户认证
vim /usr/local/nginx/conf/vhost/test.com.conf//写入如下内容
server
{
listen 80;
server_name test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
location /
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
yum install -y httpd
htpasswd -c /usr/local/nginx/conf/htpasswd aming -c 创建 -m md5加密, 第二次用不用 -c创建了
mkdir /data/wwwroot/test.com
echo "test.com">/data/wwwroot/test.com/index.html
curl -x127.0.0.1:80 test.com -I //状态码为401说明需要验证
curl -uaming:passwd -x127.0.0.1:80 test.com -I 访问状态码变为200 passwd改为自己的aming的密码
-t && -s reload //测试配置并重新加载
编辑windows的hosts文件,然后在浏览器中访问test.com会有输入用户、密码的弹窗
针对目录的用户认证
location /admin/
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
mkdir /data/wwwroot/test.com/admin
echo "admin in test.com">/data/wwwroot/test.com/admin/index.html
-t && -s reload //测试配置并重新加载
针对单个文件
location ~ admin.php // ~(.*)admin.php$ 更全面匹配 包含 admin php结尾的文件
Nginx域名重定向
更改test.com.conf
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
}
permanent 301的意思, 想改成302用 redirect
server_name后面支持写多个域名,这里要和httpd的做一个对比
permanent为永久重定向,状态码为301,如果写redirect则为302
测试
curl -x127.0.0.1:80 test1.com/1.php -i
Nginx访问日志
日志格式 vim /usr/local/nginx/conf/nginx.conf //搜索log_format
combined_realip 为 日志定义的名字, 可自己更改。
除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中增加
access_log /tmp/1.log combined_realip;
这里的combined_realip就是在nginx.conf中定义的日志格式名字, 如果不写会使用默认的日志格式(比较简单)
-t && -s reload curl -x127.0.0.1:80 test.com -I cat /tmp/1.log
Nginx日志切割
自定义shell 脚本
vim /usr/local/sbin/nginx_log_rotate.sh//写入如下内容
#! /bin/bash
## 假设nginx的日志存放路径为/data/logs/
d=`date -d "-1 day" +%Y%m%d`
logdir="/data/logs"
nginx_pid="/usr/local/nginx/logs/nginx.pid" //pid位置要正确
cd $logdir
for log in `ls *.log`
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid` //等效于 /usr/local/nginx/sbin/nginx -s reload
sh -x /usr/local/sbin/nginx_log_rotate.sh // x选项可看到脚本执行过程
静态文件不记录日志和过期时间
配置如下 红色的\代表脱意 | 表示或者 expires 过期时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico)$
{
expires 7d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
-t && -s reload
curl -x127.0.0.1:80 -I www.test.com/images/123.png
tail -f /tmp/1.log
Nginx防盗链
location ~* ^.+\.(ico|gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
{
expires 7d;
valid_referers none blocked server_names *.test.com ; //先定义一个白名单
if ($invalid_referer) {
return 403; //也可以写成 deny all
}
access_log off;
}
Nginx访问控制
需求:访问/admin/目录的请求,只允许某几个IP访问,配置如下:
location /admin/
{
allow 192.168.192.134;
allow 127.0.0.1;
deny all;
}
nginx并没有顺序一说, 但一旦匹配一条规则, 后面将不再匹配
Nginx解析php相关配置
vim /data/wwwroot/test.com/1.php //增加如下内容, 并打开网页测试, 并不能做php解析
<?php
phpinfo();
?>
配置如下: //让nginx能解析php
location ~ \.php$
{
# include语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中
include fastcgi_params;
# fastcgi_pass 用来指定php-fpm监听的地址或者socket, 可以是本机或者其它
fastcgi_pass unix:/tmp/php-fcgi.sock; //写错会报错502错误 , 检查/usr/local/php-fpm/etc/php-fpm.conf 里listen定义的是什么,可改为监听ip和端口
fastcgi_index index.php;
# 脚本文件请求的路径
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name; //路径要写对, 红色指的是配置文件里的root部分
}
Nginx代理
cd /usr/local/nginx/conf/vhost
vim proxy.conf //加入如下内容
server
{
listen 80;
server_name ask.apelearn.com; //定义用户访问的域名
location /
{
proxy_pass http://121.201.9.155/; //告诉nginx真正的ip在这里(web服务器ip)
proxy_set_header Host $host; //$host 等于 上面的 server_name
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}