• nginx配置指南


    nginx(读作engine x)是一款设计优秀的Http服务器, 其占用内存少, 负载能力强且稳定性高, 正在被越来越多的用户所采用.

    nginx可以为HTTP, HTTPS, SMTP, POP3, IMAP协议提供反向代理服务, 并提供安全, 负载均衡和静态文件服务.

    本文将简单介绍在ubuntu平台上nginx配置方式. 使用apt-get包管理器安装nginx:

    apt-get install nginx
    

    本文示例在nginx/1.4.6版本上测试通过:

    $ nginx -v
    nginx version: nginx/1.4.6 (Ubuntu)
    

    初识nginx

    apt-get默认将nginx安装在/usr/sbin/nginx目录下.

    我们可以通过编写/etc/nginx目录下的配置文件来操作nginx:

    $ ls /etc/nginx/
    conf.d mime.types nginx.conf  proxy_params  sites-available  uwsgi_params
    fastcgi_params  scgi_params   sites-enabled 
    

    核心配置文件为nginx.conf, 为了便于管理多个站点可以将不同站点的配置文件放在sites-available, sites-enabled或自定义目录中, 而后导入到nginx.conf中.

    nginx是一个高并发性能的服务器, 其采用一个master进程管理多个worker进程的方式提供服务.nginx推荐worker进程数与CPU核心数相同.

    每个worker进程采用非阻塞的事件模型为多个客户端链接提供服务, 如epollselect. 非阻塞IO允许在内核执行IO操作时worker进程为其它客户提供服务.

    更多讨论可以参考Linux的IO模型.

    nginx.conf进行nginx并发配置:

    worker_processes 4;
    
    events {
            worker_connections 768;
            use epoll;
            # multi_accept on;
    }
    

    日志

    nginx默认将服务器日志保存在/var/log/nginx/目录中, 日志分为access.logerror.log两种.

    修改nginx.conf的http配置项下的日志配置:

    http {
      access_log /var/log/nginx/access.log;
      error_log /var/log/nginx/error.log info;
    }
    

    error的级别从低到高为:

    1. debug
    2. info
    3. notice
    4. warn
    5. error
    6. crit
    7. alert
    8. emerg

    access.log保存正常访问记录, 包括时间, 源地址, 目的地址, 状态码和客户端类型等信息:

    101.226.33.238 - - [04/Mar/2017:12:08:25 +0800] "GET /static/js/jquery-2.1.0.js HTTP/1.1" 200 244963 "http://test.cn" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2141.400 QQBrowser/9.5.10219.400"
    

    error.log保存服务器出错信息, 在发生故障时请记得检查error.log中的错误报告.

    操作

    使用sudo service [option]命令或sudo /etc/init.d/nginx [option]命令来管理nginx. 它们提供的选项有:

    option 操作
    start 启动
    status 状态
    stop 停止
    restart 重启服务, 即stop+start
    reload 重新加载配置
    force-relaod 强制重新加载
    configtest 测试配置文件
    rotate 打包日志

    比如启动服务器时可以使用sudo service startsudo /etc/init.d/nginx start命令.

    reload采用平滑升级的方式, 当更新配置时master会先加载新配置文件并检查语法. 然后, 尝试应用新的配置.

    若尝试失败则回滚到之前的配置, 若成功则开启新的worker进程. 在新worker进程上线提供服务后, 关闭旧的的worker实现平滑升级.

    关于nginx更新配置的更多信息可以参考官网的Changing Configuration.

    nginx在日志文件过大时会自动将日志文件压缩并重新编号, 这个过程称为rotate:

    $ ls /var/log/nginx/
    access.log access.log.3.gz access.log.2.gz access.log.1.gz
    error.log error.log.3.gz error.log.2.gz error.log.1.gz
    

    反向代理

    反向代理是服务端的代理, 它根据客户端请求从服务端获取响应, 然后将服务端的响应返回给客户端.

    反向代理服务器在为每个客户端服务时需要再与服务端建立链接, 即需要建立两个链接.

    我们在nginx.conf的http项中添加server配置项:

    http {
    	# ...
        server {
          listen 80;
          server_name test.site.cn;
          client_max_body_size 1M;
    
          location / {
              proxy_pass http://127.0.0.1:8001;
    
               proxy_http_version 1.1;
               proxy_pass_header Server;
               proxy_set_header Host $http_host;
               proxy_set_header X-Real-IP $remote_addr;
               proxy_set_header X-Scheme $scheme;
               proxy_redirect off;
           }
        }
        # ...
    }
    

    上述配置要求nginx监听80端口, 所有发往本机且目标地址为"test.site.cn"的Http请求都会根据路径.

    location配置项设置发往特定路由的请求, 如location /static/ {}将配置发往test1.cn/static/下的请求.

    location / {}是优先级最低的配置项, 当没有其它location配置可以匹配请求时, 该请求将按照location /的配置进行处理.

    proxy_pass是最重要的配置, 上述示例中所有匹配到location /的请求都将被转发到http://127.0.0.1:8001. 我们需要在8001端口上部署uwsgi, fcgi, libhttpd等提供服务.

    因为8001端口上的服务端收到的是来自nginx的链接, 所以必要时我们需要将原请求的信息放入header中通知8001上的服务端.

    静态文件

    nginx可以通过sendfile和cache等机制加速静态文件的访问, 只需要在location下添加root配置项:

    location /static/ {
        root  /home/www/site;
        expires 1d;
    }
    

    添加上述配置后, 对/static/file的访问都将由nginx直接返回/home/www/site/static/file/的内容.

    或者根据后缀名提供静态文件服务:

     location ~ .(jpg|jpeg|png|gif)$ {  
    		root  /home/www/site;
    		expires 1d;  
      
    }  
    

    expires用于设置缓存失效时间, 在首次访问静态文件时文件将被读入缓存. 在缓存失效前对该文件的访问都将直接从缓存中读取.

    在http下设置sendfile on;启动sendfile加速. sendfile是Linux2.0之后加入的系统调用, 传统文件传输过程为

    disk->kernel buffer->user buffer->socket buffer (kernel)->send
    

    sendfile将减少不必要的内核态-用户态切换以及拷贝过程, 直接由硬盘读入socket buffer:

    disk -> socket buffer (kernel) -> send
    

    websocket

    从nginx1.3开始, nginx可以为websocket提供反向代理:

    http {
    	# websocket
    	map $http_upgrade $connection_upgrade {
    		default upgrade;
    		''        close;
    	}
    	
    	server {
    		listen 80;
    		server_name ws.site.cn;
    		location / {
    			proxy_pass http://127.0.0.1:8002;
    			# add necessary header for websocket
    			proxy_set_header Upgrade $http_upgrade;
    			proxy_set_header Connection "upgrade";
    		}
    	}
    }
    

    只需要配置map并添加两个必要的header即可.

  • 相关阅读:
    SPAN和DIV的区别
    利用XMLHTTP无刷新添加数据之Post篇
    在Asp.net中上传大文件的解决方法
    在事务中执行批量复制操作
    Microsoft Visual SourceSafe 使用指南
    恢复只有MDF文件的MS SQL数据库
    配置sql server 2000以允许远程访问
    转: Bill Gates 哈佛大学毕业典礼演讲1
    用于对数据库进行操作的类库经验的总结
    用于对数据库进行操作的类库经验的总结 (二)
  • 原文地址:https://www.cnblogs.com/Finley/p/6502018.html
Copyright © 2020-2023  润新知