写在前面,大家好!我是【跨考菌】,一枚跨界的程序猿,专注于后台技术的输出,目标成为
全栈攻城狮
!这博客是对我跨界过程的总结和思考。如果你也对Java
、后端技术
感兴趣,抑或是正在纠结于跨界,都可以关注我的动态,让我们一起学习,一起进步~
我的博客地址为:【跨考菌】的博客
文章大纲
系列大纲,持续更新:
【Nginx快速扫盲】01 小白也能看懂的Nginx入门
【Nginx快速扫盲】超全整理nginx.conf配置文件详解
【Nginx快速扫盲】03 nginx高级功能极速入门
【Nginx快速扫盲】04史上最简单nginx规则|指令详解
1、nginx简介
nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx的特点是占有内存少
,并发能力强
,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度
、京东
、新浪
、网易
、腾讯
、淘宝
等。
nginx可以提供的服务包括:
- web服务
- 负载均衡
- web cache
nginx处理请求的逻辑图:
2、nginx的特性和优点
2.1、nginx的特性
- Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
- 高度的模块化和自由软件许可证是的第三方模块层出不穷(开源)
- Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上
- 这些优秀的设计带来的极大的稳定性
2.2、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扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
3.1 反向代理的作用
- 保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载
3.2 正向代理和反向代理的区别
在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;
下面科普一下什么是正向代理:
1)正向代理【替客户端发请求】
我的电脑无法访问谷歌,另一台电脑可以访问谷歌。
我的电脑访问这台服务器,然后这台服务器去帮我请求google,然后把请求到的数据返回给我。设想是这样的:
这个过程其实就是正向代理!!
那么问题来了,怎么才能让我的这台服务器接受在我搜索hello world的时候自动帮我去访问google呢?你想到nginx好像有正向代理的功能,于是按照了nginx,并配置相关信息:
其中,resolver配置DNS解析IP地址,比如 Google Public DNS。(图例只是个例子,不是google dns)这时候,你在浏览器上配置上代理服务器地址和81端口,浏览器就会自动把请求转给代理服务器。
再看看小飞机的代理:
总结来了:想要实现正向代理,得配置一台转发请求的跳板服务器,同时客户端还得配置跳板服务器的代理地址。google是不知道访问的是我的电脑,只知道是我代理服务器。所以,如果当黑客去黑别人的网站,同时不想让网站追踪到你的ip地址,你就可以操控一台代理服务器去代替你攻击,这就是传说中的“肉鸡”啦!
2)反向代理
这时候这台代理服务器其实不掌握在我们用户手里了,而是google专门用来接受请求,同时还可以作为过滤不正常的请求,防止你们黑的的一个服务器。对我们客户端来说,不掌握在我手里的东西都是别人的,所以这台服务器是反向的,哈哈。
google有了这台代理服务器,我们客户端就接触不到他的真正服务器。google内部可以做微服务,代理服务器可以根据url转发到不同的内部服务器。
nginx的配置上你可以通过指定不同的url前缀跳转到不同的服务器哈~
好了,如果你还不理解。最后我就要放大招了,一句话:假如说正向代理是黑客手里的攻击长矛,反向代理就是google握着的一个盾牌,相互撕杀,谁也不知道是对方是谁!!
4、nginx的安装与配置
4.1、nginx的安装
创建系统用户:
groupadd -r nginx
useradd -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/nginx
cd /opt/nginx
wget http://nginx.org/download/nginx-1.12.0.tar.gz
tar -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 # 编译
4.2、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 # 关闭nginx
nginx -s reload # 重启nginx。
3)、端口占用问题
//因为apache和nginx的端口都是80,当apache服务开启时,无法开始nginx服务
[root@xaii ~]# ss -antlp|grep 80
LISTEN 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 ~]# nginx
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)
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 80
LISTEN 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 in
start)
$nginx -c $conf_path
if [ $? -eq 0 ];then
echo 'nginx start sucessful'
else
echo 'nginx start faild'
fi
;;
restart)
$nginx -s stop
$nginx -c $conf_path
if [ $? -eq 0 ];then
echo 'nginx restart sucessful'
else
echo 'nginx restart faild'
fi
;;
stop)
$nginx -s stop 2>/dev/null
if [ $? -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}
如果你觉得对您有帮助,不要忘记帮博主一键三连😊哦