什么是Nginx
Nginx (engine x)
是一个高性能的HTTP
和反向代理web服务器,同时也提供了IMAP/POP3/SMTP
服务。Nginx
是由伊戈尔•赛索耶夫为俄罗斯访问量第二的Rambler.ru
站点(俄文:Рамблер
)开发的,第一个公开版本0.1.0
发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4
发布。Nginx
是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)
代理服务器,在BSD-like
协议下发行。其特点是占有内存少,并发能力强,事实上nginx
的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx
网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
nginx的特征特色及优点
1、模块化设计,较好的扩展性。旧版本的nginx
仅支持在安装nginx
时指定安装某个模块,不需要该模块了也不能卸载,除非卸载nginx
重装,但现在nginx
可以支持需要哪个模块就动态安装,不需要就卸载,这提高了nginx
的可扩展性;
2、高可靠。
3、支持热部署。主要体现在:nginx
支持不停机更新配置文件;不停机更换日志文件、不停机升级版本(当升级nginx
版本时,已连接的用户仍使用旧版本nginx
,用户下次连接就直接连接到新版本nginx
,新建立的用户链接到新版本的nginx
,实现了平滑升级)。
4、低内存消耗。10000个keep-alive
连接模式下的非活动连接,仅需2.5M
内存。
5、event-driven,aio,mmap,sendfile
。
nginx的基本功能
1、静态资源的web
服务器;
2、http
协议反向代理服务器;
3、pop3/imap4
协议反向代理服务器;
4、FastCGI(LNMP),uWSGI(python)
等协议;
5、模块化(非DSO),如zip,SSL
模块。
nginx的程序架构
nginx
的程序架构:Master/Worker
结构(只有进程,没有线程)
1个master进程:负责加载和分析配置文件、管理worker进程、平滑升级;
1个worker或多个worker进程:负责处理并响应客户的请求;
缓存相关的进程:cache loader
负责载入缓存对象,cache manager
负责管理缓存对象。
2种Nginx安装方式介绍
首先第一步先安装好Nginx
所需的依赖包:yum -y install gcc gcc-c++ make pcre pcre-devel zlib-devel zlib openssl-devel openssl
,nginx
需要用到pcre
库,pcre
库全称是Perl compatible regular expressions
,翻译为Perl
兼容正则表达式,是为了支持Nginx
具备URL
重写rewrite
模块,若不安装pcre库,则Nginx无法使用rewrite模块。
1、使用tar包源码编译安装
进入 http://nginx.org/en/download.html
网站下载最新的稳定版nginx
源码包nginx-1.18.0.tar
,把该源码包放到CentOS
上解压即可使用 ./configure&&make&&make install
安装即可。
2、使用yum方式安装
首先yum info nginx
查看光盘可获得的nginx镜像,如果没有,需要到官网下载一个镜像仓库,如下图
根据自己的Linux
版本,建立yum
镜像仓库
最后 yum info nginx
即可看到已经找到最新稳定的nginx
包了,这时就可以使用 yum install nginx
安装nginx即可。
注意:yum
方式安装的nginx
,其默认安装路径可能与源码包方式安装的路径不一样,安装完后使用find / -name nginx
查看nginx
的安装路径即可,同时yum 方式安装的nginx
默认会自动生成一个nginx
的用户,源码包方式安装需要自己创建一个nginx
用户,该nginx
用户就是运行worker
进程的用户,建议创建该用户为/bin/nologin
,默认情况下worker
进程使用nobody
用户运行的。
源码包安装Nginx
先建立一个nginx用户及安装依赖:
useradd -s /sbin/nologin -M nginx
yum -y install make zlib* pcre* gcc gcc-c++ openssl*
或yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel zlib openssl-devel openssl
下面使用tar包源码编译安装nginx
,下载好nginx-1.18.0.tar
并上传到Linux上,tar -xf nginx-1.18.0.tar
,然后就会解压出一个nginx-1.18.0
目录,cd nginx-1.18.0/
下
执行 ./configure --help
查看安装帮助:
可以看到执行./configure
时可以带多个参数来指定安装路径以及要安装的模块,当然也可以不指定参数直接./configure
,这样就会默认安装路径在/usr/local/nginx
下,这里我就指定:
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module #(--with-http_stub_status_module是一个状态统计的模块)
预编译完没有报错,echo $?
输出0表示上一条命令执行没有问题,继续开始编译:
make -j 8
echo $?
输出0表示上一条命令执行没有问题,开始正式安装了:
make install
echo $?
输出0表示上一条命令执行没有问题,那么Nginx
就安装完成了,如果安装过程中报错了,那就根据报错信息一步步解决,如果是依赖包没有安装那就安装依赖包吧。
安装成功输出页面信息:看,Nginx
的安装目录默认在/usr/local/nginx
下,这里建议建立一个指向/usr/local/nginx
的软链接,如 ln -s /usr/local/nginx /usr/nginx
然后就将/usr/nginx
作为开发人员使用,为什么要这样建立一份软链接呢,因为为了方便将来升级软件时,直接删除旧的软链接,再建立一个新的同名的指向新版本的软链接即可,这样作为开发人员使用的仍然是/usr/nginx
,而实际已经升级版本了。
添加全局变量:
echo 'export PATH=/usr/local/nginx/sbin/:$PATH' >> /etc/profile
source /etc/profile
修改目录权限:
chown -R nginx.nginx /usr/local/nginx
find / -name nginx #查找Nginx的安装路径
查看nginx
命令帮助文档:nginx -h
nginx的命令
nginx -h 或 nginx -? #打开nginx的帮助信息文档,查看帮助
启动nginx直接输入:nginx #启动Nginx 查看nginx命令 which nginx 输出/usr/local/nginx/sbin/nginx
nginx -v #显示nginx的版本信息并退出
nginx -V #显示nginx版本以及查看安装了哪些配置模块信息等,然后退出
nginx -t #检测nginx配置文件是否存在语法等错误,然后退出
nginx -T #检测nginx配置文件是否存在语法等错误,转储配置文件然后退出
nginx -s signal #向 master 进程发送信号,可发送reopen 、reload、quit、stop等信号
nginx -s reopen #重新打开日志文件
nginx -s reload #重新加载配置文件,使用新配置文件启动新的工作进程,优雅地关闭旧的工作进程
nginx -s quit #优雅的停止Nginx服务,即等待所有的请求都处理完成后才停止nginx服务
nginx -s stop #立即的、强行的停止nginx服务
nginx -q #在配置测试期间期间不显示、屏蔽非错误信息
nginx -p prefix #设置前缀路径(默认是:/usr/share/nginx/)
nginx -c filename #启动nginx时指定配置文件,不指定就使用默认配置文件(默认:/usr/local/nginx/conf/nginx.conf)
nginx -g directives #这是设置配置文件外的全局指令
这里讲一下reopen
(重新打开日志文件)这个参数,在做访问日志切割时,Linux
下我们知道,可以简单的把日志文件mv
走,但是你会发现mv走后新的日志文件没有重新生成,一般linux下用的文件句柄,文件被打开情况下你mv走文件,但是原来操作这个文件的进程还是有这个文件的inode等信息,原进程还是读写原来的文件,因此简单的mv走日志文件无法令nginx重新生成新的日志文件,所以需要使用./nginx -s reopen
来让nginx重新打开日志文件,nginx发现日志文件不见了,所以nginx才会重新生成新的日志文件,这样就做了到日志的切割。
查看nginx服务是否真正运行
ps -ef |grep nginx
netstat -tunlp|grep :80
lsof -i:80
nginx是一个web服务器,nginx默认的端口是:80端口
查看指定端口正在被哪个程序占用:netstat -tunlp|grep 80
lsof -i:端口号,用于查看某一端口的占用情况,比如查看80号端口使用情况,lsof -i:80
nginx的配置文件结构
nginx的配置文件可分为4大部分:
1、main block # 主配置段,即全局配置段,对所有http、mail都有效
event{
......... # 事件驱动相关的配置
}
2、http{
........ # http/https协议的相关配置段
}
3、mail{
........ # mail协议的相关配置段
}
4、stream{
........ # stream协议的相关配置段
}
这里我们讲一下http协议的相关配置段:
http{
.....
...... #各server的公共配置
server{
listen 80;
server_name 虚拟主机名;
location / {
root html; #网站根目录
index index.html index.htm;
}
}
server{
listen 8080;
server_name 虚拟主机名;
location / {
root html;
index index.html index.htm;
}
}
}
一个server就是一个虚拟机主机,也就是一个网站,可以有多个server,一个server里面可以有个多个location,也就是说一个nginx服务器可以搭建多个http网站。
nginx配置文件详解
从http://nginx.org/en/docs/
中可以得到nginx的配置文档说明书,非常有用,哪个命令不知道什么意思,就可以查一下。
打开nginx的配置文件:vim /usr/local/nginx/conf/nginx.conf
先看全局配置段:
user nobody; #表示运行worker进程的用户是谁,默认是nobody用户,建议创建一个nginx用户来运行worker进程
worker_processes 1; #表示worker进程数,应设为CPU的核心数(查看核心数:cat /proc/cpuinfo中cpu codes 值)
如图所示,只有1个worker进程:
将worker_processes改为2,如图所示,有2个worker_processes了:
#error_log logs/error.log;
#error_log logs/error.log notice; #这些是指定nginx的错误日志信息文件位置;
#error_log logs/error.log info; #error_log级别分为debug,info,notice,warn,error, crit 默认为crit,该级别在日志名后定义
#pid logs/nginx.pid; #Nginx的pid文件,即存放master进程的PID号,nginx启动时就创建该nginx.pid文件,停止时就删除
events { #events段
worker_connetions 1024; #每个worker的最大并发连接数,则nginx总的并发连接数就是:worker_processes*worker_connetions
}
daemon on|off #是否使用守护进程,默认on就是守护进程后台执行,开发时为了方便可以设置为off前台进程实时显示
现在看http配置段
http {
include mime.types; #使用include包含mime.types,这是一个文件,里面定义了很多解析类型
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #定义日志的格式,名叫main
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main; #访问日志路径并指定访问日志的记录格式是上面我们定义main格式
sendfile on; #是否启用sendfile,高效文件传输模式
#tcp_nopush on;
#keepalive_timeout 0; #配置长连接超时时间,0秒表示永不超时
keepalive_timeout 65; #配置长连接超时时间,默认单位秒,超过65秒内无动作则断开连接
gzip on; #是否开启压缩功能,建议开启,能实现压缩传输增加传输效率
server { #定义一个虚拟主机
listen 80; #监听端口,默认80
server_name localhost; #虚拟主机名称,网站一般定义为域名,如www.fujiseiko.com,server_name也可以设为IP地址
#charset koi8-r;
server_tokens off; #是否在响应报文的Server首部隐藏版本信息,off表示隐藏 curl -I www.fujiseiko.com
access_log logs/host.access.log main; #访问日志的路径及内容记录的格式为main格式
location / { #location后面紧跟的是对于URL的匹配规则,大括号里面的则是这个location的配置
root html; #定义这个location的查找资源的根目录,这个目录可以是相对路径,也可以是绝对路径
index index.html index.htm; #index:定义访问的默认首页
}
#error_page 404 /404.html; #定义404展示的错误页,某些大型网站会把404错误页设计的很人性化,其实就是在这里设定的
# 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;
# }
#}
优化并拆分nginx主配置文件
我们知道,在生产环境下虚拟主机不能是1个两个,频繁的修改nginx.config配置文件可能会造成系统异常宕机,为了减少错误率,我们可以将单个虚拟主机配置语句拎出来写成一个配置文件,如下:
假设有2个虚拟主机,www.fujiseiko.com、www.sn.com
创建目录专门存放这些配置文件,mkdir -p /usr/local/nginx/vhost
vim /usr/local/nginx/vhost/fujiseiko.conf 添加fujiseiko虚拟主机配置文本:
server {
listen 80; #使用80端口
server_name fujiseiko; #建立fujiseiko虚拟主机
server_tokens off;
location / {
root html;
index index.html index.htm;
}
同理
vim /usr/local/nginx/vhostsn.conf 添加sn虚拟主机配置文本:
server {
listen 8080; #使用8080端口
server_name sn; #建立sn虚拟主机
server_tokens off;
location / {
root html;
index index.html index.htm;
}
两个虚拟主机的配置文件都建立完了,使用include语句把他们加入到nginx的主配置文件当中去;
vim /usr/local/nginx/nginx.conf
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include /usr/local/nginx/vhost/*.conf; #使用include语句把他们加入nginx的主配置文件中。完美。
}
总结
1、 useradd -s /sbin/nologin -M nginx #创建nginx用户
2、 yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel #yum安装依赖
3、./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module #预编译
4、make #编译
5、make install #安装
6、echo 'export PATH=/usr/local/nginx/sbin/:$PATH' >> /etc/profile #添加环境变量,也可以在/usr/bin中创建一个链接到nginx的软链接
7、source /etc/profile #使配置生效
8、chown -R nginx.nginx /usr/local/nginx #修改目录权限