Nginx简介及使用方法

时间:2021-03-18 20:44:57

Project 1:Nginx和Apache的区别

1. apache 相对于nginx 的优点:

  • rewrite ,比nginx 的rewrite 强大
  • 动态页面,nginx处理动态请求是鸡肋,一般动态请求要apache去做,nginx只适合静态和反向。
  • 模块超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相对较多超稳定

2. nginx相对于apache的优点

  • 轻量级,同样起web 服务,比apache占用更少的内存及资源 ,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 这归功于Nginx为我们选择了 epoll and kqueue 作为开发模型.
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊
  • Nginx本身就是一个反向代理服务器
  • 负载均衡能力突出,Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多.

3. 核心区别:apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

一般来说,需要性能的web 服务,用nginx 。如果不需要性能只求稳定,那就apache 吧。后者的各种功能模块实现得比前者,例如ssl 的模块就比前者好,可配置项多。这里要注意一点,epoll(freebsd 上是 kqueue )网络IO 模型是nginx 处理性能高的根本理由,但并不是所有的情况下都是epoll 大获全胜的,如果本身提供静态服务的就只有寥寥几个文件,apache 的select 模型或许比epoll 更高性能。

先说Select:

  • Socket数量限制:该模式可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
  • 操作限制:通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍(这就是apache慢的原因).

再说Epoll:

  • Socket数量无限制
  • 操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询(这当然是nginx快的原因啦).

原理部分小编觉得读者知道这些就够了,起码当别人问起你选择上述二者之一的理由你已经够应付啦,当然小编还给你推荐一种折中的方案,nginx做前端,apache做后端啦。


Nginx的安装与配置

1.安装gcc,openssl-devel,pcre-devel和zlib-devel软件库

zlib-devel软件库,为了gzip

[root@localhost ~]# yum install gcc openssl-devel  zlib-devel

 从网上下载pcre-devel软件,为了重写rewrite

[root@localhost src]#tar zxvf pcre-8.39.tar.gz

[root@localhost src]# cd pcre-8.39

[root@localhost pcre-8.39]# ./configure --prefix=/usr/local/pcre

[root@localhost pcre-8.39]#make

[root@localhost pcre-8.39]#make install

2.安装Nginx

添加用户和组

[root@localhost src]# groupadd -r nginx

[root@localhost src]# useradd -r -g nginx nginx

下载nginx

http://nginx.org/

[root@localhost src]# tar nginx-1.10.1.tar.gz

[root@localhost src]# cd nginx-1.10.1

[root@localhost nginx-1.10.1]#./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.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_mp4_module --with-http_stub_status_module --with-http_gzip_static_module --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/ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre=/usr/local/src/pcre-8.39

[root@localhost nginx-1.10.1]#make

[root@localhost nginx-1.10.1]#make install

[root@localhost nginx-1.10.1]#mkdir -p /var/tmp/nginx/{client,proxy,fastcgi,uwsgi,scgi}

[root@localhost nginx-1.10.1]#/usr/local/nginx/sbin/nginx -V  #查看安装nginx时的编译选项

编译选项解释

--prefix=/usr/local/nginx:安装目录

--sbin-path=/usr/local/nginx/sbin/nginx:执行程序文件

--conf-path=/etc/nginx/nginx.conf:配置文件

--error-log-path=/var/log/nginx/error.log:错误日志文件

--http-log-path=/var/log/nginx/access.log:访问日志文件

--pid-path=/var/run/nginx/nginx.pid:pid文件

--lock-path=/var/lock/nginx.lock:lock锁定文件

--user=nginx:程序运行时的非特权用户

--group=nginx:程序运行时的非特权用户组

--with-http_ssl_module:启用ngx_http_ssl_module支持,支持https请求

--with-http_flv_module:提供寻求内存使用基于时间的偏移量文件

--with-http_mp4_module:支持mp4

--with-http_stub_status_module:获取nginx自上次启动以来的工作状态

--with-http_gzip_static_module:在线实时压缩输出数据流

--http-client-body-temp-path=/var/tmp/nginx/client/:设定http客户端请求临时文件路径

--http-proxy-temp-path=/var/tmp/nginx/proxy/:设定http代理临时文件路径

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/:设定http fastcgi临时文件路径

--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi:设定http uwsgi临时文件路径

--http-scgi-temp-path=/var/tmp/nginx/scgi:设定http scgi临时文件路径

--with-pcre:启用pcre库

其他编译选项

–with-pcre= 指向pcre库文件目录

–with-md5= 指向md5库文件目录

–with-sha1= 指向sha1库目录

–with-zlib= 指向zlib库目录

–with-openssl= 指向openssl安装目录

–with-debug 启用debug日志

–with-mail 启用POP3/IMAP4/SMTP代理模块支持

–with-http_secure_link_module:计算和检查要求所需的安全链接网址

–with-http_degradation_module:允许在内存不足的情况下返回204或444码

3.Nginx的配置文件

Nginx主配置文件,/etc/nginx/nginx.conf

Nginx的主配置文件分为4个部分:main(全局设置),server(主机设置),upstream(负载均衡服务器设置),location(URL匹配特定位置的设定)

(1)Nginx的全局配置

(1)Nginx的全局配置

Nginx简介及使用方法
user  nobody;
worker_processes 4;

error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;

events {
use epoll;
worker_connections 1024;
}
Nginx简介及使用方法

user nobody nobody; 指定Nginx Worker进程运行用户以及用户组,默认为nobody

worker_processes 4; 指定Nginx要开启的进程数

error_log; 定义全局错误日志文件

