入职半年来,一直在Nginx的基础上做模块开发,学到了很多东西,也碰到了很多坑。在业务开发的同时,由于对Nginx本身也是一知半解,造成了很多不必要的Bug。痛定思痛,很早以前就想系统的学习一下Nginx,迟迟没有抽出时间下定决心,我知道和以前浅析Redis一样,那是一个一旦开始了就停不下来的旅程。好勒,别立flag了,一篇一篇写下去吧。
Nginx(“engine X”)是一个高性能、轻量级的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Nginx具有处理响应请求快、支持高并发、内存消耗低,高可靠、高扩展性和支持热部署等特点。
Nginx能运行在Linux、各类BSD系统、Mac osX等各种类unix系统下,Nginx有自由的BSD协议,能够自由的在其基础上开发模块,以作商用。
Nginx可以用作静态HTTP服务器,代理服务器,负载均衡,虚拟主机,FastCGI等。
更多的用法和介绍可以移步Nginx官网查看。
Nginx的安装一般采取源码的方式,可以从Download Nginx下载源码包,安装方式如下:
// 下载源码
wget http://nginx.org/download/nginx-1.12.2.tar.gz
// 解压缩包
tar zxvf nginx-1.12.2.tar.gz
// 进入源码文件夹
cd nginx-1.12.2
// 运行configure,此处简化了后面的参数
./configure
// 编译
make
// 安装
make install
安装好之后,我们可以通过命令查看Nginx安装成功没,如下
/usr/local/bin/nginx -t
// 输出以下代表安装成功
nginx version: nginx/1.12.2
built by clang 9.0.0 (clang-900.0.39.2)
configure arguments:
接下来,我们可以启动Nginx,下面列出Nginx的基本启动、关闭等命令
// 启动
/usr/local/bin/nginx
// 自定义配置文件启动
/usr/local/bin/nginx -c /tmp/nginx.conf
// 停止
/usr/local/bin/nginx -s stop
// 重启
/usr/local/bin/nginx -s reload
启动Nginx之后,打开网站http://localhost:80,可以看到如下界面
当Nginx主进程意外挂掉后,可以采取暴力措施,杀死Nginx进程,sudo pkill nginx,不过要慎用。
开启Nginx后,通过ps命令查看nginx进程,可以看到:
nobody 31546 0.0 0.0 4296816 1492 ?? S 8:50PM 0:00.00 nginx: worker process
nobody 31545 0.0 0.0 4296816 1492 ?? S 8:50PM 0:00.00 nginx: worker process
root 31544 0.0 0.0 4287116 528 ?? Ss 8:50PM 0:00.00 nginx: master process /usr/local/nginx/sbin/nginx
Nginx的进程是有一个主进程,多个工作进程组成,他们的关系如下:
主进程用于管理工作进程,包括创建和销毁进程等;工作进程用于处理用户请求。这样可以大大提高Nginx处理请求的效率。
接下来,我们来看看Nginx的配置文件nginx.conf,它是Nginx的核心之一。首先我们来看一个示例。
Nginx采取块配置,块与块之间可以嵌套。大体上可以分为四种块,全局,HTTP/EXENT/MAIL块,erver块,Location块。具体含义我们继续往下看。
user nobody; // 用户名
worker_processes 1; // 工作进程数
master_process off; // 关闭主进程,即主进程和工作进程合为一个
daemon off; // 不以daemon模式运行
events {
worker_connections 768; // 设置最大事件连接数
}
error_log /var/log/nginx/notice.log notice; // 错误日志位置
http {
sendfile on; // 开启sendfile
keepalive_timeout 65; // 连接超时时间
server {
listen 80; // 监听80端口
server_name localhost; // 虚拟机名称
location / { // 具体处理的链接
// 处理http://localhost:80/
}
}
}
前面我们提到,Nginx可以做静态文本服务器。此时只需要在Nginx.conf文件中添加如下:
location / {
root html;
index index.html index.htm;
}
然后,重启服务器
/usr/local/bin/nginx -s reload
最后再Nginx工作目录中新建html文件夹,文件夹下新建index.html即可(其实这些都是Nginx自带的),那么在访问http://localhost:80/时,我们就能看到index.html中的内容了。
这里可以举例说明,当客户端访问服务器的时候,服务器自动获取我博客的内容,然后转发给客户端,在这个过程中,Nginx服务器扮演着传递的功能。要想实现这个简单的反向代理只需要增加一行配置文件。
location / {
proxy_pass https://zcheng.ren
}
更新:坑爹的是访问https需要ssl,这里大家还是改成http://www.baidu.com勉强感受一下吧。
再次重启服务器,输入http://localhost:80/,页面自动跳转到我的个人博客主页。
Ngin另一个比较大的用途是负载均衡,在Nginx中提供了负载均衡模块,可以很方便进行配置,完成这一需求。
例如:
upstream http_server {
server 127.0.0.1:8080;
server 127.0.0.2:8080;
server 127.0.0.3:8080;
}
http {
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_server;
}
}
}
如上配置,代表着在进行请求的时候,会按照轮询的方式访问后端服务器,做到负载均衡的效果,另外Nginx支持多种负载均衡模式,如
指定权重 根据权重随机来选择访问哪台服务器
upstream http_server {
server 127.0.0.1:8080 weight = 10;
server 127.0.0.2:8080 weight = 1;
server 127.0.0.3:8080 weight = 1;
}
ip_hash 根据客户端ip的hash值来选择访问哪台服务器
upstream http_server {
ip_hash;
server 127.0.0.1:8080;
server 127.0.0.2:8080;
server 127.0.0.3:8080;
}
fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配
upstream http_server {
server 127.0.0.1:8080;
server 127.0.0.2:8080;
server 127.0.0.3:8080;
fair;
}
到这里,你就能简单用Nginx来做点事了,要想更进一步的了解Nginx,敬请期待下一篇。