Nginx服务部署
Nginx简介
Nginx (engine x) 是一个轻量级的、高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。是在一个BSD-like 协议下发行。
其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
官网和资料
官网:http://nginx.org/
中文文档:http://www.nginx.cn/doc/
nginx源码包下载:wget http://nginx.org/download/nginx-1.13.4.tar.gz
nginx官网rpm包下载:http://nginx.org/packages/centos/
Centos6的EPEL源:https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/
Centos7的EPEL源:http://mirrors.sohu.com/fedora-epel/7Server/x86_64/
nginx结构与扩展功能
工作结构:一个主进程(master)和多个工作进程(woker)。工作进程是单线程的,且不需要特殊授权即可运行。
扩展功能
kqueue (FreeBSD 4.1+),epoll (Linux 2.6+),rt signals (Linux 2.2.19+),/dev/poll(Solaris 7 11/99+),select,以及 poll 支持;
kqueue支持的不同功能包括 EV_CLEAR,EV_DISABLE (临时禁止事件), NOTE_LOWAT,EV_EOF,有效数据的数目,错误代码;
sendfile (FreeBSD 3.1+),sendfile (Linux 2.2+),sendfile64 (Linux 2.4.21+),和 sendfilev (Solaris 8 7/01+) 支持;
输入过滤 (FreeBSD4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M内存。
最小化的数据拷贝操作;
其他HTTP功能;
基于IP、端口和名称的虚拟主机服务;
Memcached 的 GET 接口;
支持 keep-alive和管道连接;
灵活简单的配置;
重新配置和在线升级而无须中断客户的工作进程;
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
4xx-5xx错误代码重定向;
基于 PCRE 的 rewrite 重写模块;
基于客户端IP 地址和 HTTP 基本认证的访问控制;
PUT,DELETE,和 MKCOL 方法;
支持 FLV (Flash 视频);
带宽限制。
Nginx架构原理
大致上Nginx的架构就是这样:
1.Nginx启动后,会产生一个主进程,主进程执行一系列的工作后会产生一个或者多个工作进程;
2.在客户端请求动态站点的过程中,Nginx服务器还涉及和后端服务器的通信。Nginx将接收到的Web请求通过代理转发到后端服务器,由后端服务器进行数据处理和组织;
3.Nginx为了提高对请求的响应效率,降低网络压力,采用了缓存机制,将历史应答数据缓存到本地。保障对缓存文件的快速访问;
工作进程的主要工作有以下几项:
接收客户端请求;
将请求一次送入各个功能模块进行过滤处理;
IO调用,获取响应数据;
与后端服务器通信,接收后端服务器处理结果;
数据缓存
响应客户端请求;
Nginx服务器在使用Master-Worker模型时,会涉及到主进程和工作进程的交互和工作进程之间的交互。这两类交互都依赖于管道机制。
1.Master-Worker交互
这条管道与普通的管道不同,它是由主进程指向工作进程的单向管道,包含主进程向工作进程发出的指令,工作进程ID等;同时主进程与外界通过信号通信;
2.worker-worker交互
这种交互是和Master-Worker交互是基本一致的。但是会通过主进程。工作进程之间是相互隔离的,所以当工作进程W1需要向工作进程W2发指令时,首先找到W2的进程ID,然后将正确的指令写入指向W2的通道。W2收到信号采取相应的措施。
Nginx服务器的事件驱动模型
从上面我们可以知道,Nginx服务器的工作进程调用IO后,就取进行其他工作了;当IO调用返回后,会通知工作进程。但IO调用时如何把自己的状态通知给工作进程的呢??
一般解决这个问题有两种方法:
(1)让工作进程在进行其他工作的过程中间隔一段时间就去检查一下IO的状态,如果完成就响应客户端,如果未完成,继续工作。
(2)IO调用在完成后能主动通知工作进程。
当然最好的就是用第二种方法了;像select/poll/epoll等这样的系统调用就是用来支持第二种解决方案的。这些系统调用也常被称为事件驱动模型。他们提供了一种机制就只让进程同时处理多个并发请求,不用关心IO调用的具体状态。IO调用完全由事件驱动模型来管理。
Nginx中的事件驱动模型
就是用事件驱动处理库(多路IO复用),最常用的就是select模型,poll模型,epoll模型。
关于这三个模型的详解在这里可以看到:https://segmentfault.com/a/1190000003063859
附:阿里云代金券1000元免费领取地址:https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=2a7uv47d
新老阿里云账户均可领取!可用于购买阿里云服务器ECS、云数据库RDS、虚拟主机、安骑士、DDoS高防IP等100多云计算产品。
代金券自领取之日起,有效期是30天,请及时使用,过30天后还可以重新领取。
nginx安装和配置
安装方法:1、用yum和rpm方式安装 2、编译安装
方法一:用yum安装nginx
实施思路:
1、 下载nginx-*.rpm软件包或配置网络yum源。
2、 用yum或rpm -ivh安装nginx软件。
3、 修改nginx.conf配置文件。
4、 启动nginx服务。本地访问测试。
具体实施:
1、 下载nginx-*.rpm软件包或配置网络yum源。
第1步,配置sohu网络yum源:
vim /etc/yum.repos.d/6sohu.repo
注:此处是sohu网的Centos6的yum源。
[6sohuyum]
name=6sohu_yum
baseurl=http://mirrors.sohu.com/fedora-epel/7Server/x86_64/
enabled=1
gpgcheck=0
vim /etc/yum.repos.d/6epel.repo
注:此处是Centos6的epel的yum源。
[6epel]
name=6epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/
enabled=1
gpgcheck=0
vim /etc/yum.repos.d/7sohu.repo
注:此处是sohu网Centos7的yum源。
[7sohuyum]
name=7sohu_yum
baseurl=http://mirrors.sohu.com/fedora-epel/7Server/x86_64/
enabled=1
gpgcheck=0
vim /etc/yum.repos.d/7epel.repo
注:此处是Centos7的epel的yum源。
[7epel]
name=7epel
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
enabled=1
gpgcheck=0
第2步,测试yum源是否可用。
yum clean all
yum makecache fast
yum repolist
yum list nginx
2、 用yum或rpm -ivh安装nginx软件。
yum install -y pcre-devel openssl-devel zlib-devel curl elinks lynx
yum install -y nginx
rpm -ql nginx
rpm -qc nginx
技巧:下载网络yum源中的nginx和依赖包到本地主机上。方法如下:
方法一:downloadonly插件(首选)
1.安装插件
yum -y install yum-download
2.下载nginx软件包到当前文件夹的nginx目录中。
yum -y install nginx -downloadonly -downloaddir= ./nginx/
方法二:yum-utils中的yumdownloader
1.安装yum-utils
yum -y install yum-utils
2.使用yumdownloader下载软件包nginx
yumdownloader nginx
方法三:利用yum的缓存功能
默认情况下,yum在安装软件包后会自动清理软件包,修改配置,使yum不再清理软件包
vim /etc/yum.conf中修改keepcache = 0改为keepcache = 1
/etc/init.d/yum-updatesd restart
yum -y install httpd
这时软件包已经安装下载,目录为/var/cache/yum
每一次启程都是从搬砖开始……
3、 修改nginx.conf配置文件。
rpm -qc nginx 查看配置文件
/etc/logrotate.d/nginx 日志轮滚策略
/etc/nginx/conf.d/default.conf 自动载的默认配置文件
/etc/nginx/conf.d/ssl.conf ssl配置文件
/etc/nginx/conf.d/virtual.conf 虚拟主机配置文件
/etc/nginx/fastcgi.conf fastcgi配置文件(与php交互)
/etc/nginx/fastcgi.conf.default fastcgi配置文件的备份
/etc/nginx/fastcgi_params fastcgi参数配置文件
/etc/nginx/fastcgi_params.default fastcgi参数配置文件的备份
/etc/nginx/mime.types 文件类型mime配置文件
/etc/nginx/nginx.conf nginx的主配置文件
/etc/nginx/nginx.conf.default nginx的主配置文件的备份
/etc/nginx/scgi_params scgi参数文件
/etc/nginx/uwsgi_params uwcgi参数文件
/etc/sysconfig/nginx nginx系统配置文件
4、 启动nginx服务。本地访问测试。
nginx -t 检测nginx.conf语法
service nginx restart 重启服务
chkconfig nginx on 设为开机启动
curl 127.0.0.1 本地访问测试
elinks 127.0.0.1 本地访问测试
service nginx status 查服务状态
service nginx stop 停止服务
查服务的进程:
ps aux|grep nginx
ps ef|nginx
查服务端口:
lsof -i:80
ss -atunlp|grep :80
netstat -atunlp|grep :80
方法二:用nginx-*tar.gz源码安装(见最后的附录)。
nginx 1.13.4简单编译安装
软件下载、安装:
yum install -y gcc gcc-c++ pcre-devel openssl-devel zlib
id nginx ||useradd -r nginx
cd ~
wget http://nginx.org/download/nginx-1.13.4.tar.gz
ls
tar xf nginx-1.13.4.tar.gz
cd nginx-1.13.4
./configure –prefix=/usr/local/nginx \
–conf-path=/etc/nginx/nginx.conf \
–user=nginx \
–group=nginx \
–with-http_ssl_module
make && make install
echo “PATH=$PATH:/usr/local/nginx/sbin/” > /etc/profile.d/nginx.sh
source /etc/profile.d/nginx.sh
export /etc/profile.d/nginx.sh
手动启动nginx:
nginx -t 检测配置文件语法
nginx 启动nginx软件
nginx -h 查看帮助
nginx -v 显示编译安装的参数信息
服务管理:
nginx -s stop/quit 停止
nginx -s reload 重载新配置文件
curl 127.0.0.1 或 firefox 127.0.0.1 &
lsof -i:80 或ss -atunlp|grep :80 或netstat -atunlp|grep :80
说明:nginx官方没有提供服务启动脚本,需要自己写服务启动脚本。
nginx完整安装参考
软件下载
yum install -y gcc gcc-c++ pcre-devel openssl-devel
cd ~
wget http://nginx.org/download/nginx-1.13.4.tar.gz
ls
tar xf nginx-1.13.4.tar.gz
编译安装方法:
准备工作:安装编译器和依赖的软件
yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel
Nginx模块必须在编译的时候指定,完整的编译选项,可用的模块可以参考安装指导
下面是一个例子:
id nginx || useradd -r nginx
cd ~/nginx-1.13.4
./configure \
–prefix=/usr/local/nginx \
–sbin-path=/usr/sbin/nginx \
–conf-path=/etc/nginx/nginx.conf \
–error-log-path=/var/log/nginx/error.log \
–pid-path=/var/run/nginx/nginx.pid \
–lock-path=/var/lock/nginx.lock \
–user=nginx \
–group=nginx \
–with-http_ssl_module \
–with-http_flv_module \
–with-http_gzip_static_module \
–http-log-path=/var/log/nginx/access.log \
–http-client-body-temp-path=/var/tmp/nginx/client/ \
–http-proxy-temp-path=/var/tmp/nginx/proxy/ \
–http-fastcgi-temp-path=/var/tmp/nginx/fcgi/
编译和安装:make && make install && echo ok
更多编译参数与可用的模块信息请运行./configure –help
启动关闭nginx
或 pkill nginx
测试访问:curl 127.0.0.1 或 firefox 127.0.0.1 &
默认主页index.html的目录:ls /usr/local/nginx/html/
nginx简易的服务脚本:
vi /etc/init.d/nginx
nginx=’/usr/local/nginx/sbin/nginx’
case $1 in
start)
$nginx -t && $nginx && echo start ok
;;
stop)
$nginx -s stop && echo stop ok
;;
reload)
$nginx -t && $nginx -s reload || $nginx -s stop
;;
restart)
$nginx -s stop && echo stop ok
$nginx -t && $nginx && echo start ok
;;
*)
echo "Usage nginx {start|stop|reload|restart}"
;;
esac
添加x权限并测试:
chmod +x /etc/init.d/nginx
service nginx restart
nginx专业级服务脚本:
vi /etc/init.d/nginx 内容如下
. /etc/init.d/functions
NGINX_SBIN=”/usr/local/nginx/sbin/nginx”
NGINX_CONF=”/etc/nginx/nginx.conf”
NGINX_PID=”/usr/local/nginx/logs/nginx.pid”
RETVAL=0
prog=”Nginx”
start() {
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
case $1 in
start)
start
[ $? -eq 0 ] && echo "nginx ok" || echo "nginx error"
;;
stop)
stop
[ $? -eq 0 ] && echo "nginx ok" || echo "nginx error"
;;
restart)
stop && start
[ $? -eq 0 ] && echo "nginx ok" || echo "nginx error"
;;
*|"")
echo $"Usage:nginx {start|stop|restart|status}."
;;
esac
nginx.conf主配置文件
nginx配置文件结构(rpm方式)
cat -n /etc/nginx/nginx.conf
user nginx; 进程用户
worker_processes 1; 进程数(双核CPU可设置为2)
error_log /var/log/nginx/error.log; 错误日志
pid /var/run/nginx.pid; 进程的pid文件
events { 事件设置
worker_connections 1024; 单个进程最在连接数
}
http { 配置http服务参数
include /etc/nginx/mime.types; 包含mime支持类型的配置文件
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 /var/log/nginx/access.log main; 访问日志
sendfile on; 开启sendfile功能
#tcp_nopush on; 不启用tcp_nopush功能
#keepalive_timeout 0;
keepalive_timeout 65; 指定保持连接的超时时间
#gzip on; 是否启用gzip功能
# Load config files from the /etc/nginx/conf.d directory
# The default server is in conf.d/default.conf
include /etc/nginx/conf.d/*.conf; 包含分支配置文件(启动服务时加载这些配置文件)
} 结束http参数配置
default.conf默认网站配置文件
cat /etc/nginx/conf.d/default.conf
server { 虚拟主机配置
listen 80 default_server; 监听80端口,并设置为默认服务器
server_name _; 服务器域名
#charset koi8-r; 网站字符编码设置
#access_log logs/host.access.log main; 访问日志类型为main类型
location / { 位置匹配设置
root /usr/share/nginx/html; 网站根目录
index index.html index.htm; 默认主页文件名列表
} 位置设置结束
error_page 404 /404.html; 404错误代码及页面
location = /404.html { 位置匹配设置
root /usr/share/nginx/html; 位置的根目录
} 位置设置结束
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html; 500~504错误代码及页面
location = /50x.html { 位置匹配设置
root /usr/share/nginx/html; 位置根目录
} 匹配位置结束
# proxy the PHP scripts to Apache listening on 127.0.0.1:80 代理PHP由后端的apache处理
#location ~ \.php$ { 匹配以.php为后缀的设置
# proxy_pass http://127.0.0.1; 后端web服务器IP地址及协议
#} 匹配设置结束
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#将PHP脚本发给端口为9000的FastCGI服务器处理,
#location ~ \.php$ { 匹配以.php为后缀的设置
# root html; 网站根目录
# fastcgi_pass 127.0.0.1:9000; 指定fastcgi服务器的IP和端口号
# fastcgi_index index.php; 指定主页文件
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 脚本文件名
# include fastcgi_params; 包含fastcgi_params参数配置文件
# include fastcgi.conf; 包含fastcgi.conf配置文件
#} 匹配设置结束
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht { 匹配.ht的文件
# deny all; 设置权限为拒绝访问
#} 匹配设置结束
} 虚拟主机配置结束(与开头的server{的大括号配对)
nginx虚拟主机配置
cat /etc/nginx/conf.d/virtual.conf
虚拟主机配置文件模板
虚拟主机:在一台nginx服务器上发布多个不同的网站。
实现nginx虚拟主机的方法(三种方案可以综合应用):
1、 基于端口:将不同的网站绑定在不同的端口。
2、 基于IP:将不同的网站绑定在不同的IP地址。
3、 基于域名:将不同的网站绑定在不同的域名。需要在hosts文件或DNS服务器上登记域名和IP地址的对应解析关系。
练习:在nginx服务器上创建一个网站根目录/web/8080,并创建index.html主页,用nginx虚拟主机基于端口的方式发布这个网站,用独立的配置文件8080.conf,重启nginx服务后,并在本地做访问测试。
第1步,创建网站根目录和主页。
mkdir -pv /web/8080
echo www.8080.com > /web/8080/index.html
第2步,创建8080.conf配置文件,将网站绑定在8081端口进行发布。
cd /etc/nginx/conf.d
cp -v virtual.conf 8080.conf
vi 8080.conf 修改后的内容如下
server {
listen 8080;
#listen somename:8080;
server_name www.8080.com 8080 8080.com;
access_log /web/8080/access.log main;
error_log /web/8080/error.log;
location / {
root /web/8080;
index index.html index.htm;
}
}
第3步,检测配置文件语法,重启服务,本地访问测试。
nginx -t
service nginx restart
curl 127.0.0.1:8080 ; elinks 127.0.0.1:8081 本地访问测试
任务:参考/web/8080目录的网站发布的方法,将/web/8081目录的网站绑定在8081端口进行发布,并做访问测试。
Nginx文件共享:
文件共享设置
方法一:(首选)用nginx自带的index文件列表索引功能实现,只需要添加全局设置参数即可。也可以将autoindex功能代码添加到location代码段中
location / {
root /var; #根目录路径
autoindex on; # 显示目录
autoindex_exact_size on; # 显示文件大小
autoindex_localtime on; # 显示文件时间
limit_rate_after 5m; #5m之后下载速度为10k
limit_rate 10k; #限速10k
#alias /usr/local; #别名
}
方法二:(备用)在location匹配代码段中用if对请求的文件类型判断,指定访问某些格式的文件时才会提示下载。
location / {
#root html;
#index index.html index.htm;
if ($request_filename ~* ^.*?\.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$){
add_header Content-Disposition: 'attachment;';
}
}
实例:用nginx基于端口的方式发布/var目录,绑定在8001端口,实现文件共享功能。
第1步,修改配置文件。vim /etc/nginx/conf.d/8001.conf
server {
listen 8001;
#listen somename:8001;
server_name www.8001.com 8001 8001.com;
access_log /var/8001_access.log main;
error_log /var/8001_error.log;
location / {
root /var;
index index.html index.htm;
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}
}
第2步,重启nginx服务,本地访问测试。(elinks是用q键退出)
nginx -t && nginx -s reload
elinks 127.0.0.1:8001 (elinks是用q键退出)
nginx访问控制表
访问控制表相关指令:allow、deny(ngx_http_access_module)
单看nginx模块名ngx_http_access_module,很多人一定很陌生,但是deny和allow相比没一个人不知道的,实际上deny和allow指令属于ngx_http_access_module.我们想控制某个uri或者一个路径不让人访问,在nginx就得靠它了。
nginx的访问控制模块语法很简单,至少比apache好理解,apache的allow和deny的顺序让很多初学者抓头.好了具体看下这个插件的使用方法吧。
1、安装模块
这个模块内置在了nginx中,除非你安装中使用了–without-http_access_module。如果你还没安装过nginx,那么请参考下ttlsa之前写的nginx安装.
2、指令
allow
语法: allow
location /NginxStatus {
# Turn on nginx stats
stub_statuson;
# I do not need logs for stats
access_log off;
# Security: Only allow access from 192.168.1.100 IP #
#allow 192.168.1.100;
# Send rest of the world to /dev/null #
#deny all;
}
负载均衡时session处理
#推送tcp.pcap包文件到物理:scp tcp.pcap [email protected]:/root/
Hypertext Transfer Protocol
GET / HTTP/1.0\r\n
X-Real-IP: 192.168.10.1\r\n
Host: 192.168.20.8\r\n
X-Forwarded-For: 192.168.10.1\r\n
Connection: close\r\n
Accept: text/html, application/xhtml+xml, image/jxr,*/*\r\n
Accept-Language: zh-CN\r\n
Accept-Encoding: gzip, deflate\r\n
DNT: 1\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64;Trident/7.0; rv:11.0) like Gecko LBBROWSER\r\n
If-Modified-Since: Sat, 22 Oct 2016 02:31:03GMT\r\n
If-None-Match: "580acf67-264"\r\n
\r\n
[Full request URI: http://192.168.10.1/]
[HTTP request 1/1]
[Response in frame: 58]