地球最强WEB前端Nginx服务器之搭建基础静态WEB站点
1.1 Nginx概述及常用Web服务器介绍
1.1.1 Nginx简介:(来自百度百科)
Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个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,可能是因为Nginx的许可证模式跟GNU的GPL不一致吧。
写到这里我也不禁感概,欧美地区的人真太TMD的牛逼,一言不合就开发个软件,而且还能改变世界!
1.1.2目前常见的WEB服务器:
1)Nginx服务器:
堪称目前地球最强的WEB前端服务器,有两个王×××功能,分别是:静态页面处理和反向代理(可以代理http、ftp、mail、php、tomcat等)。静态文件处理能力比Apache强得多、且配置简单得多。目前并发量大的网站基本上都是使用Nginx(静态并发能力达到100000/秒)。
提示:要深入了解Nginx的功能,可以访问tengine.taobao.org网站(有中文说明,适合我这样的英语不太好的中国人,阿里强大啊!)
2)Apache服务器:
功能强大、插件丰富、跨平台(可以部署在Linux、Unix、Windiows上)的WEB服务器,市场占有率最高,但有被Nginx超越的趋势。特点:稳定、可靠,但并发能力不强。
3)Lighttpd服务器:
Lighttpd是由一个德国人发起的开源项目,其根本目的是提供一个针对高性能网站,安全、快速、兼容性好并且灵活的WEB服务器,具有非常低的CPU和内存开销,性能很好,但社区不活跃。
4)IBM WebSphere:
WebSphere Application Server是一种功能完善、开放的WEB应用程序服务器,是IBM电子商务计划的核心部分。基于java和Servlets的WEB应用程序运行环境,包含了WEB站点提供服务所需的一切,运行时可以协同并扩展Apache、Netscape、IIS和IBM的HTTPWeb服务器。
5)WindowsIIS(InternetInformation Server):
原生于Windows的WEB服务器,只适合部署在Windows服务器上,全球前100的互联网WEB服务器基本上不使用(可能除了微软吧)。
6)Tomcat服务器:
Tomcat是一个开源的Serlvet容器,它是Apache基金会Jakarta项目中的一个核心项目,有Apache、Sun和一些其它公司及个人共同开发而成。Tomcat既是一个Servlet容器,有具备传统的WEB服务器功能:可以解析静态html页面,但处理静态html能力远不能与Apache相比(Tomcat:1024并发,Apache:2000并发),实际应用中可以把Apache与Tomcat组合到一起,Apache处理静态html,Tomcat处理jsp和Servlet(即通常说的动静分离)。
提示:由于Tomcat并发能力比较低,所以只适合做小规模并发(应用中要提高Tomcat并发能力的话可以一台机器跑多个Tomcat,前提是服务器性能比较好),大规模并发需求的应用使用Weblogic或Jboss。
1.2 Nginx安装和启动
本文例子使用的系统和软件环境:
操作系统:CentOS6.5 64位版
IP地址:192.168.0.12/24
1.2.1以源代码方式编译安装
红帽官方没有收录Nginx,因此没有rpm包,需要的话可以自己打包成rpm包。
第1步:下载Nginx源代码包
到Nginx官网http://nginx.org/下载需要的源码包,本文使用的版本是nginx/1.8.0。
第2步:下载编译Nginx需要使用的其它软件源代码包:pcre与openssl
其实pcre与openssl包含在CentOS的官方Packages中,但在本文中我想使用不同版本的pcre与openssl,所以另外下载源代码包。
第3步:设定编译参数并编译安装
[root@CentOS6lsrv02 nginx]# ll
total 5712
-rwx------ 1 root root 832104 Jul 10 2015nginx-1.8.0.tar.gz
-rwx------ 1 root root 4015794 Jul 3 2012openssl-1.0.0a.tar.gz
-rwx------ 1 root root 992502 Jul 3 2012 pcre-8.12.tar.bz2
[root@CentOS6lsrv02 nginx]# tar xf nginx-1.8.0.tar.gz -C /opt/src 解压nginx源码包到/opt/src
[root@CentOS6lsrv02 nginx]# tar xf pcre-8.12.tar.bz2 -C /opt/src 解压pcre源码包到/opt/src
[root@CentOS6lsrv02 nginx]# tar xf openssl-1.0.0a.tar.gz -C/opt/src 解压openssl源码包到/opt/src
[root@CentOS6lsrv02 nginx]# cd /opt/src/nginx-1.8.0/
[root@CentOS6lsrv02 nginx-1.8.0]# ./configure \
> --prefix=/opt/nginx
> --with-http_stub_status_module \
> --with-pcre=/opt/src/pcre-8.12/ \
> --with-http_ssl_module \
> --with-openssl=/opt/src/openssl-1.0.0a/
[root@CentOS6lsrv02 nginx-1.8.0]# make && make install
参数解释:
--prefix=/opt/nginx:指定nginx安装路径。
--with-http_stub_status_module:开启Nginx的状态检测模块。
--with-pcre=/opt/src/pcre-8.12/:指定pcre源代码包的路径。使用CentOS官方自带的pcre需要先安装pcre-devel包(yum install -y pcre-devel),安装后不需要指定路径。
--with-http_ssl_module:启用ssl安全模块。
--with-openssl=/opt/src/openssl-1.0.0a:指定openssl源代码包的路径。使用CentOS官方自带的openssl需要先安装openssl-devel(yum install -y openssl-devel),安装后不需要指定路径。
安装完后:用ldd查看nginx动态链接库的关系
[root@CentOS6lsrv02 nginx-1.8.0]# ldd /opt/nginx/sbin/nginx
linux-vdso.so.1=> (0x00007fffe8788000)
libpthread.so.0=> /lib64/libpthread.so.0 (0x000000387c400000)
libcrypt.so.1 =>/lib64/libcrypt.so.1 (0x0000003a44600000)
libdl.so.2 =>/lib64/libdl.so.2 (0x0000003a40a00000)
libz.so.1 =>/lib64/libz.so.1 (0x0000003a41e00000)
libc.so.6 =>/lib64/libc.so.6 (0x0000003a40e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a40600000)
libfreebl3.so =>/lib64/libfreebl3.so (0x0000003a43a00000)
提示:通过以上参数编译出来的nginx并没有依赖 pcre 和 openssl 的库,原因是这种方式把 pcre 和 openssl 都编译进nginx了,不需要使用安装在系统的 pcre和 openssl。
以下是使用系统系统安装的pcre-devel和openssl-devel编译的结果:
[[email protected]]# ./configure \
> --prefix=/opt/nginx-redhat \
> --with-http_stub_status_module \
> --with-http_ssl_module \
> --with-pcre <--这项可以不加,nginx默认会使用pcre
[root@CentOS6lsrv02 nginx-1.8.0]# make && make install
[root@CentOS6lsrv02 nginx]# ldd /opt/nginx-redhat/sbin/nginx
linux-vdso.so.1=> (0x00007fffda7ff000)
libpthread.so.0=> /lib64/libpthread.so.0 (0x000000387c400000)
libcrypt.so.1 =>/lib64/libcrypt.so.1 (0x0000003a44600000)
libpcre.so.0 =>/lib64/libpcre.so.0 (0x000000387d800000) 看到吧,有引用pcre库
libssl.so.10 =>/usr/lib64/libssl.so.10 (0x000000387c800000) 引用openssl的库
libcrypto.so.10=> /usr/lib64/libcrypto.so.10 (0x0000003a46e00000)
libdl.so.2 =>/lib64/libdl.so.2 (0x0000003a40a00000)
libz.so.1 =>/lib64/libz.so.1 (0x0000003a41e00000)
libc.so.6 =>/lib64/libc.so.6 (0x0000003a40e00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a40600000)
libfreebl3.so =>/lib64/libfreebl3.so (0x0000003a43a00000)
libgssapi_krb5.so.2=> /lib64/libgssapi_krb5.so.2 (0x000000387d000000)
libkrb5.so.3 =>/lib64/libkrb5.so.3 (0x000000387cc00000)
libcom_err.so.2=> /lib64/libcom_err.so.2 (0x000000387d400000)
libk5crypto.so.3=> /lib64/libk5crypto.so.3 (0x0000003a47600000)
libkrb5support.so.0=> /lib64/libkrb5support.so.0 (0x0000003a46600000)
libkeyutils.so.1=> /lib64/libkeyutils.so.1 (0x0000003a47a00000)
libresolv.so.2=> /lib64/libresolv.so.2 (0x0000003a43200000)
libselinux.so.1=> /lib64/libselinux.so.1 (0x0000003a42200000)
1.2.2启动和关闭Nginx
1)启动nginx
Nginx官方默认没有启动脚本,使用绝对路径运行命令启动
[root@CentOS6lsrv02 ~]# /opt/nginx/sbin/nginx 启动nginx,默认不会有提示
[root@CentOS6lsrv02 ~]# pstree -aunpl|grep nginx
| | `-vim,16705 nginx.conf
| `-grep,16742 --color=auto nginx
`-nginx,16736 nginx使用父子进程方式,默认是1个子进程,我修改为4个,根据服务器使用的CPU核心总数设置。
|-nginx,16737,nobody <--默认启动nginx子进程的用户为nobody,可以修改。
|-nginx,16738,nobody
|-nginx,16739,nobody
`-nginx,16740,nobody
2)关闭nginx
使用kill或kill -15停止nginx,此为正常关闭nginx的方式
1.3 Nginx网站服务配置事例
nginx 成功启动后,默认可以访问了,在浏览器输入服务器IP地址192.168.0.12
到此,nginx的WEB站点已经搭建成功,只要把网站的数据拷贝到/opt/nginx/html/目录下,就可以了。简单吧!!!
1.3.1配置一个简单的静态WEB服务器
以下是一个最基础的静态WEB站点设置:
vi /opt/nginx/conf/nginx.conf
1#----------全局设置区开始----------
2 #user nobody;
3 worker_processes 4; <--设置Nginx服务器启动的子进程数,根据服务器使用的CPU核心总数设定,本文使用的机器是4核心的CPU,支持超线程的CPU一个核心设置2个子进程是没有问题的
4
5 #error_log logs/error.log;
6 #error_log logs/error.log notice;
7 error_log /var/log/nginx/error.log info; <--定义错误日志目录,默认值 为logs/error.log info;表示默认在nginx安装目录下的logs目录下面,日志记录级别为info
8
9 pid /var/run/nginx.pid; <--设置nginx进程文件所在位置(默认值为logs/nginx.pid;表示默认在nginx安装目录下的logs目录下面)
10
11 events {
12 worker_connections 15000; <--设置Nginx并发数
13 }
14#----------全局设置区结束----------
15 http { <--定义Nginx代理的http协议段开端
16 include mime.types; <--该文件定义Nginx能处理的文件类型及对文件的处理方法,可以在该文件中添加类型
17 default_type application/octet-stream;<--Nginx不能处理的文件都识别为二进制,在用户客户端浏览器弹出对话框,让用户下载该文件
18
19 log_format main '$remote_addr - $remote_user [$time_local] "$request" '
20 '$status$body_bytes_sent "$http_referer" '
21 '"$http_user_agent" "$http_x_forwarded_for"';
22 #log_format定义日志变量“main”,后面是日志记录的格式,可以自定义日志变量名字和格式
23 #access_log logs/access.log main;
24
25 sendfile on; <--开启快速文件传输
26 tcp_nopush on; <--这项设置意思是当nginx非常繁忙时(nginx hold不住啦!!!!)就暂时不要把新的连接请求发送到应用层的nginx了,暂存在传输层吧
27
28 #keepalive_timeout 0;
29 keepalive_timeout 30;<--保持连接30秒,根据客户端浏览器设定,通常IE是30秒,Firefox是15秒等,这个值是服务器和客户端程序共同决定的
30 gzip on;<--开启压缩
31
32 server { <--虚拟主机段开端
33 listen 80; <--监听端口
34 server_name localhost;<--主机头,即域名
35
36 charset utf8;<--设置虚拟主机使用的字符集(默认是koi8-r,修改为utf8比较通用)
37 access_log /var/log/localhost-access.log main; <--这里的设置会覆盖全局区第23行的设置,表示启用访问日志,日志格式使用前面由log_format定义的格式“main”
38
39 location / { <--万能location,匹配任何路径
40 root html; <--定义站点根目录位置,如:/www/html,默认在nginx安装目录下的html目录
41 index index.html index.htm; <--站点首页索引顺序
42 }
43
44 error_page 404 /404.html; <--定义404错误(找不到页面)响应文件名,放在站点根目录下
45 error_page403 /403.html; <--定义403错误(禁止访问)响应文件名,放在站点根目录下
46 # redirect server error pages to thestatic page /50x.html
47 #
48 error_page 500 502 503 504 /50x.html; <--定义500以上错误响应文件名,放在站点跟目录下
49 location = /50x.html {
50 root html;
51 }
52 } <--虚拟主机段结束
53 } <--定义Nginx代理的http协议段结束
小结:本文是关于Nginx安装和配置一个静态WEB站点的最简单的方法,后续我将会继续发布关于Nginx的更高级应用,会逐步扩展到大型WEB集群的应用,希望对技术感兴趣的小伙伴继续关注我的技术博客!!!!!!