美文网首页
nginx 入门实践(Mac 篇)

nginx 入门实践(Mac 篇)

作者: 卿可津 | 来源:发表于2017-11-10 17:36 被阅读133次

    本文记录了最近在 Mac 学习 nginx 的过程

    嗯… 学习前端已久,经常从各种途径听说什么 nginx,之前从未接触过,感觉它好难,不过稍微看个教程入个门就感觉上手好简单,嗯… 其实就是一个配置文件?10 分钟就上手啊哈哈!

    什么是 nginx ?

    官网:nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server, originally written by Igor Sysoev.

    nginx [engine x] 是一款轻量级的代理服务器,它可以作为 HTTP 代理服务器或反向代理,也可以作为邮件、TCP/UDP 等代理服务器。nginx 最初由 Igor Sysoev 设计。

    nginx 使用场景

    因为我是学习前端的... 在前端方向,个人以为 nginx 在 web 方向最常使用场景是作为前后端分离的静态资源托管和负载均衡服务器。对其在 mail/TCP/UDP 的应用并无过多了解... 学了 nginx 才知道 redis 的作用,所以赶去学习 redis 了,mail 什么的先放下...

    安装 nginx 在 macOS

    mac 上非常简单,敲命令:

    brew install nginx # 这会同时安装 nginx 的依赖库 openssl、pcre 等
    
    • nginx 的配置文件目录在: /usr/local/etc/nginx ,这是 nginx 的默认配置目录,其中最主要的就是 nginx.conf 了,先随便看下。
    • nginx 的安装文件目录在: /usr/local/Cellar/nginx ,brew 把 nginx 安装到了这里,可以注意下 /nginx/html/index.html
    • 这里安装的 nginx 版本为 1.12

    使用 nginx

    首先,我们启动 nginx 服务:

    nginx       # 启动 nginx 服务
    

    接着访问 http://localhost:8080,就能看到 nginx 欢迎页面:

    nginx 欢迎页面.png

    nginx 启动成功!

    此外,nginx 的常用命令也就只有下面几个:

    nginx               # 启动 nginx 服务,使用默认配置:/usr/local/etc/nginx/nginx.conf
    nginx -c filename   # 以此配置文件启动 nginx 服务
    nginx -s stop       # 终止 nginx 服务,不保存相关信息
    nginx -s quit       # 关闭 nginx 服务,保存日志等信息
    nginx -s reload     # 重启 nginx 服务,改动配置文件后使用这个指令
    nginx -t            # 测试配置文件是否正确,仅测试而不运行
    nginx -h            # 帮助我
    
    # 下面就不太常用了
    nginx -s reopen     # 重新打开日志文件
    nginx -v            # 输出 nginx 版本信息
    nginx -V            # 输出 nginx 版本信息和默认配置信息
    nginx -T            # 测试配置文件是否正确,同时输出文件内容,仅测试而不运行
    nginx -p prefix     # 设置 prefix path (默认为: /usr/local/Cellar/nginx/1.12.2_1/)
    

    配置 nginx

    打开刚才的 /usr/local/etc/nginx/nginx.conf ,学习下 nginx 默认的配置文件(双井号是我加上的注释):

    
    #user  nobody;                      ## 运行nginx的当前用户及用户组
    worker_processes  1;                ## 启动进程数
    
    #error_log  logs/error.log;         ## 存储错误日志,语法为 `error_log filename [error_type]`
    #error_log  logs/error.log  notice; ## error_type 默认为 crit(记录最少信息),可选值为 [ debug | info | notice | warn | error | crit ]
    #error_log  logs/error.log  info;
    
    #pid        logs/nginx.pid;         ## 记录 nginx 进程 pid
    
    
    events {                            ## 包含 nginx 中所有处理连接的设置,参考 [nginx配置详解之events模块](http://blog.csdn.net/zhangsheng_1992/article/details/51689980)
        worker_connections  1024;       ## 工作进程的最大连接数
    }
    
    
    http {
        include       mime.types;               ## 引入 mimetypes 文件
        default_type  application/octet-stream; ## mimetypes 默认类型
    
        #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '      ## 格式化日志输出
        #                  '$status $body_bytes_sent "$http_referer" '
        #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
        #access_log  logs/access.log  main; ## 记录服务器访问日志
    
        sendfile        on;                 ## 启动高效传输文件模式,[参考](http://blog.csdn.net/liuxiao723846/article/details/52634622)
        #tcp_nopush     on;                 ## 配置一次发送数据的包大小(另见:tcp_nodelay [参考](http://blog.csdn.net/liuxiao723846/article/details/52634622))
    
        #keepalive_timeout  0;
        keepalive_timeout  65;
    
        #gzip  on;                          ## 启用 gzip
    
        server {
            listen       8080;
            server_name  localhost;
    
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {                    ## 匹配请求路由
                root   html;
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
    
            # redirect server error pages to the static page /50x.html
            #
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
            # proxy the PHP scripts to Apache listening on 127.0.0.1:80
            #
            #location ~ \.php$ {
            #    proxy_pass   http://127.0.0.1;
            #}
    
            # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            #
            #location ~ \.php$ {
            #    root           html;
            #    fastcgi_pass   127.0.0.1:9000;
            #    fastcgi_index  index.php;
            #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    
        # another virtual host using mix of IP-, name-, and port-based configuration
        #
        #server {
        #    listen       8000;
        #    listen       somename:8080;
        #    server_name  somename  alias  another.alias;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    
    
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
    
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
    
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
    
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
    
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
        include servers/*;
    }
    
    

    注意配置文件中的 server { location / { root html; ...} } ,这里的 root 指定 / 路由的根目录为 html 文件夹,回想前面提到的命令:

    nginx -p prefix # 设置 prefix path (默认为: /usr/local/Cellar/nginx/1.12.2_1/)
    

    打开这里的默认路径 /usr/local/Cellar/nginx/1.12.2_1/ (注意这里 nginx 版本号可能不同),刚好有一个 html 文件夹,现在明白 nginx 的 prefix 指令了哈哈!

    另外,默认的配置文件指定的 error_log 的存储位置也是相对此目录的,因此打开 error_log 时如果报错那很可能是因为 prefix 目录下没有这个文件。

    反向代理与负载均衡配置

    使用 nginx 做负载均衡只需两步:

    1. 配置负载均衡服务器列表 upstream
    2. 加入代理转发配置 proxy_pass

    看配置文件的 http 部分:

    http {
        ...
        ## 加入下面的 upstream 配置
        upstream load_balance_server {
            server  localhost:8080  weight=5;
            server  localhost:8081  weight=1;
            server  localhost:8082  weight=1;
        }
        ...
        server {
            ...
            location / {
                root   html;
                index  index.html index.htm;
    
                ## 加入下面的 proxy_pass 配置
                proxy_pass  http://load_balance_server;
            }
        }
        ...
    }
    

    另外,nginx 配置负载均衡默认使用轮询,上面的配置,若有 7 次访问,则分别会有 5、1、1 次命中 8080、8081、8082 端口。关于负载均衡策略参考 nginx负载均衡的5种策略(转载) - 安大叔 - 博客园

    使用 nginx 做负载均衡使用了多台服务器,但每台服务器的用户 session 是不相关的,这就有个问题是用户第一次访问 A 服务器产生了 sessionA,而下一次访问可能变成了 B 服务器,B 服务器发现 session 不存在,要求重新生成 sessionB,于是产生了混乱。于是的于是,持久化 session 解决方案就出现了,比如使用独立的 redis 服务缓存 session。当然 redis 并不是持久化存储,这里的 session 持久化更是相关于服务器来说的,准确的说应该是独立于服务器的 session。因此要赶去学习 redis 啦啦啦~~~

    参考:
    nginx documentation
    nginx中文文档
    nginx负载均衡的5种策略(转载) - 安大叔 - 博客园
    nginx之tcp_nopush、tcp_nodelay - CSDN博客
    nginx配置详解之events模块 - CSDN博客

    相关文章

      网友评论

          本文标题:nginx 入门实践(Mac 篇)

          本文链接:https://www.haomeiwen.com/subject/pscbmxtx.html