本文记录了最近在 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 启动成功!
此外,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 做负载均衡只需两步:
- 配置负载均衡服务器列表
upstream
; - 加入代理转发配置
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博客