vlambda博客
学习文章列表

【Nginx快速扫盲】nginx入门



这是为小白定制的专属《Nginx快速扫盲》系列。涵盖了nginx的基础语法、案例分析等内容。内容通俗易懂,配合实操案例可以帮你快速上手。目标就是帮助大家轻松上手nginx,少走弯路!



【Nginx快速扫盲】nginx入门


1、nginx简介
【Nginx快速扫盲】nginx入门


nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。

nginx的特点占有内存少并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度京东新浪网易腾讯淘宝等。

nginx可以提供的服务包括:

  • web服务

  • 负载均衡

  • web cache


nginx处理请求的逻辑图:
【Nginx快速扫盲】nginx入门

2、nginx特性与优点
【Nginx快速扫盲】nginx入门


01. 
nginx特性

  • Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接

  • 高度的模块化和自由软件许可证是的第三方模块层出不穷(开源)

  • Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上

  • 这些优秀的设计带来的极大的稳定性

02. 
nginx优点

  • 高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2-3万并发连接数

  • 内存消耗少:在3万并发连接下,开启的10个nginx进程才消耗150M内存(15M*10=150M)

  • 配置文件非常简单:风格跟程序一样通俗易懂

  • 成本低廉:nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则- - 需要十多万至几十万人民币

  • 支持Rewrite重写规则:能够根据域名、URL的不同,将HTTP请求分到不同的后端服务器群组

  • 内置的健康检查功能:如果Nginx Proxy后端的某台Web服务器宕机了,不会影响前端访问

  • 节省带宽:支持GZIP压缩,可以添加浏览器本地缓存的Header头

  • 稳定性高:用于反向代理,宕机的概率微乎其微

  • 模块化设计:模块可以动态编译

  • 外围支持好:文档全,二次开发和模块较多

  • 支持热部署:可以不停机重载配置文件

  • 支持事件驱动AIO(AsyncIO,异步IO)、mmap(Memory Map,内存映射)等性能优化


3、nginx反向代理
【Nginx快速扫盲】nginx入门


多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。

反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

01. 
反向代理的作用

  • 负载均衡,通过反向代理服务器来优化网站的负载


02. 
正向代理与反向代理的区别

在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息

下面科普一下什么是正向代理:

1)正向代理【替客户端发请求】
我的电脑无法访问谷歌,另一台电脑可以访问谷歌。
【Nginx快速扫盲】nginx入门
我的电脑访问这台服务器,然后这台服务器去帮我请求google,然后把请求到的数据返回给我。设想是这样的:

【Nginx快速扫盲】nginx入门

这个过程其实就是正向代理!!

那么问题来了,怎么才能让我的这台服务器接受在我搜索hello world的时候自动帮我去访问google呢?你想到nginx好像有正向代理的功能,于是按照了nginx,并配置相关信息:

【Nginx快速扫盲】nginx入门

2)反向代理

【Nginx快速扫盲】nginx入门
这时候这台代理服务器其实不掌握在我们用户手里了,而是google专门用来接受请求,同时还可以作为过滤不正常的请求,防止你们黑的的一个服务器。对我们客户端来说,不掌握在我手里的东西都是别人的,所以这台服务器是反向的,哈哈。

google有了这台代理服务器,我们客户端就接触不到他的真正服务器。google内部可以做微服务,代理服务器可以根据url转发到不同的内部服务器。

nginx的配置上你可以通过指定不同的url前缀跳转到不同的服务器哈~

好了,如果你还不理解。最后我就要放大招了,一句话:假如说正向代理是黑客手里的攻击长矛,反向代理就是google握着的一个盾牌,相互撕杀,谁也不知道是对方是谁!!

4、nginx安装与配置


01. 
nginx的安装

创建系统用户:

groupadd -r nginxuseradd -r -M -s /sbin/nologin -g nginx nginx# useradd -M(不创建主目录) -s /sbin/nologin(指定用户所用的shell,表示不登陆) -g(指定group) 

安装环境:

  • nginx安装依赖GCC、openssl-devel、pcre-devel和zlib-devel软件库。

  • Pcre全称(Perl Compatible Regular Expressions),中文perl兼容正则表达式,pcre官方站点。

    [root@xaii ~]# yum -y install pcre-devel openssl openssl-devel gd-devel gcc gcc-c++暗转过程省略......[root@xaii ~]# yum -y groups mark install 'Development Tools'安装过程省略......

创建存放目录:

[root@xaii ~]# mkdir -p /var/log/nginx[root@xaii ~]# chown -R nginx.nginx /var/log/nginx/

