nginx虚拟主机
vim /usr/local/nginx/conf/nginx.conf
增加include vhost/*.conf;
mkdir /usr/local/nginx/conf/vhost
vim /usr/local/nginx/conf/vhost/aaa.com.conf #虚拟主机配置文件
server
{
listen 80 default_server; (有default_serve就是默认虚拟主机)
server_name aaa.com; (定义网站名字)
index index.html index.htm index.php;
root /data/wwwroot/default; (定义配置文件目录,还没创建)
}
如果给虚拟主机配置php解析就加入:
server
{
listen 80 default_server;
server_name aaa.com;
index index.html index.htm index.php;
root /data/wwwroot/default;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}
}
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; #用户的密码文件
}
}
创建密码文件在此需要使用Apache的/usr/local/apache/bin/htpasswd命令,需要使用yum安装httpd命令:
htpasswd -c /usr/local/nginx/conf/htpasswd quyifan
nginx域名重定向
vim /usr/local/nginx/conf/vhost/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; (这里指不是rest.com的全部跳转)
}
}
nginx访问日志
vim /usr/local/nginx/conf/vhost/test.com.conf
access_log /tmp/test.com.log quyifan
nginx日志切割
vim /usr/local/sbin/nginx_log_rotate.sh shell脚本保存在这里
配置如下
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d`
#定义切割时间(切割一天前的日志)
logdir="/tmp/"
#此处指定要切割的日志路径(该路径来自虚拟主机配置文件)
nginx_pid="/usr/local/nginx/logs/nginx.pid"
#调用pid的目的是执行命令:/bin/kill -HUP `cat $nginx_pid`
#该命令等价于命令:nginx -s reload(重新加载文件),确保与虚拟主机配置文件变更保持同步
#该地址来自nginx配置文件
cd $logdir
for log in `ls *.log`
do
mv $log $log-$d
done
#此处使用通配进行循环,对所有复合条件的日志文件进行切割
/bin/kill -HUP `cat $nginx_pid`
#执行此命令进行重载生成新的日志文件来记录新的日志
nginx静态不记录日志和过期时间
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ 正则
{
expires 7d; (上下写一起是因为设置的过期时间不同)
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
防盗链
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
{
expires 7d;
valid_referers none blocked server_names *.test.com ;
#这里定义.test.com为白名单
if ($invalid_referer) {
return 403;
#这里表示如果不在白名单内直接回馈403
}
access_log off;
}
nginx访问控制
#限制某些ip不能访问,或者只允许一部分访问
location /admin/
{
allow 192.168.153.130;
allow 127.0.0.1;
deny all;
}
#如果只拒绝几个ip的访问就是
location /admin/
{
deny 192.168.188.1;
deny 192.168.8.8;
}
#可以匹配正则来限制
location ~ .*(abc|image)/.*\.php$
{
deny all;
}
#根据user_agent限制,用的很多受到cc攻击,要禁掉百度蜘蛛,想做被隐藏的网站
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
return 403;
}
这里~指匹配符号,只要有Spider/3.0或YoudaoBot或Tomato字符串的直接被拒绝,返回403
Nginx解析php
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock; (此处错误出现502,找不到sock)
#fastcgi_pass 127.0.0.1:9000
#fastcgi_pass 两种监听格式,但是要保证Nginx和php-fpm中格式一致
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
#这里的地址和最上面的root保持一致
}
Nginx代理
server
{
listen 80;
server_name ask.apelearn.com;
location /
{
proxy_pass http://121.201.9.155/;
#这里是告诉Nginx代理服务器,真正要被访问的web服务器ip是多少
proxy_set_header Host $host;
#Host指的是要访问的域名servername,就是代理服务器真正访问的域名ask.apelearn.com
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx负载均衡
upstream qq
#这里定义后端的web server,可以是一个或多个
{
ip_hash;
#表示负载均衡算法,表示根据ip地址把请求分到不同服务器上(同一个用户始终保持在同一个机器上)
#例如访问阿铭论坛,第一次在发帖子登录,刷新后发现没登录,就是访问到另一个机器上了
#用户A与用户Bip不同,A访问时会把请求转发到第一个web server上,B访问会到第二个web server上
#这种算法用在把session存到本机磁盘的情况
server 61.135.157.156:80;
server 125.39.240.113:80;
#这里定义多个ip
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq;(这里写upstream的名字,代表它下面的ip)
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx配置ssl
server
{
listen 443;
server_name aming.com;
index index.html index.php;
root /data/wwwroot/aming.com;
ssl on;
ssl_certificate aminglinux.crt;
ssl_certificate_key aminglinux.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
php-fpm配置文件
php-fpm作为独立的一个服务存在,必然有自己的配置文件,/usr/local/php-fpm/etc/php-fpm.conf
vim /usr/local/php-fpm/etc/php-fpm.conf
#加入第二行配置,这里没有把两个pool分开
[aming]
listen = /tmp/aming.sock
listen.mode=666
user = php-fpm
group = php-fpm
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
vim /usr/local/php-fpm/etc/php-fpm.conf //主配置文件中的[global]部分增加
include = etc/php-fpm.d/*.conf
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf
#这里把两个pool分开和nginx.conf类似
vim /usr/local/nginx/conf/vhost/aaa.com.conf
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/aming.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name;
}
php-fpm慢执行日志
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf//加入如下内容
request_slowlog_timeout = 1 (可以写成两秒很多脚本都超过一秒)
#定义超时时间,即php的脚本执行时间超过1秒就会记录日志
slowlog = /usr/local/php-fpm/var/log/www-slow.log
#定义慢执行日志的路径和名字,遇到php网站访问卡顿,来查看这个慢执行日志
open_basedir
安全限制
当一台服务器跑多个站点时,使用openbasedir限定各个站点所能访问的服务器上的目录的范围
vim /usr/local/php-fpm/etc/php-fpm.d/aming.conf//加入如下内容
php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/
php-fpm进程管理
vim /usr/local/php/etc/php-fpm.d/www.conf 配置文件内容
pm = dynamic
#定义php子进程启动模式,dynamic动态进程管理模式,指一开始启动少量子进程,根据实际需求,动态的增加或减少子进程,最多不超过下面pm.max_children定义的数值
#也可以是static,这种模式下进程数由pm.max_children决定,一次性启动这么多,不会增加或减少
pm.max_children = 50
#最大子进程数,ps aux可以查看
pm.start_servers = 20
#针对dynamic模式,定义启动php-fpm服务时会启动的进程数
pm.min_spare_servers = 5
#针对dynamic模式,定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程
pm.max_spare_servers = 35
#针对dynamic模式,定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程
pm.max_requests = 500
#针对dynamic模式,定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出
来源:oschina
链接:https://my.oschina.net/u/3655649/blog/1612080