Nginx默认虚拟主机

vim /usr/local/nginx/conf/nginx.conf //增加
 include vhost/*.conf
 mkdir /usr/local/nginx/conf/vhost
 cd  /usr/local/nginx/conf/vhost
 vim default.conf //加入如下内容
server
{
    listen 80 default_server;  // 有这个标记的就是默认虚拟主机
    server_name aaa.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 123.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   //yum安装的htpasswd在/usr/bin/g下,只接用
 htpasswd -c /usr/local/nginx/conf/htpasswd aming
 -t &&  -s reload //测试配置并重新加载
 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 访问状态码变为200
 编辑windows的hosts文件,然后在浏览器中访问test.com会有输入用户、密码的弹窗
 针对目录的用户认证
location  /admin/
    {
        auth_basic              "Auth";
        auth_basic_user_file   /usr/local/nginx/conf/htpasswd;
}

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;
    }
}
 server_name后面支持写多个域名,这里要和httpd的做一个对比
 permanent为永久重定向,状态码为301,如果写redirect则为302

Nginx访问日志

日志格式
> vim /usr/local/nginx/conf/nginx.conf //搜索log_format
> $remote_addr                  客户端IP(公网IP)
> $http_x_forwarded_for    代理服务器IP
> $time_local                      服务器本地时间
> $host                               访问主机名(域名)
> $request_uri                    访问的url地址
> $status                            状态码
> $http_referer                   referer
> $http_user_agent           user _agent
除了在主配置文件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

静态文件不记录日志和过期时间

配置如下
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
   {
         expires      7d;
         access_log off;
   }
location ~ .*\.(js|css)$
   {
         expires      12h;
         access_log off;
   }

Nginx防盗链

配置如下,可以和上面的配置结合起来
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 ;  //定义白名单referer可以添加多个
   if ($invalid_referer) {
      return 403;	#也可以改为rewrite ^/ http://test.com/333.gif;  表示把它重定向到一个禁止外链的图片上
   }
   access_log off;    //访问日志不记录
}
//防盗链的配置主要是valid这地段
//curl -e "http://www.baidu.com"  指定referer

Nginx访问控制

 需求:访问/admin/目录的请求,只允许某几个IP访问,配置如下:
location /admin/
{
   allow 192.168.133.1;
   allow 127.0.0.1;
   deny all;
}
mkdir /data/wwwroot/test.com/admin/
echo “test,test”>/data/wwwroot/test.com/admin/1.html
-t && -s reload
curl -x127.0.0.1:80 test.com/admin/1.html -I
curl -x192.168.133.130:80 test.com/admin/1.html -I
可以匹配正则
location ~ .*(abc|image)/.*\.php$
{
       deny all;
}
根据user_agent限制
if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')
{
     return 403;
}
deny all和return 403效果一样

Nginx解析php的配置

配置如下:
location ~ \.php$
    {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/php-fcgi.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
    }
 fastcgi_pass 用来指定php-fpm监听的地址或者socket
 fastcgi_pass指定的要和/usr/local/php/etc/php-fpm.conf里listen = /tmp/php-fcgi.sock相对应
 502错误原因:1,astcgi_pass 后面的路径写错
                         2,资源耗尽,调整pm.max_children数值,使其增加
					     3,除以上两种,还有其他的,可以去查看错误日志

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/;
        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负载均衡

vim /usr/local/nginx/conf/vhost/load.conf // 写入如下内容

upstream sina
{
    ip_hash;
    server 119.36.161.78:80;
    server 119.36.161.79:80;
}
server
{
    listen 80;
    server_name www.sina.com.cn;
    location /
    {
        proxy_pass      http://sina;
        proxy_set_header Host   $host;
        proxy_set_header X-Real-IP      $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

upstream来指定多个web server curl -x127.0.0.1:80 www.sina.com.cn nginx不支持代理https

SSL工作流程

1浏览器发送一个https的请求给服务器; 2服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥; 3服务器会把公钥传输给客户端; 4客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密; 5客户端把加密后的随机字符串传输给服务器; 6服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容); 7服务器把加密后的数据传输给客户端; 8户端收到数据后,再用自己的私钥也就是那个随机字符串解密;

生成SSL密钥对

cd /usr/local/nginx/conf
 openssl genrsa -des3 -out tmp.key 2048         //key文件为私钥
 openssl rsa -in tmp.key -out aminglinux.key    //转换key,取消密码 
 rm -f tmp.key
 openssl req -new -key aminglinux.key -out aminglinux.csr  //生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
 openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt
 这里的aminglinux.crt为公钥  aminglinux.key为私钥
    

Nginx配置SSL

vim /usr/local/nginx/conf/vhost/ssl.conf//加入如下内容
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;   //指定协议
}
-t && -s reload //若报错unknown directive “ssl” ,需要重新编译nginx,加上--with-http_ssl_module
mkdir /data/wwwroot/aming.com
echo “ssl test page.”>/data/wwwroot/aming.com/index.html
编辑/etc/hosts,增加127.0.0.1 aming.com
curl https://aming.com/
或者在widows上编辑host浏览器上测试
沃通:https://www.wosign.com/  买证书
12306使用自己的证书,但是其它浏览器不识别

php-fpm的pool

vim /usr/local/php/etc/php-fpm.conf    //在[global]部分增加
 include = etc/php-fpm.d/*.conf
 mkdir /usr/local/php/etc/php-fpm.d/
 cd /usr/local/php/etc/php-fpm.d/
 vim www.conf //内容如下
[www]
listen = /tmp/www.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 aming.conf //内容如下
[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
 /usr/local/php/sbin/php-fpm –t
 /etc/init.d/php-fpm restart
多个pool的好优点:
如果多个网站共用一个pool,而其中一个站点把php资源耗尽,那其他的站点也会出现502错误,所以有必要把每个站点隔离开来,每个站点使用单独的pool

php-fpm慢执行日志

vim /usr/local/php-fpm/etc/php-fpm.d/www.conf     //加入如下内容
request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log
 配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为unix:/tmp/www.sock
 重新加载nginx服务
 vim /data/wwwroot/test.com/sleep.php//写入如下内容
 <?php echo “test slow log”;sleep(2);echo “done”;?>
 curl -x127.0.0.1:80 test.com/sleep.php 
 cat /usr/local/php-fpm/var/log/www-slow.log

php-fpm定义open_basedir

vim /usr/local/php-fpm/etc/php-fpm.d/aming.conf   //加入如下内容
php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/
 创建测试php脚本,进行测试
 再次更改aming.conf,修改路径,再次测试
 配置错误日志
 再次测试
 查看错误日志

php-fpm进程管理

pm = dynamic  //动态进程管理,也可以是static
 pm.max_children = 50 //最大子进程数,ps aux可以查看
 pm.start_servers = 20 //启动服务时会启动的进程数
 pm.min_spare_servers = 5 //定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。
 pm.max_spare_servers = 35 //定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
 pm.max_requests = 500  //定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。