nginx使用入门的笔记
本文于2016年4月底完成,发布在个人博客网站。
考虑个人博客因某种原因无法修复,于是在博客园安家,之前发布的文章逐步搬迁过来。
从源码安装nginx
下载软件
编译nginx,必备pcre,zlib,由于jackie打算研究HTTPS,所以还需要openssl。
wget https://www.openssl.org/source/openssl-1.0.2g.tar.gz
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.38.tar.gz
wget http://zlib.net/zlib-1.2.8.tar.gz
wget http://nginx.org/download/nginx-1.9.15.tar.gz
当前openssl的最新版本为1.1.0-pre5,但是在编译时发现会报错,所以还是使用了1.0.2g版本。
编译和安装
软件上传至/home/jackie/installer,然后执行如下命令
解压软件包
cd /home/jackie/installer
tar vxfz openssl-1.0.2g.tar.gz
tar vxfz pcre-8.38.tar.gz
tar vxfz zlib-1.2.8.tar.gz
tar vxfz nginx-1.9.15.tar.gz
准备编译脚本
cd nginx-1.9.15
test -f Makefile && make clean
./configure --prefix=/home/jackie/software/nginx \
--with-http_ssl_module --with-openssl=/home/jackie/installer/openssl-1.0.2g \
--with-pcre=/home/jackie/installer/pcre-8.38 \
--with-zlib=/home/jackie/installer/zlib-1.2.8
编译,利用多核CPU的优势,提升效率。如无意外,这一步一般都会成功。
make -j4
执行安装
make install
基本使用
nginx -v,查看当前版本
#./nginx -v
nginx version: nginx/1.9.15
nginx -c filename,使用指定的配置文件启动nginx进程。
nginx -s stop,立即关闭nginx,直接退出运行。
nginx -s quit,正常关闭,完成响应之后退出运行。
nginx -s reload,使用新的配置启动新的工作进程,正常关闭旧的工作进程。
nginx -s reopen,重新打开日志文件。
nginx -t,测试配置文件的内容是否正确。
使用上述命令,可以简单验证下刚才编译得到的nginx是否可以使用。
nginx的目录结构
安装路径下包含如下目录:
- conf
- html
- logs
- sbin
conf
存放nginx在运行时需要的配置文件,默认情况下有如下文件:
字符集转换映射表
- koi-utf
- koi-win
- win-utf
模块ngx_http_charset_module的文档中提到了如上的三个文件,以及使用说明。
Full conversion tables from koi8-r to windows-1251, and from koi8-r and windows-1251 to utf-8 are provided in the distribution files conf/koi-win, conf/koi-utf, and conf/win-utf.
如下是使用样例:
include conf/koi-win;
charset windows-1251;
source_charset koi8-r;
文件扩展名与文件类型的映射表
- mime.types
- mime.types.default
nginx根据映射表中定义的映射关系,设置HTTP响应头的
Content-Type
值。当在映射表中没有找到文件对应的Content-Type
时,nginx将使用default-type指令指定的默认值。比如在nginx.conf有如下配置,则
Content-Type
默认值为application/octet-stream
。include mime.types;
default_type application/octet-stream;
cgi参数传递的配置
- fastcgi.conf
- fastcgi.conf.default
- fastcgi.params
- fastcgi.params.default
- scgi_params
- scgi_params.default
- uwsgi_params
- uwsgi_params.default
由于Jackie没有用到cgi形式的调用,因此对于这类配置文件没有做专门的了解。
nginx的主要配置文件,啰嗦了这么多,终于到了nginx最重要的配置文件,具体指令的说明在后面逐步介绍。
- nginx.conf
- nginx.conf.dfault
html
默认情况下有如下两个文件:
- index.html,nginx的欢迎主页。
- 50x.html,50x错误时的页面。
logs
默认情况下日志文件的输出目录。
sbin
默认情况下,nginx程序的安装目录。
nginx的配置
配置说明
基本配置
指定nginx工作者进程运行时的用户,例如如下指令指定使用用户nobody来运行nginx工作者进程。
user nobody;
指定保存nginx主进程ID的文件
pid logs/nginx.pid;
隐藏nginx的版本号
server_tokens off;
禁止非必要的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
禁止访问WEB-INF目录
location ~ ^/WEB-INF/ {
deny all;
}
错误日志
指定错误日志保存文件名。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
访问日志
关闭访问日志
access_log off;
指定访问日志输出路径
access_log logs/access.log;
指定日志输出路径,同时指定只保存部分内容
log_format apache
'$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$http_cookie"';
access_log logs/access.log apache;
输出全部日志到access-full.log中
log_format full
'$remote_addr $remote_user [$time_local] '
'"$host"->$proxy_host->$upstream_addr '
'"$request" $status($upstream_status) '
'$bytes_sent/$gzip_ratio($sent_http_content_type) '
'$request_time($upstream_response_time)';
access_log logs/access-full.log full;
TCP传输配置
启用sendfile特性,提高I/O效率。
sendfile on;
tcp_nodelay off;
tcp_nopush on;
keepalive_requests 100;
超时的定义
client_header_timeout 30;
client_body_timeout 60;
send_timeout 60;
keepalive_timeout 65 20;
缓存相关参数的定义
client_header_buffer_size 1k;
client_body_buffer_size 128k;
large_client_header_buffers 4 4k;
client_max_body_size 10m;
client_body_temp_path temp/client/;
output_buffers 1 32k;
postpone_output 1460;
HTTPS相关配置
#ssl_stapling on;
#ssl_stapling_verify on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!3DES:!aDSS:!aNULL:!kPSK:!kSRP:!MD5:@STRENGTH:+SHA1:+kRSA;
ssl_session_cache shared:TLSSL:16m;
ssl_session_timeout 10m;
ssl_certificate sslcert/de/<company>/wildcard.crt;
ssl_certificate_key sslcert/de/<company>/wildcard.key;
HTTP协议的安全头部
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;
add_header X-Frame-Options SAMEORIGIN always; # frame页面的地址只能为同源域名下的页面
#add_header X-Frame-Options DENY; # 浏览器拒绝当前页面加载任何Frame页面
#add_header X-Frame-Options ALLOW-FROM; # origin为允许frame加载的页面地址
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options nosniff;
启用gzip传输
gzip on;
gzip_static on;
gzip_disable "msie6";
#gzip_disable "MSIE [1-6]\.";
gzip_vary on;
gzip_min_length 1024;
gzip_buffers 128 32k;
gzip_comp_level 6;
#gzip_proxied any;
gzip_http_version 1.1;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/x-component
text/xml application/xml application/xhtml+xml application/json
image/x-icon image/bmp image/svg+xml application/atom+xml
text/javascript application/javascript application/x-javascript
application/pdf application/postscript
application/rtf application/msword
application/vnd.ms-powerpoint application/vnd.ms-excel
application/vnd.ms-fontobject application/vnd.wap.wml
application/x-font-ttf application/x-font-opentype;
代理的相关配置
proxy_intercept_errors on;
proxy_ignore_client_abort off;
#proxy_redirect http:// $scheme://;
proxy_pass https://127.0.0.1:18433;
proxy_hide_header Server;
proxy_hide_header X-Powered-By;
proxy_set_header Host $http_host;
#proxy_set_header Host $host;
在设置Host
时,有的网友使用的是如下指令。经过实测,对于后端基于tomcat的Web应用如果使用了非标准的端口提供Web服务,在页面重定向后URL中会丢失端口,导致用户无法正常访问站点。
proxy_set_header Host $host;
如果后端的应用启用了对referer
的验证,为避免代理后的请求被应用屏蔽,需要手工指定Referer。
proxy_set_header referer '';
指定原始请求的信息
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Class $classification;
proxy_set_header X-Forwarded-Proto $scheme;
### proxy-timeouts ###
proxy_connect_timeout 6;
proxy_send_timeout 60;
proxy_read_timeout 60;
### proxy-buffers ###
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 256 8k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_temp_path temp/proxy/;
完整样例
nginx作为反向代理
- 将请求转给后端,后端基于tomcat+jsp开发;
- nginx启用HTTPS支持;
nginx.conf
#user nobody;
worker_processes 1;
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
server_tokens off;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_buffers 128 32k;
gzip_comp_level 6;
gzip_http_version 1.1;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml application/xml application/json text/javascript application/javascript application/x-javascript;
charset utf-8;
server {
listen 8080;
server_name 192.168.1.102;
if ($scheme ~ http) {
return https://192.168.1.102:8443$request_uri;
}
}
server {
listen 8443 ssl;
server_name 192.168.1.102;
ssl_certificate server.crt;
ssl_certificate_key server.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" always;
add_header X-Frame-Options SAMEORIGIN always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options nosniff;
location / {
#root html;
index index.jsp;
proxy_pass http://192.168.1.102:18080;
proxy_set_header referer '';
include proxy.conf;
}
location ~ .*\.jsp$ {
#root html;
index index.jsp;
proxy_pass http://192.168.1.102:18080;
proxy_set_header referer '';
include proxy.conf;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
}
proxy.conf
proxy_hide_header Server;
proxy_hide_header X-Powered-By;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-By $server_addr:$server_port;
proxy_set_header X-Forwarded-For $remote_addr;
#proxy_set_header X-Forwarded-Class $classification;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 6;
proxy_send_timeout 60;
proxy_read_timeout 60;
proxy_buffering on;
proxy_buffer_size 8k;
proxy_buffers 256 8k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
#proxy_temp_path temp/proxy/;
参考资料
nginx
nginx wiki
网友的经验和总结
- Nginx安装与使用
- nginx配置模板
- nginx配置详解
- nginx配置文件概述
- nginx 访问静态html 方式
- Securing nginx
- 利用Nginx的Referer防盗链
- nginx 实现valid_referer全面解析
- 折腾了一下 nginx 配置
- Nginx ngx_http_charset_module模块基本指令整理
- nginx超时设置
- nginx正向代理
- Nginx的DNS解析过程分析
- Nginx的DNS解析过程分析
- nginx keepalive_timeout 设置策略
- 你真的用上keepalive了吗
- nginx定制header返回信息模块ngx_headers_more
关于HTTPS
关于安全头部
- 使用HTTP 响应头信息中的 X-Frame-Options 属性防止网页被Frame
- 浏览器安全策略 CSP 部署:Teambition 实战
- CSP内容安全策略
- Content Security Policy减少劫持
- 关于 Web 安全,99% 的网站都忽略了这些
- Web 安全之内容安全策略 (CSP)
关于gzip
关于sendfile
- linux的sendfile()系统调用
- sendfile:Linux中的"零拷贝"
- Linux kernel 的 sendfile 是如何提高性能的
- linux内核系统调用--sendfile函数
- sendfile()对Nginx性能的提升
- SENDFILE(2)
相关博客
nginx使用入门的笔记的更多相关文章
- Nginx快速入门菜鸟笔记
Nginx快速入门-菜鸟笔记 1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
- 第三章 Git的入门 - 读书笔记
Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
- Scala入门学习笔记三--数组使用
前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...
- nginx配置入门
谢谢作者的分享精神,原文地址:http://www.nginx.cn/591.html nginx配置入门 之前的nginx配置是对nginx配置文件的具体含义进行讲解,不过对于nginx的新手可能一 ...
随机推荐
- 项目实战:Qt多段Y轴折线图框架(双Y轴段折线、支持拽拖、浮动游标显示X值各段Y值、支持大量实时显示下位机数据)
若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/111660400长期持续带来更多项目与技术分享, ...
- mysql安装及增删改查操作---day35
# ### mysql ''' 命令可以用tab来补全 d: D:\>cd MySQL5.7 D:\>cd D:\MySQL5.7\mysql-5.7.25-winx64\bin 直接切换 ...
- ubuntu18.04下nginx配合fastdfs使用的安装和配置
前期准备 1.安装依赖包 # 新装的ubuntu缺少gcc编译,需要先安装这个 sudo apt-get install build-essential 1.解压缩 libfastcommon-mas ...
- gopkg.in/go-playground/validator中比较有用的标签
- 忽略| 或omitempty 有则验证,空值则不验证dive 潜入到切片.数组.映射中,例如 NumList []int `validate:"len=2,dive,gt=18&q ...
- 【Filament】基于物理的光照(PBR)
1 前言 自定义Blinn Phong光照模型中实现了基础的自定义光照,与现实的光照还是有些差别,本文将实现更逼真的光照效果,即基于物理的光照(PBR). 读者如果对 Filament 不太熟 ...
- 从华为WeAutomate数字机器人论坛,看政企领域的“政务新智理”
从华为WeAutomate数字机器人论坛,看政企领域的"政务新智理" 从政务治理到"政务新智理",华为WeAutomate在政务领域的思考与实践 华为WeAut ...
- linux下查看文件时显示行号
1.用 vi 或 vim 打开文件后显示行号: 显示当前行号: :nu 显示所有行号: :set nu 2.设置服务器显示行号 2.1:编辑~/.vimrc文件,在该文件中加入 ...
- RabbitMq 在centos中开机自启动
1.在/etc/init.d 目录下新建一个 rabbitmq [root@localhost init.d]# vi rabbitmq 文件内容 #!/bin/bash #chkconfig:234 ...
- Zabbix6.0使用教程 (四)—zabbix6.0从源代码安装
接上篇zabbix部署安装前置要求,本期我们将先讲讲如何从源代码安装zabbix6.0,还在为如何安装使用zabbix的小伙伴可以仔细看看. 一. 安装Zabbix守护进程 1 下载源代码压缩包 前往 ...
- 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \
为什么 摆脱鼠标系列 - vscode 花括号 开始结束 间的跳转 Ctrl + Shift + \ 快速移动到下一个 注意有时候输入法会有问题 因为 Ctrl + Shift 是切换输入法,所以回头 ...