下载nginx,存放在/opt/nginx目录

mkdir /opt/nginxcd /opt/nginxwget http://nginx.org/download/nginx-1.12.0.tar.gztar -zxvf nginx-1.12.0.tar.gz mv nginx-1.12.0.tar.gz nginx

编译安装nginx

cd /opt/nginx
./configure \ --prefix=/usr/local/nginx \ --user=nginx \ --group=nginx \ --with-debug \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_image_filter_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --http-log-path=/var/log/nginx/access.log \ --error-log-path=/var/log/nginx/error.log# --prefix=PATH : 指定nginx的安装目录。默认 /usr/local/nginx# --conf-path=PATH : 设置nginx.conf配置文件的路径。nginx允许使用不同的配置文件启动,通过命令行中的-c选项。默认为prefix/conf/nginx.conf# --user=name: 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认的用户名是nobody。--group=name类似# --with-pcre : 设置PCRE库的源码路径,如果已通过yum方式安装,使用--with-pcre自动找到库文件。使用--with-pcre=PATH时,需要从PCRE网站下载pcre库的源码(版本4.4 – 8.30)并解压,剩下的就交给Nginx的./configure和make来完成。perl正则表达式使用在location指令和 ngx_http_rewrite_module模块中。# --with-zlib=PATH : 指定 zlib(版本1.1.3 – 1.2.5)的源码解压目录。在默认就启用的网络传输压缩模块ngx_http_gzip_module时需要使用zlib 。# --with-http_ssl_module : 使用https协议模块。默认情况下,该模块没有被构建。前提是openssl与openssl-devel已安装# --with-http_stub_status_module : 用来监控 Nginx 的当前状态# --with-http_realip_module : 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如X-Real-IP 或 X-Forwarded-For),意义在于能够使得后台服务器记录原始客户端的IP地址# --add-module=PATH : 添加第三方外部模块,如nginx-sticky-module-ng或缓存模块。每次添加新的模块都要重新编译(Tengine可以在新加入module时无需重新编译)



make -j $(grep 'processor' /proc/cpuinfo | wc -l) && make install # 编译
02. 
nginx的配置

1)、添加环境变量

vim /etc/profile

添加以下内容:

立即生效:

souce /etc/profile

2)、使用nginx命令【重要】

nginx -t # 检查配置文件语法nginx -v # 检查nginx版本nginx -c /opt/nginx/nginx.conf # 通过-c指定配置文件。这里使用的是/opt/nginx/nginx.conf的配置文件(可以事先将/usr/local/nginx/conf下的nginx.conf和mine.types移动到/opt/nginx目录下。)nginx -s stop # 关闭nginxnginx -s reload # 重启nginx。

3)、端口占用问题

//因为apache和nginx的端口都是80,当apache服务开启时,无法开始nginx服务
[root@xaii ~]# ss -antlp|grep 80LISTEN 0 128 :::80 :::* users:(("httpd",pid=4081,fd=4),("httpd",pid=4080,fd=4),("httpd",pid=4079,fd=4),("httpd",pid=4078,fd=4),("httpd",pid=4077,fd=4),("httpd",pid=4076,fd=4)) [root@xaii ~]# nginxnginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)^C

关闭apache服务,再重启nginx服务即可。

[root@xaii ~]# apachectl stop[root@xaii ~]# nginx[root@xaii ~]# ss -antlp|grep 80LISTEN     0      128          *:80                       *:*                   users:(("nginx",pid=4069,fd=6),("nginx",pid=4068,fd=6))

4)、将nginx作为服务管理

创建/etc/init.d/nginx文件,编辑相关操作脚本:

vim /etc/init.d/nginx
#! /bin/bash
nginx=/usr/local/nginx/sbin/nginx # 这里是nginx的安装位置conf_path=/opt/nginx/nginx.conf # 这是配置文件脚本的位置
case $1 instart) $nginx -c $conf_pathif [ $? -eq 0 ];then echo 'nginx start sucessful'else echo 'nginx start faild'fi ;;

restart) $nginx -s stop $nginx -c $conf_pathif [ $? -eq 0 ];then echo 'nginx restart sucessful'else echo 'nginx restart faild'fi ;;

stop) $nginx -s stop 2>/dev/nullif [ $? -eq 0 ];then echo 'nginx is off'else echo 'nginx error'fi ;;esac

添加该文件的执行权限:

chmod +x /etc/init.d/nginx

利用service命令管理nginx

service nginx {start|stop|status|restart|reload|configtest}