Nginx服务器实际项目应用
2020-04-02 19:11
1186 查看
[TOC]
1. Nginx介绍及安装
1.1 官网下载
下面教程使用的版本是:nginx-1.14.2.zip
1.2 在线安装
1.2.1 基础环境
nginx是C语言开发,建议在linux上运行,本教程使用Centos6.4作为安装环境。安装redis需要先将官网下载的源码进行编译,编译依赖gcc、PCRE、zlib、openssl环境。
yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
1.2.2 进行安装
01解压源码
02进入解压后的目录
03参数设置,安装到指定目录
04编译安装
tar -zxvf nginx-1.11.13.tar.gzcd /usr/local/nginx-1.11.13./configure --prefix=/usr/local/nginx --with-streammake && make install
1.2.3 nginx.conf
- HTTP服务反向代理
# 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;}# 配置了tcp负载均衡和udp(dns)负载均衡的例子stream {include ../server/stream/*.conf;}# HTTP服务代理(负载均衡、反向代理)http {include ../server/http/*.conf;include mime.types;default_type application/octet-stream;sendfile on;# keepalive_timeout 0;keepalive_timeout 65;}
- HTTPS配置
# 开启缓存proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m;# 通过http访问httpsserver {listen 80 default_server;listen [::]:80 default_server;server_name test.com;return 302 https://$server_name$request_uri;}# 配置https和反向代理server {# https的默认端口是443listen 443;server_name test.com;# 公钥私钥生成命令(生成的证书会提示不安全):openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cert.pemssl on;ssl_certificate_key ../certs/localhost-privkey.pem;ssl_certificate ../certs/localhost-cert.pem;location / {proxy_cache my_cache;proxy_pass http://127.0.0.1:8888;proxy_set_header Host $host;}}# http2配置(chrome://net-internals中可以查看http2;https://http2.akamai.com/demo/http2-lab.html可以比较性能)server {listen 443 http2;server_name test.com;http2_push_preload on;ssl on;ssl_certificate_key ../certs/localhost-privkey.pem;ssl_certificate ../certs/localhost-cert.pem;location / {proxy_cache my_cache;proxy_pass http://127.0.0.1:8888;proxy_set_header Host $host;}}
- server节点配置
server {listen 8081;# 前台页面location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|ttf)$ {root /home/www/;index index.html login.html;}# 后台服务(URL中是否包含有URI,包含/是替换,不包含/是追加)location /isp/ {proxy_pass http://10.237.16.21:7122/;}}
- stream节点配置
server {listen 8082;proxy_pass unix:/tmp/stream.socket;}
- Upstream节点配置
# 方式一upstream proxy_server01 {server 192.168.1.1:8001;server 192.168.1.2:8001;server 192.168.1.3:8001;server 192.168.1.4:8001;}# 方式二upstream proxy_server02 {server http://192.168.1.1:8001/;server http://192.168.1.2:8001/;server http://192.168.1.3:8001/;server http://192.168.1.4:8001/;}http {server {listen 80;server_name aaa.com;location / {proxy_pass http://proxy_server01;}}server {listen 81;server_name bbb.com;location /server/ {proxy_pass proxy_server02;}}}
- root和alias区别
一般情况下,在location /中配置root,在location /other中配置alias是一个好习惯。
location /c/ {alias /a/}注:如果访问站点http://location/c访问的就是/a/目录下的站点信息,末尾必须加“/”。location /c/ {root /a/}注:如果访问站点http://location/c访问的就是/a/c目录下的站点信息,末尾“/”加不加无所谓。
1.3 离线安装
把安装包解压到服务器上,先安装gcc,再安装g++。分别执行两个文件夹下的install.sh。
一般我们都需要先装pcre,zlib,前者用于url rewrite,后者用于gzip压缩,openssl用于后续可能升级到https时使用。
1.3.1 pcre安装
tar -zxvf pcre-8.42.tar.gzcd pcre-8.42/./configuremake && make install
1.3.2 zlib安装
1.3.3 openssl安装
tar -zxvf openssl-1.1.0h.tar.gzcd openssl-1.1.0h/./configmake && make install
1.3.4 nginx安装
tar -zxvf nginx-1.14.0.tar.gzcd nginx-1.14.0/./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre=../pcre-8.42 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.1.0hmake && make install
1.4 启动使用
直接运行bin/redis-server将以前端模式启动,前端模式启动的缺点是ssh命令窗口关闭则redis-server程序结束,不推荐使用此方法。
1.4.1 基本命令
进入安装目录,不是源码目录:/usr/local/nginx检查配置文件:./nginx -t首次启动:./nginx -c conf/nginx.conf停止:./nginx -s stop从新加载配置:./nginx -s reload
1.4.2 开机启动
# Nginx服务开机启动nginx.service[Unit]Description=nginx - high performance web serverAfter=network.target remote-fs.target nss-lookup.target[Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s stop
2. 业务使用
2.1 动静分离部署
2.1.1 前台页面配置
var baseUrl = "192.168.100.12:11601";
注意:此处是配置Nginx的地址,不是后台部署服务的地址。
2.1.2 Nginx配置
- 全局总配置文件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;sendfile on;keepalive_timeout 65;include ../server/file/*.conf;include ../server/http/*.conf;}
- 动静分离配置,在/usr/local/nginx/server/http目录下配置文件test.conf,名字随意,根据业务自行修改。
server {listen 8999;# 前台页面location ~* \.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|woff|ttf)$ {root /home/kaifa/test/;index index.html login.html;}# 后台服务(URL中是否包含有URI,包含/是替换,不包含是追加)location /test/ {proxy_pass http://192.168.100.12:11601/;# nginx默认文件上传是2Mclient_max_body_size 50m;}}
2.2 Nginx文件上传
可以直接使用spring boot中自带的静态资源访问文件。
2.2.1 Java后台配置
- 例如上传图片文件,在spring boot项目中的application.yml配置路径。
image:imgUrl: http://192.168.100.12:8000/imgPath: /home/kaifa/resource/
- 提倡配置使用@ConfigurationProperties管理配置
// TODO 待完善,下面代码还使用@Value形式。
- 文件上传工具类(涉及代码较多,仅列举核心代码)
/*** project -** @author guod* @version 1.0* @date 日期:2018/8/7 时间:17:46* @JDK 1.8* @Description 功能模块:文件上传功能*/@RestController@RequestMapping(value = "/file")public class FileUploadUtils {private Logger logger = LoggerFactory.getLogger(getClass());@Value("${image.imgUrl}")private String imgUrl;@Value("${image.imgPath}")private String imgPath;/*** 功能描述:提取上传方法为公共方法** @param uploadDir 上传文件目录* @param file 上传对象* @throws Exception*/private String executeUpload(String uploadDir, MultipartFile file) throws Exception {//文件后缀名String suffix = file.getOriginalFilename().substring(Objects.requireNonNull(file.getOriginalFilename()).lastIndexOf("."));//上传文件名String filename = UUID.randomUUID() + suffix;//服务器端保存的文件对象File serverFile = new File(uploadDir + filename);// 将上传的文件写入到服务器端文件内// file.transferTo(serverFile);FileUtils.copyInputStreamToFile(file.getInputStream(), serverFile);// 返回用户回显路径String returnFile = uploadDir + filename;logger.info("服务器图片地址:[{}]", serverFile);return returnFile;}/*** 功能描述:上传单个文件方法(多文件上传此处不再列举)** @param file 前台上传的文件对象(注解请求头信息:enctype=multipart/form-data)* @return*/@PostMapping(value = "/upload")public Json upload(HttpServletRequest request, MultipartFile file) {String returnImage = null;try {String format = new SimpleDateFormat("yyyy/MM/dd/").format(new Date());String uploadDir = imgPath + format + "upload/";logger.info("传的路径[{}]", uploadDir);//如果目录不存在,自动创建文件夹File dir = new File(uploadDir);if (!dir.exists()) {boolean mkdirs = dir.mkdirs();}//调用上传方法returnImage = executeUpload(uploadDir, file);} catch (Exception e) {//打印错误堆栈信息e.printStackTrace();return ResultUtils.errorJson("-200", "上传失败!");}return ResultUtils.successJson(returnImage);}/*** 功能描述:显示图片接口** @param response* @throws Exception*/@RequestMapping(value = "/image", method = RequestMethod.GET)public void imageDisplay(HttpServletResponse response) throws Exception {// 文件业务逻辑自行处理,替换下面File file = new File("/home/kaifa/resource/2019/02/18/upload/9a9bf096-ab71- 48b3-93fd-b68f3ce255d6.png");// 进行文件下载的指定,设置强制下载不打开OutputStream outputStream = response.getOutputStream();// 设置显示图片response.setContentType("image/jpeg");// 设置缓存response.setHeader("Cache-Control", "max-age=604800");// outputStream写入到输出流outputStream.write(FileCopyUtils.copyToByteArray(file));outputStream.flush();outputStream.close();}/*** 功能描述:下载文件** @param response* @throws IOException*/@RequestMapping(value = "/downloadFile")public void downloadFile(HttpServletResponse response) throws IOException {// 文件业务逻辑自行处理,替换下面File file = new File("/home/kaifa/resource/2019/02/18/upload/9a9bf096-ab71- 48b3-93fd-b68f3ce255d6.png");OutputStream outputStream = response.getOutputStream();// 进行文件下载的指定response.setContentType("application/x-download");response.setCharacterEncoding("utf-8");response.setHeader("Content-Disposition", "attachment;filename=" + new String(("下载名称").getBytes("gbk"), "iso8859-1") + ".xls");// outputStream写入到输出流outputStream.write(FileCopyUtils.copyToByteArray(file));outputStream.flush();outputStream.close();}/*** 功能描述:直接返回文件流(简略书写,根据业务进行修改)** @param path* @return* @throws Exception*/@RequestMapping(value = "/showFile")public ResponseEntity<byte[]> showFile(@RequestParam("path") String path)throws Exception {if (StringUtils.isEmpty(path)) {return null;}String filepath = path;URL url = new URL(filepath);ResponseEntity r;try {byte[] bytes1 = IOUtils.toByteArray(url.openConnection().getInputStream());MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();headers.add("Content-Disposition", "attachment;filename=" + URLEncoder.encode(org.springframework.util.StringUtils.getFilename(filepath), "utf-8"));r = new ResponseEntity(bytes1, headers, HttpStatus.OK);return r;} catch (Exception e) {e.printStackTrace();}return null;}}
2.2.2 Nginx配置
- 在/usr/local/nginx/server/file目录下配置文件file.conf,名字随意,下面配置根据业务自行修改。
server {listen 8000;location / {root /home/kaifa/resource/;}}
下次分享:Nginx+Keepalived 实现主备切换
- 点赞
- 收藏
- 分享
- 文章举报
相关文章推荐
- 当几个应用访问nginx服务器,而这几个应用与nginx不在同一个域名的时候,可能出现跨域问题
- nginx服务器应用中遇到的两个问题
- ActiveMQ在实际项目中的应用
- 高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景
- 递归算法在实际项目中的应用
- 我的架构之路 — 配置中心(二)— 在已有项目中实际应用
- 菜鸟-手把手教你把Acegi应用到实际项目中(2)
- (7)java5线程并发库的应用(线程池) 以及在实际项目中的使用。。
- 常见算法在实际项目中的应用
- 09(maven+SSH)网上商城项目实战之使用jersey实现应用服务器和图片服务器分离
- 菜鸟-手把手教你把Acegi应用到实际项目中(2)
- 北斗网络时钟服务器(北斗卫星授时器-北斗网络校时服务器)在高速公路项目中的应用
- 关于OC中消息转发机制的理解以及在项目中的实际应用
- 菜鸟-手把手教你把Acegi应用到实际项目中(5)
- Nginx作为反向代理服务器,多个不同项目共用80端口(转载)
- Redis在Php项目中的实际应用场景
- 011商城项目:图片服务器的安装---nginx
- 使用Jenkins持续集成前端项目并自动化部署到Nginx服务器
- log4j 日志服务器_项目实际使用日记
- SVN和Git的比较,已经项目中的实际应用!