rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-6.noarch.rpm
# 安装阿里的epel源
国内使用web站点最多的www服务是Nginx
官方网址:nginx.org
什么是Nginx?
开源、支持高性能、高并发的www服务软件,一种http协议的实现
优点:
高并发(静态资源)
占用资源少
功能丰富(反向代理、负载均衡)
高效稳定
Nginx有哪些应用?
- 经典组合 LAMP(linux apache mysql php)
- 现在组合: LNMP(linux nginx mysql php)
- web服务软件,具有反向代理功能,稳定高效运行
- 可以运行在任何已知的平台
Nginx总体为何比apache性能高?
1. Nginx采用epoll IO模型,而apache采用传统select IO模型
2. 对于要求高并发的站点,采用epoll更加高效
Nginx有哪些常见的模块?
1. Nginx核心模块
负责Nginx全局应用,对应配置文件的Main区块和Events区块,包含nginx必须的全局参数配置
2. 标准的http功能模块集合
默认自动安装到Nginx中,不建议改动默认,软件默认配置一般都是最优
如何编译安装Nginx?
安装前首先明白这几个问题,选择什么版本?选择安装目录是什么?下载包放哪?安装Nginx软件相关依赖
这里按照http://www.cnblogs.com/2bjiujiu/p/8067201.html 策略选择版本,并且web集群中其他节点都统一使用该版本,选择其中任何一版稳定版
任何通过编译安装,安装目录统一规定放到 /application 目录下
统一规定,从网站上下载的包放到当前用户家目录下 tools目录下
2. 安装Nginx软件相关依赖
安装依赖软件:pcre pcre-devel openssl openssl-devel
yum install -y pcre pcre-devel openssl openssl-devel # pcre库,开发正则,为了支持Nginx的URL重写rewrite模块 # openssl库,安全加密相关的库
3. 下载并解压
mkdir ~/tools # 创建统一存放下载包的目录 cd ~/tools # 切到这个目录下 wget -q http://nginx.org/download/nginx-1.12.2.tar.gz # 下载源码包 tar -xf nginx-1.12.2.tar.gz # 解压 cd nginx-1.12.2 # 进入源码包
4. 隐藏Nginx软件包信息
1. 更改nginx软件名
vim src/core/nginx.h # 修改全局的参数 13 #define NGINX_VERSION "1.12.2" # 更改版本号
# 更改为 apache最新版本号,迷惑性 14 #define NGINX_VER "nginx/" NGINX_VERSION
# 更改掉 nginx,更改为www 22 #define NGINX_VAR "NGINX"
# 更改NGINX,这个是软件名,更改为WWW
vim src/http/ngx_http_header_file_module.c 49 static u_char ngx_http_server_string[] = "Server: nginx" CRLF; # 把49行 "Server: nginx"改为 "Server: www" # 注意其中空格和格式
2. 更改错误提示
vim src/http/ngx_http_special_response.c 36行 "<hr><center>nginx</center>" CRLF # 把<center>nginx</center> 改为 <center>www</center> # 这里还可以添加标签"<hr><center>www(www.baidu.com) </center>"
3. 添加软件运行用户,编译和安装
useradd web_nginx -s /sbin/nologin -M # 添加web_nginx运行的用户 id web_nginx # 检查 ./configure --user=web_nginx --group=web_nginx --with-http_ssl_module --with-http_stub_status_module --prefix=/application/nginx-1.12.2/ # --user= 和 --group= 指定用什么身份运行 # --with-http_ssl_module 为HTTPS提供了必要的支持,需要OpenSSL库 # --with-http_stub_status_module 提供对基本状态信息的访问 # --prefix= 指定安装路径,需要后面再指定一个nginx源码包名字目录,做版本号区分 make && make install # 编译和安装
4. 创建软链接
ln -s /application/nginx-1.12.2/ /application/nginx # 去掉版本号,然开发不需要关注版本信息,软件升级的时候,对于开发来说没有任何影响 # 软件调用时候,也不需要关系版本号,软件升级也不影响开发和软件调用
5. 测试
1. 启动Nginx
/application/nginx/sbin/nginx -t # 检查配置文件是否正确 /application/nginx/sbin/nginx # 启动nginx netstat -lntup | grep 80 # 检查
2. 检查
打开浏览器访问 host_ip # 访问主机外网IP地址 # 如果返回Nginx欢迎页面表示Nginx安装成功 curl -I host_ip # 检查是否隐藏了版本号和版本信息
Nginx安装过程中可能出现的错误有哪些?
1. 启动Nginx报错,nginx: [emerg] getpwnam(“web_nginx”) faild
原因: 没有添加nginx运行需要的用户
解决方法: useradd web_nginx -s /sbin/nologin -M
2. 编译过程报错,gcc不全导致错误
解决方法: yum install -y gcc-c++
3. 检查系统初始化时候有没有安装基础包
yun grouplist # 查看已经安装的包 # 重点关注以下包,如果没安装通过 yum groupinstall -y "包名" 进行安装 # Base # Compatibility libraries # Debugging Tools # Development tools
4. 检查服务本地端口、进程和URL
lsof -i :80 # 检查端口80是否有服务
ps -ef | grep nginx # 检查是否有nginx进程 # 检查浏览器输入的主机地址是否正确,是不是主机外网IP,端口连接符号是否是英文格式
5. 查看错误日志信息
其日志文件路径: /application/nginx/logs/error.log # 前提是Nginx安装目录规范为/application和软链接建立正确
# cat /application/nginx/logs/error.log
Web服务错误如何排错
1. 客户端 ping 服务器ip地址
ping 10.0.0.8 # 排除物理线路故障
2. 客户端上telnet 服务器ip地址
telnet 10.0.0.8 80 # 排除防火墙故障
3. liunx客户端检查
curl 10.0.0.8 # 模拟浏览器请求
# wget 10.0.0.8 会把网页下载下来
Nginx配置文件参数
位置: /application/nginx/conf/nginx.conf
worker_processes # 进程数量
events # 模型
worker_connections # 一个进程连接最大连接数
http # http相关配置
include # 包含配置文件关键字
sendfile # 高效分发模式
keepalive_timeout # 一个活着的连接保持时间
server # 虚拟主机,对应一个站点
listen # 监听端口
server_name # 域名,多个中间空格隔开
location # 对域名后字段进行匹配
root # 站点根目录
index # 返回首页地址
error_page # 错误页面信息
什么是虚拟主机?
配置文件中一个server字典对
web服务器中独立的站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序和资源目录,可独立对外提供服务让用户访问
有三个分类
1. 域名
最为广泛,应用外部网站,通过请求头进行区分,直接ip地址访问,默认第一个虚拟主机,在http模块中,多个server就会有多个虚拟主机,通过域名来区分主机
2. 端口
应用于公司内部,网站后台,通过端口来区分主机
3. IP
不支持辅助ip,几乎不用
更改配置文件原则是什么?
1. 备份原文件,格式为: 原配置文件名_时间_修改版本号,这个是规范
/application/nginx/conf/nginx.conf{,._$(date +%F)_v1}
2. 任何单独修改完成,第二次修改需要备份一次,版本号+1
3. 有检查错误方法,先调用检查,一般为 -t 参数
4. 服务通过 reload 进行优雅重启
5. 出现错误立马回滚,回到上一个版本
如何实现资源下载展示?
- 在对应的server中,添加 autoindex on; 字段,在访问没有资源的情况下,将会就这个资源根目录下所有内容都会列出来,提供下载。正常没有这个参数,会提示403错误
Nginx如何配置多个站点?
- 对于多个站点,需要多个server,都写在主配置文件中显得不太专业
- 在conf配置目录下,创建extra目录,用于存放站点server
- 在主配置文件http中添加 include extra/*.conf ,统一包含extra中配置
Nginx状态查看
vim extra/status.conf # 添加nginx状态的虚拟机 server{ listen 80;
server_name status.benmenchuixue.com location /beimen { stub_status on; access_log off; #allow 172.16.1.0设置允许访问的ip段 #deny all,禁止访问
} } # 重启Nginx,然后访问这个域名实现获取nginx状态 # 这里联合监控使用,如果用户直接访问ip,通过rewrit跳转到首页,如果后面有有特殊标# 识将匹配到返回状态信息 # 注意html目录下index.html 和 50x.html会暴露软件版本信息,需要对这两个文件做信息脱敏处理,去掉特征信息展示
如何禁止用户直接通过ip访问服务器?
vim forbid_ip.conf # 写入一下内容 server {
listen 80 default;
server_name _;
return 500;
} # 直接通过ip访问,返回500错误
一键安装nginx
#!/bin/sh # author: beimenchuixue
# email: 422083556@qq.com
# blog: http://www.cnblogs.com/2bjiujiu/ . /etc/init.d/functions install_path="/application"
nginx_package_name="nginx-1.12.2.tar.gz"
nginx_download_url="http://nginx.org/download/$nginx_package_name"
nginx_run_user="nginx"
down_path="$HOME/tools"
nginx_relay="pcre-devel openssl-devel gcc-c++"
change_name="www"
change_version="2.2.15" [ -d $down_path ] || {
mkdir $down_path -p
action "init download path is" /bin/true
} download_nginx() {
cd $down_path
wget -q $nginx_download_url
[ $? -eq 0 ] && {
action "download nginx is" /bin/true
} || {
action "download nginx is" /bin/false
exit 1
}
}
# download_nginx install_nginx_relay() {
yum install -y $nginx_relay &> /dev/null
[ $? -eq 0 ] || {
action "install_nginx_relay is" /bin/false
exit 2
}
action "install_nginx_relay is" /bin/true
}
# install_nginx_relay add_run_nginx_user() {
id $nginx_run_user &> /dev/null
[ $? -eq 0 ] || {
useradd $nginx_run_user -s /sbin/nologin -M
}
action "add_run_nginx_user is" /bin/true
}
# add_run_nginx_user untar_nginx() {
cd $down_path
tar -xf $nginx_package_name
[ $? -eq 0 ] || {
echo "$nginx_package_name not exit"
action "install nginx is" /bin/false
exit 3
}
action "tar -xf $nginx_package_name is" /bin/true
} hiden_version() {
cd $down_path
cd `echo "$nginx_package_name"|sed "s#.tar.gz##g"`
sed -i "s/`echo "$nginx_package_name"| sed "s/.tar.gz//g"\
|sed "s/nginx-//g"`/${change_version}/g" src/core/nginx.h
sed -i "s/nginx\//${change_name}\//g" src/core/nginx.h
sed -i "s/\"NGINX\"/\"`echo $change_name|tr '[a-z]' '[A-Z]'`\"/g" src/core/nginx.h
sed -i "s/Server: nginx/Server: ${change_name}/g" src/http/ngx_http_header_filter_module.c
sed -i "s/<center>nginx</<center>${change_name}</g" src/http/ngx_http_special_response.c
action "nginx hiden version is" /bin/true
}
# hiden_version install_nginx() {
cd $down_path
cd `echo "$nginx_package_name"|sed "s/.tar.gz//g"`
./configure \
--user=$nginx_run_user \
--group=$nginx_run_user \
--with-http_ssl_module \
--with-http_stub_status_module \
--prefix=$install_path/`echo "$nginx_package_name"|sed "s#.tar.gz##g"` &> /dev/null
[ $? -eq 0 ] && {
action "nginx configure is" /bin/true
} || {
action "nginx configure is" /bin/false
exit 4
} make &> /dev/null && {
action "nginx make is" /bin/true
} || {
action "nginx make is" /bin/false
exit 5
} make install &> /dev/null && {
action "nginx make install is" /bin/true
} || {
action "nginx make install is" /bin/true
eixt 6
} ln -s $install_path/`echo "$nginx_package_name"|sed "s#.tar.gz##g"` $install_path/nginx && {
action "create softlink is" /bin/true
} || {
action "create softlink is" /bin/false
exit 7
}
action "nginx install is" /bin/true
}
# install_nginx main() {
download_nginx
untar_nginx
hiden_version
install_nginx_relay
add_run_nginx_user
install_nginx
}
main