pid; 指定进程id的存储文件位置

worker_rlimit_nofile 65535; 用于绑定worker进程和cpu

events  用来设定Nginx的工作模式及连接数上限

use  用来指定nginx的工作模式,select和poll是标准的工作模式,kqueue和epoll是高效的工作模式,kqueue用在BSD系统,linux系统epoll是首选

worker_connections  用于定义nginx每个进程的最大连接数,默认是1024

(2)HTTP服务器的配置

Nginx简介及使用方法
http {
include conf/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent
"$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

client_max_body_size 20m;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
client_header_timeout 10;
client_body_timeout 10;
send_timeout 10;
Nginx简介及使用方法

include  设定mime类型,类型由mime.type文件定义

default_type  默认类型为二进制流

log_format  指定nginx日志的输出格式

$remote_addr与$http_x_forwarded_for用以记录客户端的ip地址;

$remote_user:用来记录客户端用户名称;

$time_local: 用来记录访问时间与时区;

$request: 用来记录请求的url与http协议;

$status: 用来记录请求状态;成功是200,

$body_bytes_sent :记录发送给客户端文件主体内容大小;

$http_referer:用来记录从那个页面链接访问过来的;

$http_user_agent:记录客户浏览器的相关信息;

client_max_body_size   设置允许客户端请求的最大单个文件字节数

client_header_buffer_size  指定来自客户端请求头的headerbuffer大小

large_client_header_buffers  指定客户端请求中较大的消息头的缓存最大数量和大小

sendfile  开启高效文件传输模式

tcp_nopush  防止网络堵塞

tcp_nodelay  防止网络堵塞

keepalive_timeout  客户端连接保持活动的超时时间

client_header_timeout  客户端请求头读取超时时间

client_body_timeout  客户端请求主体读取超时时间

send_timeout  响应客户端的超时时间

(3)HttpGzip模块,支持在线实时压缩输出数据流

Nginx简介及使用方法
gzip   on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
Nginx简介及使用方法

gzip   用于设置开启或者关闭gzip

gzip_min_length  允许压缩的页面最小字节数

gzip_buffers   申请4个单位为16k的内存作为压缩结果流缓存

gzip_http_version   识别HTTP协议版本,默认1.1

gzip_comp_level   指定gzip压缩比

gzip_types   指定压缩的类型

gzip_vary   让前端的缓存服务器缓存经过gzip压缩的页面

(4)负载均衡配置

Nginx简介及使用方法
upstream ixdba.net{
ip_hash;
server 192.168.1.123:80;
server 192.168.1.124:80 down;
server 192.168.1.125:8009 max_fails=3 fail_timeout=20s;
server 192.168.1.126:8080;
}
Nginx简介及使用方法

通过upstream 指定一个负载均衡器的名称ixdba.net

负载均衡模块调度算法

轮询:默认,每个请求按时间顺序逐一分配到不同的后端服务器

weight:weight越大,分配到的访问机率越高

ip_hash:每个请求按访问ip的hash结果分配

fair:依据页面大小和加载时间长短智能的进行负载均衡

url_hash:按访问url的hash结果来分配请求

服务器在负载均衡调度中的状态

down:表示暂时不参与负载均衡

backup:预留的备份机器

max_fails:允许请求失败的次数

fail_timeout:在经历了请求失败的次数后,暂停服务的时间

(5)虚拟主机的配置

server{
listen 80;
server_name 192.168.0.100 www.hyundai.com;
index index.html index.htm index.jsp;
root /web/wwwroot/www.hyundai.com
charset gb2312;

listen:监听端口

server_name:指定ip或域名

index:默认首页地址

root:网页根目录

charset:设置网页的默认编码格式

(6)URL匹配配置

location - .*\.(gif|jpg|jpeg|png|bmp|swf)${
root /web/wwwroot/www.hyundai.com;
expires 30d;
}

把以上这些静态文件交给Nginx处理,expires指定静态文件过期时间为30天

location - ^/(upload|html)/{
root /web/wwwroot/www.hyundai.com;
expires 30d;
}

把upload和html下的所有文件都交给nginx处理

location ~ .*.jsp${
index index.jsp;
proxy_pass http://localhost:8080;
}

所有.jsp文件都交给本机的8080端口处理

 

4.Nginx的启动和关闭

检查nginx配置文件的正确性

 /usr/local/nginx/sbin/nginx -t -c /etc/nginx/nginx.conf

显示如下信息,则说明正确

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

显示nginx的版本信息

/usr/local/nginx/sbin/nginx -v

nginx的启动

/usr/local/nginx/sbin/nginx

查看nginx的启动进程

 ps -ef |grep nginx

 

5.Nginx开机自动启动

vim /etc/init.d/nginx

Nginx简介及使用方法  nginx

 chmod a+x /etc/init.d/nginx  #添加执行权限

chkconfig --add nginx   #添加到服务管理列表

chkconfig nginx on  #开机启动

service nginx start

/usr/local/nginx/html   #nginx网页根目录

 

Nginx性能优化技巧

1.减小Nginx编译后的文件大小

编译nginx时,默认以debug模式进行,会插入很多跟踪和ASSERT之类的信息,在编译之前,修改源码,取消debug模式

源码目录下vim auto/cc/gcc,删除或注释以下几行

# debug

CFLAGS="$CFLAGS -g"

2.为特定的CPU指定CPU类型编译优化

优化GCC编译

--with-cc-opt='-O3'

--with-cpu-opt=CPU  #为特定的CPU编译

cat /proc/cpuinfo | grep "model name"  #确定CPU类型