【Nginx快速扫盲】nginx入门
这是为小白定制的专属《Nginx快速扫盲》系列。涵盖了nginx的基础语法、案例分析等内容。内容通俗易懂,配合实操案例可以帮你快速上手。目标就是帮助大家轻松上手nginx,少走弯路!
nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。
nginx的特点是占有内存少
,并发能力强
,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度
、京东
、新浪
、网易
、腾讯
、淘宝
等。
nginx可以提供的服务包括:
web服务
负载均衡
web cache
nginx处理请求的逻辑图:
Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
高度的模块化和自由软件许可证是的第三方模块层出不穷(开源)
Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris, AIX,Mac OS等操作系统上
这些优秀的设计带来的极大的稳定性
高并发连接:官方测试能够支撑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,内存映射)等性能优化
多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。
客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。
反向代理,“它代理的是服务端”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
负载均衡,通过反向代理服务器来优化网站的负载
在正向代理中,Proxy和Client同属于一个LAN(图中方框内),隐藏了客户端信息;
在反向代理中,Proxy和Server同属于一个LAN(图中方框内),隐藏了服务端信息;
下面科普一下什么是正向代理:
1)正向代理【替客户端发请求】
我的电脑无法访问谷歌,另一台电脑可以访问谷歌。
我的电脑访问这台服务器,然后这台服务器去帮我请求google,然后把请求到的数据返回给我。设想是这样的:
这个过程其实就是正向代理!!
那么问题来了,怎么才能让我的这台服务器接受在我搜索hello world的时候自动帮我去访问google呢?你想到nginx好像有正向代理的功能,于是按照了nginx,并配置相关信息:
2)反向代理
这时候这台代理服务器其实不掌握在我们用户手里了,而是google专门用来接受请求,同时还可以作为过滤不正常的请求,防止你们黑的的一个服务器。对我们客户端来说,不掌握在我手里的东西都是别人的,所以这台服务器是反向的,哈哈。
google有了这台代理服务器,我们客户端就接触不到他的真正服务器。google内部可以做微服务,代理服务器可以根据url转发到不同的内部服务器。
nginx的配置上你可以通过指定不同的url前缀跳转到不同的服务器哈~
好了,如果你还不理解。最后我就要放大招了,一句话:假如说正向代理是黑客手里的攻击长矛,反向代理就是google握着的一个盾牌,相互撕杀,谁也不知道是对方是谁!!
创建系统用户:
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官方站点。
-
[ ]
暗转过程省略......
[ ]
安装过程省略......
创建存放目录:
[ ]
[ ]
下载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
\
--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 # 编译
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
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}