Nginx
介绍
中文版文档: http://tengine.taobao.org/nginx_docs/cn/docs/ tengine
nginx.org
C10K
Nginx 的历史
Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器.Nginx是由俄罗斯人 Igor Sysoev为俄罗斯访问量第二的 Rambler.ru站点开发的.Igor Sysoev在建立的项目时,使用基于BSD许可.自Nginx 发布以来,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名.在俄罗斯许多大网站都已经使用它, 且一直表现不凡.俄罗斯大约有20%左右的虚拟主机是由nignx服务或代理的.Google在线安全博客中统计Nginx服务或代理了大约所有Internet虚拟主机的4%.而Netcraft的统计显示,Nginx服务的主机在过去的一年里以四倍的速度增长并且在这几年里,它的排名还在不断上升
为什么要用Nginx
Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 .它支持内核EPoll模型,能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数.Nginx具有很高的稳定性,其它HTTP服务器当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应只能重启服务器.例如当前Apache一旦上到200个以上进程,web响应速度就明显非常缓慢了.而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低.Nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对Nginx来说基本上是毫无用处的.就稳定性而言,nginx比lighttpd更胜一筹.Nginx支持热部署,它的启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动.你还能够在不间断服务的情况下,对软件版本进行进行升级.Nginx采用master-slave模型,能够充分利用SMP的优势,且能够减少工作进程在磁盘I/O的阻塞延迟.
Nginx代码质量非常高,代码很规范,手法成熟, 模块扩展也很容易.
Nginx采用了一些os提供的最新特性如对sendfile (Linux2.2+),acceptfilter(FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持,从而大大提高了性能.当然,nginx还很年轻,多多少少存在一些问题,比如:Nginx是俄罗斯人创建,目前文档方面还不是很完善.因为文档大多是俄语,所以文档方面这也是个障碍.尽管Nignx的模块比较多,但它们还不够完善.对脚本的支持力度不够.
获取Nginx
Nginx的官方网站: http://nginx.org/en/download.html
Nginx官网提供了三个类型的版本
Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版
Stable version:最新稳定版,生产环境上建议使用的版本
Legacy versions:老版本的稳定版
安装
Nginx安装:
1. 停止原有web服务器:
2. 添加普通用户账号来运行nginx:
# useradd -M -s /sbin/nologin nginx
3. 解压并安装Nginx:
# wget https://nginx.org/download/nginx-1.22.0.tar.gz
# tar xf nginx-1.22.0.tar.gz
# cd nginx-1.22.0
# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --sbin-path=/usr/sbin/
若预编译出现报错,一般都是缺少一些软件包
yum install gcc pcre-devel openssl-devel -y
# make && make install
----------------------------------------------------------------------------------
--prefix=/usr/local/nginx #指定安装路径
--with-http_stub_status_module #启用service status页,默认不启用
--with-http_ssl_module #启用ssl模块,以支持https请求
--sbin-path=/usr/sbin/ #指定二进制命令的路径
4. 启动:
# nginx
--------------------------------------------------------
nginx命令常用选项:
-v 查看版本号
-V 查看版本号及编译选项
-s 给主进程发送信号.可接 stop | quit | reopen | reload
-t 测试配置是否正确
-c 指定配置文件,默认为 conf/nginx.conf
5. 查看启动状态:
# netstat -tanp|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 5535/nginx
6. 测试主页是否可以访问
配置文件
nginx主配置文件主要有以下几大块
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。epoll
3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。
5、location块:配置请求的路由,以及各种页面的处理情况。
[root@clone1 nginx]# vim /usr/local/nginx/conf/nginx.conf
#user nobody; #nginx用户及组,如果用户和组名一样可只写一个
worker_processes 1; #定义了nginx对外提供web服务时的worker进程数。
#最优值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘 数量及负载模式。
#不能确定的时候,将其设置为可用的CPU核心数将是一个好的开始(设置为“auto”将尝试自动检测它)
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024; #每个进程的最大连接数,根据需要调整大小
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream;
server_tokens off; #隐藏软件版本号
#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; #开启高效文件传输模式
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间
#gzip on;
server {
listen 80;
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;
# }
#}
}
自定义日志
自己定义日志:在日志部分写入
log_format cust '$remote_addr : $time_local : $http_user_agent';
access_log logs/access.log cust; #cust:自定义的日志名称
测试自定义日志: # curl 192.168.1.254
#cat access.log
访问的Ip:访问的时间:访问的客户端的类型
$remote_addr 记录客户端的ip
$remote_user 记录远程客户端的名字
$time_local 记录访问时间
$request 记录请求的URL
$status 记录请求状态
$body_bytes_sent 记录发送给客户端的文件的内容的大小
$http_referer 记录从哪个页面链接访问过来的
$http_user_agent 记录客户端浏览器的信息
$http_x_forwarded_for 记录客户端的ip
更多内嵌变量详见:
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#variables
访问控制/用户认证
访问控制:
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问.
那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那些不速之客.
我们在服务课程中学习过apache的访问控制,对于Nginx来说同样可以实现,并且整个过程和Apache 非常的相似.
用户认证:
location / {
root html;
index index.html index.htm;
auth_basic "haha"; #服务器描述信息
auth_basic_user_file /usr/local/nginx/passwd.db; #存放用户名和密码的文件
}
[root@web html]# htpasswd -c /usr/local/nginx/passwd.db user1
New password:
Re-type new password:
Adding password for user user1
访问控制: deny/allow顺序:从上到下
location / {
root html;
index index.html index.htm;
allow 192.168.10.0/24; #单独允许192.168.10网段访问
deny all;
}
apache:
order allow,deny
allow from 192.168.10.0/24
deny from all
限速:
使用limit_rate指令
Syntax: limit_rate rate;
Default: limit_rate 0;
Context: http, server, location, if in location
虚拟主机
1、配置子配置文件
# vim /usr/local/nginx/conf/nginx.conf
include /usr/local/nginx/conf.d/*.conf; //在http {} 块里面添加
# mkdir /usr/local/nginx/conf.d/
虚拟主机类型
基于端口
基于域名
基于IP
案例:
1、编写基于域名的虚拟主机
当访问 www.baidu.com -> This is Baidu
www.163.com -> This is 163
www.qf.com -> This is Qf
# vim conf.d/baidu.conf
server {
listen 80;
server_name www.baidu.com;
location / {
root html/baidu;
index index.html;
}
}
# mkdir html/baidu
# vim html/baidu/index.html //添加访问测试内容
This is Baidu
# nginx -s reload
# vim /etc/hosts //添加本地域名解析记录
10.3.148.201 www.baidu.com
2、编写基于端口的虚拟主机
当访问 10.3.148.201:81 -> This is port 81
10.3.148.201:82 -> This is port 82
# vim conf.d/81.conf
server {
listen 81;
server_name localhost;
location / {
root html/81;
index index.html;
}
}
# mkdir html/81
# vim html/81/index.html //添加访问测试内容
This is port 81
# nginx -s reload
# netstat -tnlp //查看81端口是否被监听
反向代理
nginx的反向代理与负载均衡*****
代理(Proxy)也称网络代理。它是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这
个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关、路由器等网络设备具备网络
代理功能。一般认为代理服务有利于保障网络终端的隐私或安全,防止攻击。代理通常分为正向代
理、反向代理及透明代理。
代理服务器的类型:
1、正向代理服务器(标准代理服务器)
目的:内网的服务器通过代理服务器,然后能够访问外网的服务器
原理:内网用户将请求发给代理服务器,代理服务器根据用户需求,向真正的web服务器发出请求,然后获取到网页内容之后,在本地缓存然后发给用户。
缺点:需要用户对浏览器进行设置
2、透明代理服务器
目的和原理与正向代理服务器一致,但一般布署在网关上,用户不需要再对浏览器进行设置
需要结合iptables
3、反向代理服务器(反向加速服务器)
目的:外网客户端通过代理服务器,能够访问内网服务器的资源
原理:外网客户端访问正常的域名或者IP,其实访问的是代理服务器,代理服务器帮助客户端请求页面,在代理服务器上缓存,然后再发送给客户端。
反向代理:
该功能由ngx_http_proxy_module模块提供
location / {
proxy_pass http://www.jd.com;
}
验证:在浏览器上访问Nginx的IP地址会自动跳转jd首页
负载均衡
负载均衡:
该功能由ngx_http_upstream_module+ngx_http_proxy_module模块提供
调度算法:
轮循 静态
加权轮循 静态
least_conn: 根据其权重值,将请求发送到活跃连接数最少的那台服务器, 动态
ip_hash: 把同一客户端的请求调度到同一台真实服务器上.
1. 轮循 - 后端每台服务器的权重相同
upstream webs {
server 192.168.10.12;
server 192.168.10.13;
}
server {
...
location / {
proxy_pass http://webs;
}
...
}
2.加权轮循: 在每台服务器上加入权值,权值越高的服务器分配到的请求越多
upstream webs {
server 192.168.10.12 weight=1;
server 192.168.10.13 weight=2;
}
--------------------------------------------------------------------------------------------
[root@nginx conf]# vim /usr/local/lnmp/nginx/conf/nginx.conf
upstream qfedu {
server 192.168.10.11 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.10.12 weight=2;
server 192.168.10.13 backup; #backup:备份,其他服务器全部宕机后启用
}
-------------------------------------------------------------------------------------------
3. ip_hash: 让同一客户端在一定时间内访问到同一台服务器
IPv4地址的前三个字节或者IPv6的整个地址,会被用来作为一个散列key。 这种方法可以确保从同一个客户端过来的请求,会被传给同一台服务器。
upstream qfedu {
ip_hash;
server 172.16.0.10;
server 172.16.5.100;
server 172.16.16.100;
}
客户端测试:
同一客户端访问一直得到同一个页面.
LNMP架构 – 上线WordPress
1、安装php服务
# yum install php php-mysql php-fpm -y
# systemctl start php-fpm
# # netstat -tnlp | grep 9000
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 115012/php-fpm: master
2、编写lnmp架构的虚拟主机配置文件
# vim /usr/local/nginx/conf.d/lnmp.conf
server {
listen 83;
server_name localhost;
location / {
root html/wordpress;
index index.html index.php;
}
location ~ \.php$ {
root html/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
3、下载WordPress源码包
# wget https://cn.wordpress.org/latest-zh_CN.tar.gz
# tar xf latest-zh_CN.tar.gz //解压出一个wordpres目录
# mv wordpress/* html/wordpress/
mv:是否覆盖"html/wordpress/index.php"? y //因为上面写了测试页面index.php 按y确认覆盖
【注意:新版本的wordpres源码包需要php版本7.1以上,yum源自带版本是5.4.16】
解决方案:
1、更换php版本
# wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
# wget --no-check-certificate https://rpms.remirepo.net/enterprise/remi-release-7.rpm
# rpm -Uvh epel-release-latest-7.noarch.rpm remi-release-7.rpm
【会增加很多php版本的yum源】
# rpm -qa | grep php | xargs -I {} rpm -e --nodeps {} //卸载老版本
# yum install php73-php php73-php-mysql php73-php-fpm -y
# systemctl start php73-php-fpm
2、更换更老的wordpres源码包版本wordpress-4.5.3-zh_CN.tar.gz
3、准备数据库
# yum install mariadb-server -y
# systemctl start mariadb
# mysql -uroot
MariaDB [(none)]> create database wordpress; //创建所需要的数据库
Query OK, 1 row affected (0.00 sec)
4、抱歉,我不能写入wp-config.php文件
# vim html/wordpress/wp-config.php //添加页面上的内容
版权声明:本文为boldcc原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。