• nginx摘录


    一、nginx安装和配置

    1, nginx windows安装启动
    cd d:\nginx
    start nginx
    对nginx进程控制可以
    nginx -s [ stop | quit | reopen | reload ]

    2, nginx LINUX 安装
    ./configure
    make
    make install

    Nginx默认安装到/usr/local/nginx目录下.可以通过./configure --help看编译选项

    3, nginx 启动
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    -c 指定了配置文件的路径

    4, nginx停止
    从容停止:kill -QUIT `/usr/local/webserver/nginx/logs/nginx.pid`
    快速停止:kill -TERM `/usr/local/webserver/nginx/logs/nginx.pid` 或者 kill -INT `/usr/local/webserver/nginx/logs/nginx.pid`
    强制停止:pkill -9 nginx

    5, nginx平滑重启
    检测配置文件是否正确: nginx -t
    kill -HUP `/usr/local/webserver/nginx/logs/nginx.pid`

    6, nginx 的信号控制
    TERM,INT 快速关闭
    QUIT 从容关闭
    HUP 平滑重启,重新加载配置文件
    USR1 重新打开日志文件,在切割日志时用途很大
    USR2 平滑升级可执行程序
    WINCH 从容关闭工作进程

    7, nginx的平滑升级(不中断服务)
    * 将新版本编译安装到旧版本的Nginx安装路径中。之前,最好备份旧的可执行文件
    * kill -USR2 旧版本的Nginx进程ID
    * 旧版本nginx的主进程将命名他的pid文件为.oldbin(/usr/local/webserver/nginx/nginx.pid.oldbin),然后执行新版本的nginx可执行程序
    * 这时,新的旧的都在运行,kill -WINCH 旧的版本进程 使得从容关闭
    * 慢慢的新的版本开始工作
    * 还可以选择恢复用旧的版本:
          kill -HUP 旧的主进程号:Nginx将在不重新载入配置文件的情况下启动工作进程
          kill -QUIT 新的主进程号:从容关闭其他工作进程
          kill -TERM 新的主进程号:强制退出


    二、Nginx的配置与优化

    1, nginx完整配置示例

    #运行用户和组
    user www www;

    #指定工作衍生进程数(一般等于CUP总核或者总核数的两倍)
    worker_processes 8;  

    #全局错误日志及PID文档 [debug | info | notice | warn | error | crit]
    error_log logs/error.log notice;  
    pid logs/Nginx.pid;

    #指定文件描述符数量
    worker_rlimit_nofile 51200;

    #工作模式及连接数上限
    events {
    # 使用的网络I/O模型,linux推荐epool;freebsd推荐kquequ模型
    use epoll;
    #允许的链接数
    worker_connections 1024;  
    }

    #设定http服务器,利用他的反向代理功能提供负载均衡支持  
    http
    {
    # 开两 php-cgi 服务,端口连接方式速度快,socket方式稳定
        # 使用 lighttpd 的 spawn-fcgi 起的fast-cgi
        # weight 是设置权重
        upstream phpfastcgi {
    server unix:/tmp/php-fastcgi0.sock weight=1;
    server unix:/tmp/php-fastcgi1.sock weight=1;
    # server 127.0.0.1:8000   weight=1;
    # server 127.0.0.1:8001   weight=1;
    }

    # mime 类型 和 默认 header-type
    include       mime.types;
    default_type application/octet-stream;

    # 默认 header-charset
    charset utf-8;

    # 一些限制
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 8m;

    # sendfile 应该是 lighttpd 的 sendfile 是一个意思
        sendfile on;
    tcp_nopush     on;

    keepalive_timeout 60;

    tcp_nodelay on;

    # fastcgi 配置
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;
    fastcgi_buffer_size 64k;
    fastcgi_buffers 4 64k;
    fastcgi_busy_buffers_size 128k;
    fastcgi_temp_file_write_size 128k;

    # 开启gzip
    gzip on;
    gzip_min_length 1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 2;
    gzip_types       text/plain application/x-javascript text/css application/xml;
    gzip_vary on;

    #limit_zone crawler $binary_remote_addr 10m;

    # 定义日志格式
    log_format access '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $http_x_forwarded_for';

    # 定义一个虚拟机
    server
    {
    # 监听端口
    listen       80;
    # 虚拟机名
    server_name klpt-test.domain.com;
    # 如打开的是一个目录,默认的搜 索文件的顺序
            index index.html index.htm index.php;
    # 虚拟机指向的路径
    root /data/www/klpt-test.domain.com/webroot;

    # 如果访问的路径不存在,那么 rewrite给根目录的 index.php,路径以参数url来传递
    location / {
    index index.html index.php;

    if (-f $request_filename) {
    break;
    }

    if (!-f $request_filename) {
    rewrite ^/(.+)$ /index.php?url=$1 last;
    break;
    }
    }

    # 配置PHP
    location ~ \.php$ {
    fastcgi_pass   phpfastcgi;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /data/www/klpt-test.domain.com/webroot$fastcgi_script_name;
    include        fastcgi_params;
    }

    # 图片缓存 30 天
            location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    expires      30d;
    }

    # js 和 css 缓存 1 小时
            location ~ .*\.(js|css)$ {
    expires     1h;
    }
    }

    server
    {
    # 定义的虚拟机监听端口是 443
    listen       443;
    server_name klpt.domain.com;
    index index.html index.htm index.php;
    root /data/www/klpt.domain.com/webroot;

    # 开启 ssl 服务
    # 命令 openssl req -new -x509 -nodes -out klpt-sqladmin.crt -keyout klpt-sqladmin.key
    ssl on;
    ssl_certificate /data/etc/nginx7/conf/klpt-sqladmin.crt;
    ssl_certificate_key /data/etc/nginx7/conf/klpt-sqladmin.key;
    ssl_session_timeout 5m;

    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    #limit_conn   crawler 20;
    # 如果访问的路径不存在,那么rewrite给根目录的 index.php,路径以参数url来传递
    location / {
    index index.html index.php;

    if (-f $request_filename) {
    break;
    }

    if (!-f $request_filename) {
    rewrite ^/(.+)$ /index.php?url=$1 last;
    break;
    }
    }

    # php config
    location ~ \.php$ {
    fastcgi_pass   phpfastcgi;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /data/www/klpt.domain.com/webroot$fastcgi_script_name;
    # 开启 https ,需要此配置
                fastcgi_param HTTPS on;
    include        fastcgi_params;
    }

    # 将静态文件缓存 30 天
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
    expires      30d;
    }

    # log
    access_log /data/log/nginx/nginx_access/nginx_klpt_access.log access;
    }

    # 静态服
        server
    {
    listen       80;
    server_name klpt-static.domain.com;
    index index.html index.htm;
    root /data/www/klpt-static.domain.com;

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
    expires      30d;
    }
    }

    server
    {
    listen       443;
    server_name klpt-sqladmin.domain.com;
    index index.html index.htm index.php;
    root /data/www/klpt-sqladmin.domain.com;

    ssl on;
    ssl_certificate /data/etc/nginx7/conf/klpt-sqladmin.crt;
    ssl_certificate_key /data/etc/nginx7/conf/klpt-sqladmin.key;

    ssl_session_timeout 5m;

    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
    ssl_prefer_server_ciphers   on;

    location ~ \.php$ {
    fastcgi_pass   phpfastcgi;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /data/www/klpt-sqladmin.domain.com$fastcgi_script_name;
    # 开启 https ,需要此配置
                fastcgi_param HTTPS on;
    include        fastcgi_params;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$ {
    expires      30d;
    }

    access_log /data/log/nginx/nginx_access/nginx_sqladmin_access.log access;
    }
    }

    2, nginx虚拟机配置

    一个简化的例子
    http
    {
        server
        {
            listen          80 default;
            server_name     _ *;
            access_log      logs/default.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/htdocs;
            }
        }
    }

    配置基于IP的虚拟主机

    给eth0网卡设备添加两个IP别名192.168.8.43 和192.168.8.44
    ifconfig eth0:1 192.168.8.43 netmask 255.255.255.0 up
    route add -host 192.168.8.43 dev eth0:1

    ifconfig eth0:2 192.168.8.44 netmask 255.255.255.0 up
    route add -host 192.168.8.44 dev eth0:2

    配置
    http
    {
        #第一个虚拟主机
        server
        {
            listen          192.168.8.43:80;
            server_name     192.168.8.43;
            access_log      logs/server1.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/server1;
            }
        }
        #第二个虚拟主机
        server
        {
            listen          192.168.8.44:80;
            server_name     192.168.8.44;
            access_log      logs/server2.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/server2;
            }
        }
        #第三个虚拟主机
        server
        {
            listen          192.168.8.45:80;
            server_name     192.168.8.45;
            access_log      logs/server3.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/server3;
            }
        }
    }

    配置基于域名的虚拟主机
    aaa.domain.com 第一个虚拟主机处理
    bbb.otherdomain.com 第二个虚拟主机处理
    第三个处理除了aaa.domain.com之外的*.domain.com和www.domain.com domain.com

    http
    {
        #11111111
        server
        {
            listen          80 default;
            server_name     aaa.domain.com;
            access_log      logs/aaa.domain.com.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/aaa.domain.com;
            }
        }
        #2222222
        server
        {
            listen          80 default;
            server_name     bbb.otherdomain.com;
            access_log      logs/aaa.domain.com.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/bbb.otherdomain.com;
            }
        }
        #33333
        server
        {
            listen          80 default;
            server_name     www.domain.com domain.com *.domain.com;
            access_log      logs/domain.com.access.log combined;
            location / {
                index   index.html;
                root    /data0/htdocs/domain.com;
            }
        }
    }

    3, nginx的日志文件配置与切割

    log_format main '$remote_addr – $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" ' ;
    记录真实IP
    log_format main '$http_x_forwarded_for – $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" ' ;

    日志分割
    mv /data1/logs/access.log /data1/logs/20090318.log
    kill -USR1 nginx进程号

    写成脚本
    #!/bin/bash
    logs_path = "/data1/logs/"

    mkdir -p ${logs_path}${date -d "yesterday" + "%Y"}/{date -d "yesterday" + "%m"}/
    mv ${logs_path}/access.log ${logs_path}${date -d "yesterday" + "%Y"}/{date -d "yesterday" + "%m"}/access_${date -d "yesterday" + "%Y%m%d"}.log
    kill -USR1 `cat /usr/local/webserver/nginx/nginx.pid`

    crontab -e
    00 00 * * * /bin/bash the.sh


    三、Nginx反向代理和负载均衡
    nginx的upstream目前支持4种方式的分配

    1)、轮询(默认)

    每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

    2)、weight

    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

    2)、ip_hash

    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

    3)、fair(第三方)

    按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    4)、url_hash(第三方)

    upstream bbs.linuxtone.org {#定义负载均衡设备的Ip及设备状态

        server 127.0.0.1:9090 down;

        server 127.0.0.1:8080 weight=2;

        server 127.0.0.1:6060;

        server 127.0.0.1:7070 backup;

    }
    在需要使用负载均衡的server中增加代码
        proxy_pass [url]http://bbs.linuxtone.org/[/url];

    每个设备的状态设置为:代码:
        1.down 表示单前的server暂时不参与负载
       
        2.weight 默认为1.weight越大,负载的权重就越大。
       
        3.max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
       
        4.fail_timeout:max_fails次失败后,暂停的时间。
       
        5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
       
        client_body_in_file_only 设置为On 可以讲client post过来的数据记录到文件中用来做debug
       
        client_body_temp_path 设置记录文件的目录 可以设置最多3层目录
       
        location 对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
       

    代码实例

    ……….

    #loadblance my.linuxtone.org

           upstream  my.linuxtone.org  {

           ip_hash;

           server   127.0.0.1:8080;

           server   192.168.169.136:8080;

           server   219.101.75.138:8080;

           server   192.168.169.117;

           server   192.168.169.118;

           server   192.168.169.119;

         }

    …………..

    include          vhosts/linuxtone_lb.conf;

    ………

    #vi proxy.conf

    proxy_redirect off;

    proxy_set_header Host $host;

    proxy_set_header X-Real-IP $remote_addr;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    client_max_body_size 50m;

    client_body_buffer_size 256k;

    proxy_connect_timeout 30;

    proxy_send_timeout 30;

    proxy_read_timeout 60;

     

    proxy_buffer_size 4k;

    proxy_buffers 4 32k;

    proxy_busy_buffers_size 64k;

    proxy_temp_file_write_size 64k;

    proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;

    proxy_max_temp_file_size 128m;

    proxy_store on;

    proxy_store_access   user:rw  group:rw  all:r;

    #nginx cache              

    client_body_temp_path  /data/nginx_cache/client_body 1 2;

    proxy_temp_path /data/nginx_cache/proxy_temp 1 2;#vi linuxtone_lb.conf

    server

        {
            listen  80;
            server_name my.linuxtone.org;
            index index.php;
            root /data/www/wwwroot/mylinuxtone;
            if (-f $request_filename) {
                break;
               }
            if (-f $request_filename/index.php) {
              rewrite (.*) $1/index.php break;
            }

            error_page 403 [url]http://my.linuxtone.org/member.php?m=user&a=login[/url];
            location / {
               if ( !-e $request_filename) {
                   proxy_pass [url]http://my.linuxtone.org[/url];
                   break;
               }
               include /usr/local/nginx/conf/proxy.conf;
            }
    }


    四、Nginx Redirect

    将所有linuxtone.org与abc.linuxtone.org域名全部自跳转到http://www.linuxtone.org代码

    server
           {
                   listen       80;
                   server_name  linuxtone.org abc.linuxtone.org;
                   index index.html index.php;
                   root  /data/www/wwwroot;
                   if ($http_host !~ "^www\.linxtone\.org$") {
                           rewrite  ^(.*)    [url]http://www.linuxtone.org[/url]$1 redirect;
                     }
           }

    参考
    http://bbs.chinaunix.net/viewthread.php?tid=1319835&highlight=nginx

  • 相关阅读:
    ActiveX控件开发总结(续)
    Guru of the Week 条款04: 类的构造技巧
    tk
    C++中一个空类的大小为什么是1?
    虚继承
    计算机单位
    Guru of the week:#18 迭代指针.
    kingofark关于学习C++和编程的50个观点
    Guru of the Week 条款06:正确使用const
    Guru of the Week 条款07:编译期的依赖性
  • 原文地址:https://www.cnblogs.com/imouren/p/2217736.html
Copyright © 2020-2023  润新知