From 750a53ba2a81366ab27086f5672828985e6772cd Mon Sep 17 00:00:00 2001 From: wanggang <76527413@qq.com> Date: Fri, 8 May 2020 15:15:37 +0800 Subject: [PATCH] 1.0.0.508 Former-commit-id: 3ad3c5f8cac82ebd6fde6c6fc16e9850c9c69e5c --- labs/SpringDataJPATest/.gitignore | 30 +++ labs/SpringDataJPATest/build.gradle | 25 +++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58695 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + labs/SpringDataJPATest/gradlew | 183 ++++++++++++++++ labs/SpringDataJPATest/gradlew.bat | 100 +++++++++ labs/SpringDataJPATest/settings.gradle | 2 + .../src/main/java/com/nbaxp/Application.java | 13 ++ .../com/nbaxp/Controllers/HomeController.java | 23 ++ .../java/com/nbaxp/Entities/BaseEntity.java | 24 +++ .../main/java/com/nbaxp/Entities/Role.java | 31 +++ .../main/java/com/nbaxp/Entities/User.java | 43 ++++ .../java/com/nbaxp/Entities/UserRole.java | 38 ++++ .../nbaxp/Repositories/UserRepository.java | 8 + .../java/com/nbaxp/Services/UserService.java | 35 +++ .../application-development.properties | 4 + .../src/main/resources/application.properties | 2 + labs/WebApp/WebApp.sln | 25 +++ labs/WebApp/wwwroot/index.html | 7 +- labs/WebApp/wwwroot/js/app.js | 4 +- labs/WebApp/wwwroot/js/config.js | 2 + labs/WebApp/wwwroot/js/message.js | 2 +- labs/WebApp/wwwroot/js/util.js | 4 +- labs/WebApp/wwwroot/pages/home.js | 2 +- labs/WebApp/wwwroot/pages/iot/device.js | 4 +- labs/WebApp/wwwroot/pages/iot/node.js | 2 +- labs/WebApp/wwwroot/pages/iot/nodes.js | 2 +- labs/WebApp/wwwroot/pages/iot/product.js | 2 +- labs/WebApp/wwwroot/pages/iot/products.js | 2 +- labs/WebApp/wwwroot/pages/iot/scenes.js | 2 +- labs/WebApp/wwwroot/pages/login.js | 2 +- projects/Infrastructure/Infrastructure.csproj | 8 +- projects/Infrastructure/Web/BaseStartup.cs | 7 +- .../Infrastructure/Web/JwtTokenValidator.cs | 23 +- projects/JobServer/JobServer.csproj | 4 +- projects/UserCenter/UserCenter.csproj | 2 - .../UserCenter/appsettings.Development.json | 4 +- projects/Version.cs | 2 +- .../{nginx-1.16.0 => nginx-1.18.0}/.gitignore | 0 .../conf/edusoa.key | 0 .../conf/edusoa.pem | 0 .../conf/fastcgi.conf | 0 .../conf/fastcgi_params | 0 .../conf/koi-utf | 0 .../conf/koi-win | 0 .../conf/mime.types | 0 .../conf/nginx.conf | 0 tools/nginx-1.18.0/conf/nginx.conf.bk | 117 ++++++++++ .../conf/scgi_params | 0 .../conf/uwsgi_params | 0 .../conf/win-utf | 0 .../contrib/README | 0 .../contrib/geo2nginx.pl | 0 .../contrib/unicode2nginx/koi-utf | 0 .../contrib/unicode2nginx/unicode-to-nginx.pl | 0 .../contrib/unicode2nginx/win-utf | 0 .../contrib/vim/ftdetect/nginx.vim | 0 .../contrib/vim/ftplugin/nginx.vim | 0 .../contrib/vim/indent/nginx.vim | 0 .../contrib/vim/syntax/nginx.vim | 5 + .../docs/CHANGES | 194 ++++++++++++++++- .../docs/CHANGES.ru | 199 +++++++++++++++++- .../docs/LICENSE | 0 .../docs/OpenSSL.LICENSE | 0 .../docs/PCRE.LICENCE | 6 +- .../docs/README | 0 .../docs/zlib.LICENSE | 0 .../html/50x.html | 0 .../html/index.html | 0 .../{nginx-1.16.0 => nginx-1.18.0}/nginx.exe | Bin 3691520 -> 3716608 bytes 70 files changed, 1153 insertions(+), 47 deletions(-) create mode 100644 labs/SpringDataJPATest/.gitignore create mode 100644 labs/SpringDataJPATest/build.gradle create mode 100644 labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.jar create mode 100644 labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties create mode 100644 labs/SpringDataJPATest/gradlew create mode 100644 labs/SpringDataJPATest/gradlew.bat create mode 100644 labs/SpringDataJPATest/settings.gradle create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java create mode 100644 labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java create mode 100644 labs/SpringDataJPATest/src/main/resources/application-development.properties create mode 100644 labs/SpringDataJPATest/src/main/resources/application.properties create mode 100644 labs/WebApp/WebApp.sln create mode 100644 labs/WebApp/wwwroot/js/config.js rename tools/{nginx-1.16.0 => nginx-1.18.0}/.gitignore (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/edusoa.key (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/edusoa.pem (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/fastcgi.conf (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/fastcgi_params (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/koi-utf (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/koi-win (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/mime.types (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/nginx.conf (100%) create mode 100644 tools/nginx-1.18.0/conf/nginx.conf.bk rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/scgi_params (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/uwsgi_params (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/conf/win-utf (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/README (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/geo2nginx.pl (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/unicode2nginx/koi-utf (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/unicode2nginx/unicode-to-nginx.pl (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/unicode2nginx/win-utf (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/vim/ftdetect/nginx.vim (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/vim/ftplugin/nginx.vim (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/vim/indent/nginx.vim (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/contrib/vim/syntax/nginx.vim (99%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/CHANGES (97%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/CHANGES.ru (97%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/LICENSE (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/OpenSSL.LICENSE (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/PCRE.LICENCE (96%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/README (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/docs/zlib.LICENSE (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/html/50x.html (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/html/index.html (100%) rename tools/{nginx-1.16.0 => nginx-1.18.0}/nginx.exe (54%) diff --git a/labs/SpringDataJPATest/.gitignore b/labs/SpringDataJPATest/.gitignore new file mode 100644 index 00000000..0d82a354 --- /dev/null +++ b/labs/SpringDataJPATest/.gitignore @@ -0,0 +1,30 @@ +# Operating System Files + +*.DS_Store +Thumbs.db + +# Build Files # + +bin +target +build/ +.gradle + +# Eclipse Project Files # + +.classpath +.project +.settings + +# IntelliJ IDEA Files # + +*.iml +*.ipr +*.iws +*.idea + +# Spring Bootstrap artifacts + +dependency-reduced-pom.xml +out +README.html \ No newline at end of file diff --git a/labs/SpringDataJPATest/build.gradle b/labs/SpringDataJPATest/build.gradle new file mode 100644 index 00000000..5265aafe --- /dev/null +++ b/labs/SpringDataJPATest/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'org.springframework.boot' version '2.2.2.RELEASE' + id 'io.spring.dependency-management' version '1.0.8.RELEASE' + id 'java' +} + +group 'com.nbaxp' +version '1.0-SNAPSHOT' + +repositories { + maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'} +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-data-rest' + runtimeOnly 'com.h2database:h2' + testImplementation('org.springframework.boot:spring-boot-starter-test') { + exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' + } +} + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.jar b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f3d88b1c2faf2fc91d853cd5d4242b5547257070 GIT binary patch literal 58695 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 literal 0 HcmV?d00001 diff --git a/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..608f95c6 --- /dev/null +++ b/labs/SpringDataJPATest/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Thu May 07 11:59:56 CST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/labs/SpringDataJPATest/gradlew b/labs/SpringDataJPATest/gradlew new file mode 100644 index 00000000..2fe81a7d --- /dev/null +++ b/labs/SpringDataJPATest/gradlew @@ -0,0 +1,183 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/labs/SpringDataJPATest/gradlew.bat b/labs/SpringDataJPATest/gradlew.bat new file mode 100644 index 00000000..9618d8d9 --- /dev/null +++ b/labs/SpringDataJPATest/gradlew.bat @@ -0,0 +1,100 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/labs/SpringDataJPATest/settings.gradle b/labs/SpringDataJPATest/settings.gradle new file mode 100644 index 00000000..a606194f --- /dev/null +++ b/labs/SpringDataJPATest/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'SpringDataJPATest' + diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java new file mode 100644 index 00000000..8c66072c --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Application.java @@ -0,0 +1,13 @@ +package com.nbaxp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} \ No newline at end of file diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java new file mode 100644 index 00000000..41979123 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Controllers/HomeController.java @@ -0,0 +1,23 @@ +package com.nbaxp.Controllers; + +import com.nbaxp.Entities.User; +import com.nbaxp.Services.UserService; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HomeController { + private final UserService userService; + + public HomeController(UserService userService) + { + this.userService=userService; + } + + @RequestMapping("/") + public Page index() + { + return this.userService.Query(); + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java new file mode 100644 index 00000000..2944a624 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/BaseEntity.java @@ -0,0 +1,24 @@ +package com.nbaxp.Entities; + +import javax.persistence.Id; +import javax.persistence.MappedSuperclass; +import java.util.UUID; + +@MappedSuperclass +public abstract class BaseEntity { + @Id + private String id; + + public BaseEntity() + { + this.id= UUID.randomUUID().toString(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java new file mode 100644 index 00000000..ed2c48b3 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/Role.java @@ -0,0 +1,31 @@ +package com.nbaxp.Entities; + +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import java.util.HashSet; +import java.util.Set; + +@Entity +public class Role extends BaseEntity { + + private String name; + + @OneToMany(mappedBy = "role") + private Set userRoles= new HashSet<>(); + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Set getUserRoles() { + return userRoles; + } + + public void setUserRoles(Set userRoles) { + this.userRoles = userRoles; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java new file mode 100644 index 00000000..49d24cb0 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/User.java @@ -0,0 +1,43 @@ +package com.nbaxp.Entities; + +import javax.persistence.Entity; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import javax.persistence.UniqueConstraint; +import java.util.HashSet; +import java.util.Set; + +@Table(uniqueConstraints = {@UniqueConstraint(columnNames = "userName"),@UniqueConstraint(columnNames = "email")}) +@Entity +public class User extends BaseEntity { + + private String userName; + private String email; + + @OneToMany(mappedBy = "user") + private Set userRoles= new HashSet<>(); + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Set getUserRoles() { + return userRoles; + } + + public void setUserRoles(Set userRoles) { + this.userRoles = userRoles; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java new file mode 100644 index 00000000..c985b761 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Entities/UserRole.java @@ -0,0 +1,38 @@ +package com.nbaxp.Entities; + +import javax.persistence.*; + +@Table(uniqueConstraints = {@UniqueConstraint(columnNames={"UserId", "RoleId"})}) +@Entity +public class UserRole extends BaseEntity { + + @Column(name = "UserId",nullable = false,updatable = false, insertable = false) + private String userId; + + @JoinColumn(name="UserId") + @ManyToOne + private User user; + + @Column(name="RoleId",nullable = false, updatable = false, insertable = false) + private String roleId; + + @JoinColumn(name="RoleId") + @ManyToOne + private Role role; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getRoleId() { + return roleId; + } + + public void setRoleId(String roleId) { + this.roleId = roleId; + } +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java new file mode 100644 index 00000000..1393dd5c --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Repositories/UserRepository.java @@ -0,0 +1,8 @@ +package com.nbaxp.Repositories; + +import com.nbaxp.Entities.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface UserRepository extends JpaRepository,JpaSpecificationExecutor { +} diff --git a/labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java new file mode 100644 index 00000000..7b0d3d33 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/java/com/nbaxp/Services/UserService.java @@ -0,0 +1,35 @@ +package com.nbaxp.Services; + +import com.nbaxp.Entities.User; +import com.nbaxp.Repositories.UserRepository; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class UserService { + private final UserRepository userRepository; + + public UserService(UserRepository userRepository) + { + this.userRepository=userRepository; + } + + public Page Query() + { + User user = new User(); + user.setUserName("user"+ UUID.randomUUID().toString()); + user.setEmail("test@test.com"+ UUID.randomUUID().toString()); + this.userRepository.save(user); + List users= this.userRepository.findAll(); + Pageable pageRequest = PageRequest.of(0,10,Sort.by(Sort.Order.asc("id"))); + return this.userRepository.findAll((root, query, builder) -> { + return query.getRestriction(); + },pageRequest); + } +} diff --git a/labs/SpringDataJPATest/src/main/resources/application-development.properties b/labs/SpringDataJPATest/src/main/resources/application-development.properties new file mode 100644 index 00000000..39139478 --- /dev/null +++ b/labs/SpringDataJPATest/src/main/resources/application-development.properties @@ -0,0 +1,4 @@ +spring.jpa.hibernate.ddl-auto=create +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.format_sql=true +logging.level.org.hibernate.type.descriptor.sql.BasicBinder=trace \ No newline at end of file diff --git a/labs/SpringDataJPATest/src/main/resources/application.properties b/labs/SpringDataJPATest/src/main/resources/application.properties new file mode 100644 index 00000000..1765f5cb --- /dev/null +++ b/labs/SpringDataJPATest/src/main/resources/application.properties @@ -0,0 +1,2 @@ +server.port=5050 +spring.profiles.active=development \ No newline at end of file diff --git a/labs/WebApp/WebApp.sln b/labs/WebApp/WebApp.sln new file mode 100644 index 00000000..02dd3191 --- /dev/null +++ b/labs/WebApp/WebApp.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebApp", "WebApp.csproj", "{8763E5C0-790B-4A1D-A9CF-79A02118C559}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8763E5C0-790B-4A1D-A9CF-79A02118C559}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C9A67CB0-9D7E-40DA-B40E-7D53863BB159} + EndGlobalSection +EndGlobal diff --git a/labs/WebApp/wwwroot/index.html b/labs/WebApp/wwwroot/index.html index f1f37215..4425c86b 100644 --- a/labs/WebApp/wwwroot/index.html +++ b/labs/WebApp/wwwroot/index.html @@ -1,4 +1,4 @@ - + @@ -8,7 +8,7 @@ - ¿ªÊ¼ + home

@@ -33,6 +33,7 @@ + diff --git a/labs/WebApp/wwwroot/js/app.js b/labs/WebApp/wwwroot/js/app.js index c1bd6b2c..70f2ebb2 100644 --- a/labs/WebApp/wwwroot/js/app.js +++ b/labs/WebApp/wwwroot/js/app.js @@ -1,4 +1,4 @@ -var userAgent = navigator.userAgent; +var userAgent = navigator.userAgent; var isApp = userAgent.indexOf('isapp') !== -1; //axios axios.interceptors.request.use( @@ -30,7 +30,7 @@ axios.interceptors.response.use(function (response) { console.log('拦截到返回错误:'); console.log(error.response); if (error.response.status === 401 && error.config.url.indexOf('refreshToken') === -1) { - var url = '/UserCenter/api/v1/token/refreshToken'; + var url = apiHost+'/UserCenter/api/v1/token/refreshToken'; var data = '"' + store.state.refreshToken + '"'; return axios.post(url, data, { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) .then(function (response) { diff --git a/labs/WebApp/wwwroot/js/config.js b/labs/WebApp/wwwroot/js/config.js new file mode 100644 index 00000000..f6f5835b --- /dev/null +++ b/labs/WebApp/wwwroot/js/config.js @@ -0,0 +1,2 @@ +//var apiHost = "http://localhost"; +var apiHost = "http://iot.edusoa.com"; diff --git a/labs/WebApp/wwwroot/js/message.js b/labs/WebApp/wwwroot/js/message.js index 8b06a88b..2db4c5a8 100644 --- a/labs/WebApp/wwwroot/js/message.js +++ b/labs/WebApp/wwwroot/js/message.js @@ -1,4 +1,4 @@ -var hubUrl = "/IoTCenter/hub?group=page"; +var hubUrl = apiHost + "/IoTCenter/hub?group=page"; var connection = new signalR.HubConnectionBuilder().withUrl(hubUrl).build(); var connectionId; function connect() { diff --git a/labs/WebApp/wwwroot/js/util.js b/labs/WebApp/wwwroot/js/util.js index c4d8662d..6ba18982 100644 --- a/labs/WebApp/wwwroot/js/util.js +++ b/labs/WebApp/wwwroot/js/util.js @@ -50,7 +50,7 @@ function copy(from, to) { function execApi(number, method, query) { var loading = weui.loading('æäº¤ä¸­...'); - axios.post('/IoTCenter/api/v1/api/execApi', { connectionId,number,method, query }) + axios.post(apiHost + '/IoTCenter/api/v1/api/execApi', { connectionId,number,method, query }) .then(function (response) { console.log(response); }) @@ -64,7 +64,7 @@ function execApi(number, method, query) { function execScene(id) { var loading = weui.loading('æäº¤ä¸­...'); - axios.post('/IoTCenter/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) + axios.post(apiHost + '/IoTCenter/api/v1/api/execScene', '"' + id + '"', { headers: { 'Content-Type': 'application/json;charset=UTF-8' } }) .then(function (response) { console.log(response); }) diff --git a/labs/WebApp/wwwroot/pages/home.js b/labs/WebApp/wwwroot/pages/home.js index 9dbfdbd3..341383a3 100644 --- a/labs/WebApp/wwwroot/pages/home.js +++ b/labs/WebApp/wwwroot/pages/home.js @@ -6,7 +6,7 @@ data() { return { title:'首页', - url: '/UserCenter/api/v1/user/getUserInfo' + url: apiHost + '/UserCenter/api/v1/user/getUserInfo' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/device.js b/labs/WebApp/wwwroot/pages/iot/device.js index 6f9baf39..2d126331 100644 --- a/labs/WebApp/wwwroot/pages/iot/device.js +++ b/labs/WebApp/wwwroot/pages/iot/device.js @@ -5,7 +5,7 @@ template: response.data, data() { return { - url: '/IoTCenter/api/v1/device/getDevice?number=' + this.$route.query.number + url: apiHost + '/IoTCenter/api/v1/device/getDevice?number=' + this.$route.query.number }; }, mounted: function () { @@ -39,7 +39,7 @@ }, changeTime: function (key, time,title) { var vm = this; - var url = '/IoTCenter/api/v1/Device/GetChartData'; + var url = apiHost + '/IoTCenter/api/v1/Device/GetChartData'; var data = { number:this.device.number, key: key, diff --git a/labs/WebApp/wwwroot/pages/iot/node.js b/labs/WebApp/wwwroot/pages/iot/node.js index a60c6ece..1d8088b0 100644 --- a/labs/WebApp/wwwroot/pages/iot/node.js +++ b/labs/WebApp/wwwroot/pages/iot/node.js @@ -5,7 +5,7 @@ template: response.data, data() { return { - url: '/IoTCenter/api/v1/node/getNode?number=' + this.$route.query.number + url: apiHost + '/IoTCenter/api/v1/node/getNode?number=' + this.$route.query.number }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/nodes.js b/labs/WebApp/wwwroot/pages/iot/nodes.js index f8e2a841..aba7cc8a 100644 --- a/labs/WebApp/wwwroot/pages/iot/nodes.js +++ b/labs/WebApp/wwwroot/pages/iot/nodes.js @@ -6,7 +6,7 @@ data() { return { name: '智慧教室', - url: '/IoTCenter/api/v1/node/getNodes' + url: apiHost + '/IoTCenter/api/v1/node/getNodes' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/product.js b/labs/WebApp/wwwroot/pages/iot/product.js index aed1f6b5..241b7c3e 100644 --- a/labs/WebApp/wwwroot/pages/iot/product.js +++ b/labs/WebApp/wwwroot/pages/iot/product.js @@ -5,7 +5,7 @@ template: response.data, data() { return { - url: '/IoTCenter/api/v1/product/getProduct?number=' + this.$route.query.number + url: apiHost + '/IoTCenter/api/v1/product/getProduct?number=' + this.$route.query.number }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/products.js b/labs/WebApp/wwwroot/pages/iot/products.js index bba4bfcd..eecd8d4d 100644 --- a/labs/WebApp/wwwroot/pages/iot/products.js +++ b/labs/WebApp/wwwroot/pages/iot/products.js @@ -6,7 +6,7 @@ data() { return { title: "产å“", - url: '/IoTCenter/api/v1/product/getProducts' + url: apiHost + '/IoTCenter/api/v1/product/getProducts' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/iot/scenes.js b/labs/WebApp/wwwroot/pages/iot/scenes.js index 8ffc821a..9dbc2e95 100644 --- a/labs/WebApp/wwwroot/pages/iot/scenes.js +++ b/labs/WebApp/wwwroot/pages/iot/scenes.js @@ -6,7 +6,7 @@ data() { return { title: "场景", - url: '/IoTCenter/api/v1/Scene/GetScenes' + url: apiHost + '/IoTCenter/api/v1/Scene/GetScenes' }; }, mounted: function () { diff --git a/labs/WebApp/wwwroot/pages/login.js b/labs/WebApp/wwwroot/pages/login.js index 67f7e7c7..1978b712 100644 --- a/labs/WebApp/wwwroot/pages/login.js +++ b/labs/WebApp/wwwroot/pages/login.js @@ -6,7 +6,7 @@ data() { return { title: '登录', - url: '/UserCenter/api/v1/token/getToken' + url: apiHost + '/UserCenter/api/v1/token/getToken' }; }, mounted: function () { diff --git a/projects/Infrastructure/Infrastructure.csproj b/projects/Infrastructure/Infrastructure.csproj index 20cb20a9..f5e202e9 100644 --- a/projects/Infrastructure/Infrastructure.csproj +++ b/projects/Infrastructure/Infrastructure.csproj @@ -11,7 +11,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -40,14 +40,14 @@ - - + + - +   diff --git a/projects/Infrastructure/Web/BaseStartup.cs b/projects/Infrastructure/Web/BaseStartup.cs index a98c7867..431925bb 100644 --- a/projects/Infrastructure/Web/BaseStartup.cs +++ b/projects/Infrastructure/Web/BaseStartup.cs @@ -264,7 +264,7 @@ namespace Infrastructure.Web { if (DateTime.UtcNow > context.SecurityToken.ValidTo) { - context.Fail(""); + context.Fail("token time out"); } return Task.CompletedTask; }, @@ -335,11 +335,6 @@ namespace Infrastructure.Web { app.UseDeveloperExceptionPage(); } - else - { - app.UseExceptionHandler("/Error"); - app.UseStatusCodePagesWithReExecute("/Error"); - } string basePath = this.Configuration.GetValue("BasePath", $"/{Assembly.GetEntryAssembly().GetName().Name}"); app.UsePathBase(basePath); app.UseForwardedHeaders(new ForwardedHeadersOptions diff --git a/projects/Infrastructure/Web/JwtTokenValidator.cs b/projects/Infrastructure/Web/JwtTokenValidator.cs index 2cca6408..7e03a84c 100644 --- a/projects/Infrastructure/Web/JwtTokenValidator.cs +++ b/projects/Infrastructure/Web/JwtTokenValidator.cs @@ -25,13 +25,22 @@ namespace Infrastructure.Web public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken) { - validatedToken = new JwtSecurityTokenHandler().ReadJwtToken(securityToken); - var claims = (validatedToken as JwtSecurityToken).Claims.ToList(); - var userName = claims.FirstOrDefault(o => o.Type == ClaimTypes.Name).Value; - using var scope = this._serviceProvider.CreateScope(); - var roles = scope.ServiceProvider.GetService().GetRoles(userName).Select(o => new Claim(ClaimTypes.Role, o)); - claims.AddRange(roles); - return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme)); + try + { + validatedToken = new JwtSecurityTokenHandler().ReadJwtToken(securityToken); + var claims = (validatedToken as JwtSecurityToken).Claims.ToList(); + var userName = claims.FirstOrDefault(o => o.Type == ClaimTypes.Name).Value; + using var scope = this._serviceProvider.CreateScope(); + var roles = scope.ServiceProvider.GetService().GetRoles(userName).Select(o => new Claim(ClaimTypes.Role, o)); + claims.AddRange(roles); + return new ClaimsPrincipal(new ClaimsIdentity(claims, JwtBearerDefaults.AuthenticationScheme)); + } + catch (Exception ex) + { + validatedToken = null; + Console.WriteLine(ex.ToString()); + } + return null; } } } \ No newline at end of file diff --git a/projects/JobServer/JobServer.csproj b/projects/JobServer/JobServer.csproj index 8f81faef..39c84903 100644 --- a/projects/JobServer/JobServer.csproj +++ b/projects/JobServer/JobServer.csproj @@ -21,7 +21,7 @@ - - + + \ No newline at end of file diff --git a/projects/UserCenter/UserCenter.csproj b/projects/UserCenter/UserCenter.csproj index 6944ace8..4cef0efd 100644 --- a/projects/UserCenter/UserCenter.csproj +++ b/projects/UserCenter/UserCenter.csproj @@ -12,8 +12,6 @@ - - diff --git a/projects/UserCenter/appsettings.Development.json b/projects/UserCenter/appsettings.Development.json index f0cd2eae..9f9ddd36 100644 --- a/projects/UserCenter/appsettings.Development.json +++ b/projects/UserCenter/appsettings.Development.json @@ -1,5 +1,7 @@ { "AppSettings": { "database": "sqlite" - } + }, + "AccessTokenHours": 0.05, + "RefreshToken": 0.1 } \ No newline at end of file diff --git a/projects/Version.cs b/projects/Version.cs index 161b7e56..c36231de 100644 --- a/projects/Version.cs +++ b/projects/Version.cs @@ -1,4 +1,4 @@ using System.Reflection; [assembly: AssemblyVersion("1.0.0.*")] -[assembly: AssemblyInformationalVersion("1.0.0.507-1")] \ No newline at end of file +[assembly: AssemblyInformationalVersion("1.0.0.508")] \ No newline at end of file diff --git a/tools/nginx-1.16.0/.gitignore b/tools/nginx-1.18.0/.gitignore similarity index 100% rename from tools/nginx-1.16.0/.gitignore rename to tools/nginx-1.18.0/.gitignore diff --git a/tools/nginx-1.16.0/conf/edusoa.key b/tools/nginx-1.18.0/conf/edusoa.key similarity index 100% rename from tools/nginx-1.16.0/conf/edusoa.key rename to tools/nginx-1.18.0/conf/edusoa.key diff --git a/tools/nginx-1.16.0/conf/edusoa.pem b/tools/nginx-1.18.0/conf/edusoa.pem similarity index 100% rename from tools/nginx-1.16.0/conf/edusoa.pem rename to tools/nginx-1.18.0/conf/edusoa.pem diff --git a/tools/nginx-1.16.0/conf/fastcgi.conf b/tools/nginx-1.18.0/conf/fastcgi.conf similarity index 100% rename from tools/nginx-1.16.0/conf/fastcgi.conf rename to tools/nginx-1.18.0/conf/fastcgi.conf diff --git a/tools/nginx-1.16.0/conf/fastcgi_params b/tools/nginx-1.18.0/conf/fastcgi_params similarity index 100% rename from tools/nginx-1.16.0/conf/fastcgi_params rename to tools/nginx-1.18.0/conf/fastcgi_params diff --git a/tools/nginx-1.16.0/conf/koi-utf b/tools/nginx-1.18.0/conf/koi-utf similarity index 100% rename from tools/nginx-1.16.0/conf/koi-utf rename to tools/nginx-1.18.0/conf/koi-utf diff --git a/tools/nginx-1.16.0/conf/koi-win b/tools/nginx-1.18.0/conf/koi-win similarity index 100% rename from tools/nginx-1.16.0/conf/koi-win rename to tools/nginx-1.18.0/conf/koi-win diff --git a/tools/nginx-1.16.0/conf/mime.types b/tools/nginx-1.18.0/conf/mime.types similarity index 100% rename from tools/nginx-1.16.0/conf/mime.types rename to tools/nginx-1.18.0/conf/mime.types diff --git a/tools/nginx-1.16.0/conf/nginx.conf b/tools/nginx-1.18.0/conf/nginx.conf similarity index 100% rename from tools/nginx-1.16.0/conf/nginx.conf rename to tools/nginx-1.18.0/conf/nginx.conf diff --git a/tools/nginx-1.18.0/conf/nginx.conf.bk b/tools/nginx-1.18.0/conf/nginx.conf.bk new file mode 100644 index 00000000..29bc085f --- /dev/null +++ b/tools/nginx-1.18.0/conf/nginx.conf.bk @@ -0,0 +1,117 @@ + +#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; + + #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 0; + keepalive_timeout 65; + + #gzip on; + + server { + listen 80; + server_name localhost; + + #charset koi8-r; + + #access_log logs/host.access.log main; + + location / { + root html; + index index.html index.htm; + } + + #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; + } + + # proxy the PHP scripts to Apache listening on 127.0.0.1:80 + # + #location ~ \.php$ { + # proxy_pass http://127.0.0.1; + #} + + # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 + # + #location ~ \.php$ { + # root html; + # fastcgi_pass 127.0.0.1:9000; + # fastcgi_index index.php; + # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; + # include fastcgi_params; + #} + + # deny access to .htaccess files, if Apache's document root + # concurs with nginx's one + # + #location ~ /\.ht { + # deny all; + #} + } + + + # another virtual host using mix of IP-, name-, and port-based configuration + # + #server { + # listen 8000; + # listen somename:8080; + # server_name somename alias another.alias; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + + + # HTTPS server + # + #server { + # listen 443 ssl; + # server_name localhost; + + # ssl_certificate cert.pem; + # ssl_certificate_key cert.key; + + # ssl_session_cache shared:SSL:1m; + # ssl_session_timeout 5m; + + # ssl_ciphers HIGH:!aNULL:!MD5; + # ssl_prefer_server_ciphers on; + + # location / { + # root html; + # index index.html index.htm; + # } + #} + +} diff --git a/tools/nginx-1.16.0/conf/scgi_params b/tools/nginx-1.18.0/conf/scgi_params similarity index 100% rename from tools/nginx-1.16.0/conf/scgi_params rename to tools/nginx-1.18.0/conf/scgi_params diff --git a/tools/nginx-1.16.0/conf/uwsgi_params b/tools/nginx-1.18.0/conf/uwsgi_params similarity index 100% rename from tools/nginx-1.16.0/conf/uwsgi_params rename to tools/nginx-1.18.0/conf/uwsgi_params diff --git a/tools/nginx-1.16.0/conf/win-utf b/tools/nginx-1.18.0/conf/win-utf similarity index 100% rename from tools/nginx-1.16.0/conf/win-utf rename to tools/nginx-1.18.0/conf/win-utf diff --git a/tools/nginx-1.16.0/contrib/README b/tools/nginx-1.18.0/contrib/README similarity index 100% rename from tools/nginx-1.16.0/contrib/README rename to tools/nginx-1.18.0/contrib/README diff --git a/tools/nginx-1.16.0/contrib/geo2nginx.pl b/tools/nginx-1.18.0/contrib/geo2nginx.pl similarity index 100% rename from tools/nginx-1.16.0/contrib/geo2nginx.pl rename to tools/nginx-1.18.0/contrib/geo2nginx.pl diff --git a/tools/nginx-1.16.0/contrib/unicode2nginx/koi-utf b/tools/nginx-1.18.0/contrib/unicode2nginx/koi-utf similarity index 100% rename from tools/nginx-1.16.0/contrib/unicode2nginx/koi-utf rename to tools/nginx-1.18.0/contrib/unicode2nginx/koi-utf diff --git a/tools/nginx-1.16.0/contrib/unicode2nginx/unicode-to-nginx.pl b/tools/nginx-1.18.0/contrib/unicode2nginx/unicode-to-nginx.pl similarity index 100% rename from tools/nginx-1.16.0/contrib/unicode2nginx/unicode-to-nginx.pl rename to tools/nginx-1.18.0/contrib/unicode2nginx/unicode-to-nginx.pl diff --git a/tools/nginx-1.16.0/contrib/unicode2nginx/win-utf b/tools/nginx-1.18.0/contrib/unicode2nginx/win-utf similarity index 100% rename from tools/nginx-1.16.0/contrib/unicode2nginx/win-utf rename to tools/nginx-1.18.0/contrib/unicode2nginx/win-utf diff --git a/tools/nginx-1.16.0/contrib/vim/ftdetect/nginx.vim b/tools/nginx-1.18.0/contrib/vim/ftdetect/nginx.vim similarity index 100% rename from tools/nginx-1.16.0/contrib/vim/ftdetect/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/ftdetect/nginx.vim diff --git a/tools/nginx-1.16.0/contrib/vim/ftplugin/nginx.vim b/tools/nginx-1.18.0/contrib/vim/ftplugin/nginx.vim similarity index 100% rename from tools/nginx-1.16.0/contrib/vim/ftplugin/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/ftplugin/nginx.vim diff --git a/tools/nginx-1.16.0/contrib/vim/indent/nginx.vim b/tools/nginx-1.18.0/contrib/vim/indent/nginx.vim similarity index 100% rename from tools/nginx-1.16.0/contrib/vim/indent/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/indent/nginx.vim diff --git a/tools/nginx-1.16.0/contrib/vim/syntax/nginx.vim b/tools/nginx-1.18.0/contrib/vim/syntax/nginx.vim similarity index 99% rename from tools/nginx-1.16.0/contrib/vim/syntax/nginx.vim rename to tools/nginx-1.18.0/contrib/vim/syntax/nginx.vim index 6bee7a2e..1a3a7b7d 100644 --- a/tools/nginx-1.16.0/contrib/vim/syntax/nginx.vim +++ b/tools/nginx-1.18.0/contrib/vim/syntax/nginx.vim @@ -333,6 +333,7 @@ syn keyword ngxDirective contained js_access syn keyword ngxDirective contained js_content syn keyword ngxDirective contained js_filter syn keyword ngxDirective contained js_include +syn keyword ngxDirective contained js_path syn keyword ngxDirective contained js_preread syn keyword ngxDirective contained js_set syn keyword ngxDirective contained keepalive @@ -353,6 +354,7 @@ syn keyword ngxDirective contained limit_conn_zone syn keyword ngxDirective contained limit_rate syn keyword ngxDirective contained limit_rate_after syn keyword ngxDirective contained limit_req +syn keyword ngxDirective contained limit_req_dry_run syn keyword ngxDirective contained limit_req_log_level syn keyword ngxDirective contained limit_req_status syn keyword ngxDirective contained limit_req_zone @@ -472,6 +474,7 @@ syn keyword ngxDirective contained proxy_requests syn keyword ngxDirective contained proxy_responses syn keyword ngxDirective contained proxy_send_lowat syn keyword ngxDirective contained proxy_send_timeout +syn keyword ngxDirective contained proxy_session_drop syn keyword ngxDirective contained proxy_set_body syn keyword ngxDirective contained proxy_set_header syn keyword ngxDirective contained proxy_socket_keepalive @@ -1325,6 +1328,7 @@ syn keyword ngxDirectiveThirdParty contained lua_check_client_abort syn keyword ngxDirectiveThirdParty contained lua_code_cache syn keyword ngxDirectiveThirdParty contained lua_fake_shm syn keyword ngxDirectiveThirdParty contained lua_http10_buffering +syn keyword ngxDirectiveThirdParty contained lua_load_resty_core syn keyword ngxDirectiveThirdParty contained lua_malloc_trim syn keyword ngxDirectiveThirdParty contained lua_max_pending_timers syn keyword ngxDirectiveThirdParty contained lua_max_running_timers @@ -1779,6 +1783,7 @@ syn keyword ngxDirectiveThirdParty contained vod_expires_live_time_dependent syn keyword ngxDirectiveThirdParty contained vod_fallback_upstream_location syn keyword ngxDirectiveThirdParty contained vod_force_continuous_timestamps syn keyword ngxDirectiveThirdParty contained vod_force_playlist_type_vod +syn keyword ngxDirectiveThirdParty contained vod_force_sequence_index syn keyword ngxDirectiveThirdParty contained vod_gop_look_ahead syn keyword ngxDirectiveThirdParty contained vod_gop_look_behind syn keyword ngxDirectiveThirdParty contained vod_ignore_edit_list diff --git a/tools/nginx-1.16.0/docs/CHANGES b/tools/nginx-1.18.0/docs/CHANGES similarity index 97% rename from tools/nginx-1.16.0/docs/CHANGES rename to tools/nginx-1.18.0/docs/CHANGES index b347b0cc..6da9172b 100644 --- a/tools/nginx-1.16.0/docs/CHANGES +++ b/tools/nginx-1.18.0/docs/CHANGES @@ -1,7 +1,197 @@ -Changes with nginx 1.16.0 23 Apr 2019 +Changes with nginx 1.18.0 21 Apr 2020 - *) 1.16.x stable branch. + *) 1.18.x stable branch. + + +Changes with nginx 1.17.10 14 Apr 2020 + + *) Feature: the "auth_delay" directive. + + +Changes with nginx 1.17.9 03 Mar 2020 + + *) Change: now nginx does not allow several "Host" request header lines. + + *) Bugfix: nginx ignored additional "Transfer-Encoding" request header + lines. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: a segmentation fault might occur in a worker process if OCSP + stapling was used. + + *) Bugfix: in the ngx_http_mp4_module. + + *) Bugfix: nginx used status code 494 instead of 400 if errors with code + 494 were redirected with the "error_page" directive. + + *) Bugfix: socket leak when using subrequests in the njs module and the + "aio" directive. + + +Changes with nginx 1.17.8 21 Jan 2020 + + *) Feature: variables support in the "grpc_pass" directive. + + *) Bugfix: a timeout might occur while handling pipelined requests in an + SSL connection; the bug had appeared in 1.17.5. + + *) Bugfix: in the "debug_points" directive when using HTTP/2. + Thanks to Daniil Bondarev. + + +Changes with nginx 1.17.7 24 Dec 2019 + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if the "rewrite" directive with an empty replacement + string was used in the configuration. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "break" directive was used with the "alias" directive or with the + "proxy_pass" directive with a URI. + + *) Bugfix: the "Location" response header line might contain garbage if + the request URI was rewritten to the one containing a null character. + + *) Bugfix: requests with bodies were handled incorrectly when returning + redirections with the "error_page" directive; the bug had appeared in + 0.7.12. + + *) Bugfix: socket leak when using HTTP/2. + + *) Bugfix: a timeout might occur while handling pipelined requests in an + SSL connection; the bug had appeared in 1.17.5. + + *) Bugfix: in the ngx_http_dav_module. + + +Changes with nginx 1.17.6 19 Nov 2019 + + *) Feature: the $proxy_protocol_server_addr and + $proxy_protocol_server_port variables. + + *) Feature: the "limit_conn_dry_run" directive. + + *) Feature: the $limit_req_status and $limit_conn_status variables. + + +Changes with nginx 1.17.5 22 Oct 2019 + + *) Feature: now nginx uses ioctl(FIONREAD), if available, to avoid + reading from a fast connection for a long time. + + *) Bugfix: incomplete escaped characters at the end of the request URI + were ignored. + + *) Bugfix: "/." and "/.." at the end of the request URI were not + normalized. + + *) Bugfix: in the "merge_slashes" directive. + + *) Bugfix: in the "ignore_invalid_headers" directive. + Thanks to Alan Kemp. + + *) Bugfix: nginx could not be built with MinGW-w64 gcc 8.1 or newer. + + +Changes with nginx 1.17.4 24 Sep 2019 + + *) Change: better detection of incorrect client behavior in HTTP/2. + + *) Change: in handling of not fully read client request body when + returning errors in HTTP/2. + + *) Bugfix: the "worker_shutdown_timeout" directive might not work when + using HTTP/2. + + *) Bugfix: a segmentation fault might occur in a worker process when + using HTTP/2 and the "proxy_request_buffering" directive. + + *) Bugfix: the ECONNABORTED error log level was "crit" instead of + "error" on Windows when using SSL. + + *) Bugfix: nginx ignored extra data when using chunked transfer + encoding. + + *) Bugfix: nginx always returned the 500 error if the "return" directive + was used and an error occurred during reading client request body. + + *) Bugfix: in memory allocation error handling. + + +Changes with nginx 1.17.3 13 Aug 2019 + + *) Security: when using HTTP/2 a client might cause excessive memory + consumption and CPU usage (CVE-2019-9511, CVE-2019-9513, + CVE-2019-9516). + + *) Bugfix: "zero size buf" alerts might appear in logs when using + gzipping; the bug had appeared in 1.17.2. + + *) Bugfix: a segmentation fault might occur in a worker process if the + "resolver" directive was used in SMTP proxy. + + +Changes with nginx 1.17.2 23 Jul 2019 + + *) Change: minimum supported zlib version is 1.2.0.4. + Thanks to Ilya Leoshkevich. + + *) Change: the $r->internal_redirect() embedded perl method now expects + escaped URIs. + + *) Feature: it is now possible to switch to a named location using the + $r->internal_redirect() embedded perl method. + + *) Bugfix: in error handling in embedded perl. + + *) Bugfix: a segmentation fault might occur on start or during + reconfiguration if hash bucket size larger than 64 kilobytes was used + in the configuration. + + *) Bugfix: nginx might hog CPU during unbuffered proxying and when + proxying WebSocket connections if the select, poll, or /dev/poll + methods were used. + + *) Bugfix: in the ngx_http_xslt_filter_module. + + *) Bugfix: in the ngx_http_ssi_filter_module. + + +Changes with nginx 1.17.1 25 Jun 2019 + + *) Feature: the "limit_req_dry_run" directive. + + *) Feature: when using the "hash" directive inside the "upstream" block + an empty hash key now triggers round-robin balancing. + Thanks to Niklas Keller. + + *) Bugfix: a segmentation fault might occur in a worker process if + caching was used along with the "image_filter" directive, and errors + with code 415 were redirected with the "error_page" directive; the + bug had appeared in 1.11.10. + + *) Bugfix: a segmentation fault might occur in a worker process if + embedded perl was used; the bug had appeared in 1.7.3. + + +Changes with nginx 1.17.0 21 May 2019 + + *) Feature: variables support in the "limit_rate" and "limit_rate_after" + directives. + + *) Feature: variables support in the "proxy_upload_rate" and + "proxy_download_rate" directives in the stream module. + + *) Change: minimum supported OpenSSL version is 0.9.8. + + *) Change: now the postpone filter is always built. + + *) Bugfix: the "include" directive did not work inside the "if" and + "limit_except" blocks. + + *) Bugfix: in byte ranges processing. Changes with nginx 1.15.12 16 Apr 2019 diff --git a/tools/nginx-1.16.0/docs/CHANGES.ru b/tools/nginx-1.18.0/docs/CHANGES.ru similarity index 97% rename from tools/nginx-1.16.0/docs/CHANGES.ru rename to tools/nginx-1.18.0/docs/CHANGES.ru index b8d53b3e..e4300216 100644 --- a/tools/nginx-1.16.0/docs/CHANGES.ru +++ b/tools/nginx-1.18.0/docs/CHANGES.ru @@ -1,7 +1,202 @@ -Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.16.0 23.04.2019 +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.18.0 21.04.2020 - *) Ð¡Ñ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° 1.16.x. + *) Ð¡Ñ‚Ð°Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ‚ÐºÐ° 1.18.x. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.10 14.04.2020 + + *) Добавление: директива auth_delay. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.9 03.03.2020 + + *) Изменение: теперь nginx не разрешает неÑколько Ñтрок "Host" в + заголовке запроÑа. + + *) ИÑправление: nginx игнорировал дополнительные Ñтроки + "Transfer-Encoding" в заголовке запроÑа. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ OCSP stapling. + + *) ИÑправление: в модуле ngx_http_mp4_module. + + *) ИÑправление: при перенаправлении ошибок Ñ ÐºÐ¾Ð´Ð¾Ð¼ 494 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ + директивы error_page nginx возвращал ответ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 494 вмеÑто 400. + + *) ИÑправление: утечки Ñокетов при иÑпользовании подзапроÑов в модуле + njs и директивы aio. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.8 21.01.2020 + + *) Добавление: директива grpc_pass поддерживает переменные. + + *) ИÑправление: при обработке pipelined-запроÑов по SSL-Ñоединению мог + произойти таймаут; ошибка поÑвилаÑÑŒ в 1.17.5. + + *) ИÑправление: в директиве debug_points при иÑпользовании HTTP/2. + СпаÑибо Даниилу Бондареву. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.7 24.12.2019 + + *) ИÑправление: на Ñтарте или во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ мог произойти + segmentation fault, еÑли в конфигурации иÑпользовалаÑÑŒ директива + rewrite Ñ Ð¿ÑƒÑтой Ñтрокой замены. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли директива break иÑпользовалаÑÑŒ ÑовмеÑтно Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¸Ð²Ð¾Ð¹ alias или + директивой proxy_pass Ñ URI. + + *) ИÑправление: Ñтрока Location заголовка ответа могла Ñодержать муÑор, + еÑли URI запроÑа был изменён на URI, Ñодержащий нулевой Ñимвол. + + *) ИÑправление: при возврате перенаправлений Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы + error_page запроÑÑ‹ Ñ Ñ‚ÐµÐ»Ð¾Ð¼ обрабатывалиÑÑŒ некорректно; ошибка + поÑвилаÑÑŒ в 0.7.12. + + *) ИÑправление: утечки Ñокетов при иÑпользовании HTTP/2. + + *) ИÑправление: при обработке pipelined-запроÑов по SSL-Ñоединению мог + произойти таймаут; ошибка поÑвилаÑÑŒ в 1.17.5. + + *) ИÑправление: в модуле ngx_http_dav_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.6 19.11.2019 + + *) Добавление: переменные $proxy_protocol_server_addr и + $proxy_protocol_server_port. + + *) Добавление: директива limit_conn_dry_run. + + *) Добавление: переменные $limit_req_status и $limit_conn_status. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.5 22.10.2019 + + *) Добавление: теперь nginx иÑпользует вызов ioctl(FIONREAD), еÑли он + доÑтупен, чтобы избежать Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸Ð· быÑтрого ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð² течение + долгого времени. + + *) ИÑправление: неполные закодированные Ñимволы в конце URI запроÑа + игнорировалиÑÑŒ. + + *) ИÑправление: "/." и "/.." в конце URI запроÑа не нормализовывалиÑÑŒ. + + *) ИÑправление: в директиве merge_slashes. + + *) ИÑправление: в директиве ignore_invalid_headers. + СпаÑибо Alan Kemp. + + *) ИÑправление: nginx не ÑобиралÑÑ Ñ MinGW-w64 gcc 8.1 и новее. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.4 24.09.2019 + + *) Изменение: улучшено детектирование некорректного Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð² в + HTTP/2. + + *) Изменение: в обработке непрочитанного тела запроÑа при возврате + ошибок в HTTP/2. + + *) ИÑправление: директива worker_shutdown_timeout могла не работать при + иÑпользовании HTTP/2. + + *) ИÑправление: при иÑпользовании HTTP/2 и директивы + proxy_request_buffering в рабочем процеÑÑе мог произойти segmentation + fault. + + *) ИÑправление: на Windows при иÑпользовании SSL уровень запиÑи в лог + ошибки ECONNABORTED был "crit" вмеÑто "error". + + *) ИÑправление: nginx игнорировал лишние данные при иÑпользовании + chunked transfer encoding. + + *) ИÑправление: еÑли иÑпользовалаÑÑŒ директива return и при чтении тела + запроÑа возникала ошибка, nginx вÑегда возвращал ошибку 500. + + *) ИÑправление: в обработке ошибок Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼Ñти. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.3 13.08.2019 + + *) БезопаÑноÑть: при иÑпользовании HTTP/2 клиент мог вызвать чрезмерное + потребление памÑти и реÑурÑов процеÑÑора (CVE-2019-9511, + CVE-2019-9513, CVE-2019-9516). + + *) ИÑправление: при иÑпользовании ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð² логах могли поÑвлÑтьÑÑ + ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ "zero size buf"; ошибка поÑвилаÑÑŒ в 1.17.2. + + *) ИÑправление: при иÑпользовании директивы resolver в SMTP + прокÑи-Ñервере в рабочем процеÑÑе мог произойти segmentation fault. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.2 23.07.2019 + + *) Изменение: Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ zlib - 1.2.0.4. + СпаÑибо Илье Леошкевичу. + + *) Изменение: метод $r->internal_redirect() вÑтроенного перла теперь + ожидает закодированный URI. + + *) Добавление: теперь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ метода $r->internal_redirect() + вÑтроенного перла можно перейти в именованный location. + + *) ИÑправление: в обработке ошибок во вÑтроенном перле. + + *) ИÑправление: на Ñтарте или во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ мог произойти + segmentation fault, еÑли в конфигурации иÑпользовалоÑÑŒ значение hash + bucket size больше 64 килобайт. + + *) ИÑправление: при иÑпользовании методов обработки Ñоединений select, + poll и /dev/poll nginx мог нагружать процеÑÑор во Ð²Ñ€ÐµÐ¼Ñ + небуферизованного прокÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ при прокÑировании + WebSocket-Ñоединений. + + *) ИÑправление: в модуле ngx_http_xslt_filter_module. + + *) ИÑправление: в модуле ngx_http_ssi_filter_module. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.1 25.06.2019 + + *) Добавление: директива limit_req_dry_run. + + *) Добавление: при иÑпользовании директивы hash в блоке upstream пуÑтой + ключ Ñ…ÑÑˆÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ¿ÐµÑ€ÑŒ приводит к переключению на round-robin + баланÑировку. + СпаÑибо Niklas Keller. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалоÑÑŒ кÑширование и директива image_filter, а ошибки Ñ + кодом 415 перенаправлÑлиÑÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ директивы error_page; ошибка + поÑвилаÑÑŒ в 1.11.10. + + *) ИÑправление: в рабочем процеÑÑе мог произойти segmentation fault, + еÑли иÑпользовалÑÑ Ð²Ñтроенный перл; ошибка поÑвилаÑÑŒ в 1.7.3. + + +Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.17.0 21.05.2019 + + *) Добавление: директивы limit_rate и limit_rate_after поддерживают + переменные. + + *) Добавление: директивы proxy_upload_rate и proxy_download_rate в + модуле stream поддерживают переменные. + + *) Изменение: Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ OpenSSL - 0.9.8. + + *) Изменение: теперь postpone-фильтр ÑобираетÑÑ Ð²Ñегда. + + *) ИÑправление: директива include не работала в блоках if и + limit_except. + + *) ИÑправление: в обработке byte ranges. Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² nginx 1.15.12 16.04.2019 diff --git a/tools/nginx-1.16.0/docs/LICENSE b/tools/nginx-1.18.0/docs/LICENSE similarity index 100% rename from tools/nginx-1.16.0/docs/LICENSE rename to tools/nginx-1.18.0/docs/LICENSE diff --git a/tools/nginx-1.16.0/docs/OpenSSL.LICENSE b/tools/nginx-1.18.0/docs/OpenSSL.LICENSE similarity index 100% rename from tools/nginx-1.16.0/docs/OpenSSL.LICENSE rename to tools/nginx-1.18.0/docs/OpenSSL.LICENSE diff --git a/tools/nginx-1.16.0/docs/PCRE.LICENCE b/tools/nginx-1.18.0/docs/PCRE.LICENCE similarity index 96% rename from tools/nginx-1.16.0/docs/PCRE.LICENCE rename to tools/nginx-1.18.0/docs/PCRE.LICENCE index 760a6666..57a54481 100644 --- a/tools/nginx-1.16.0/docs/PCRE.LICENCE +++ b/tools/nginx-1.18.0/docs/PCRE.LICENCE @@ -25,7 +25,7 @@ Email domain: cam.ac.uk University of Cambridge Computing Service, Cambridge, England. -Copyright (c) 1997-2019 University of Cambridge +Copyright (c) 1997-2020 University of Cambridge All rights reserved. @@ -36,7 +36,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2010-2019 Zoltan Herczeg +Copyright(c) 2010-2020 Zoltan Herczeg All rights reserved. @@ -47,7 +47,7 @@ Written by: Zoltan Herczeg Email local part: hzmester Email domain: freemail.hu -Copyright(c) 2009-2019 Zoltan Herczeg +Copyright(c) 2009-2020 Zoltan Herczeg All rights reserved. diff --git a/tools/nginx-1.16.0/docs/README b/tools/nginx-1.18.0/docs/README similarity index 100% rename from tools/nginx-1.16.0/docs/README rename to tools/nginx-1.18.0/docs/README diff --git a/tools/nginx-1.16.0/docs/zlib.LICENSE b/tools/nginx-1.18.0/docs/zlib.LICENSE similarity index 100% rename from tools/nginx-1.16.0/docs/zlib.LICENSE rename to tools/nginx-1.18.0/docs/zlib.LICENSE diff --git a/tools/nginx-1.16.0/html/50x.html b/tools/nginx-1.18.0/html/50x.html similarity index 100% rename from tools/nginx-1.16.0/html/50x.html rename to tools/nginx-1.18.0/html/50x.html diff --git a/tools/nginx-1.16.0/html/index.html b/tools/nginx-1.18.0/html/index.html similarity index 100% rename from tools/nginx-1.16.0/html/index.html rename to tools/nginx-1.18.0/html/index.html diff --git a/tools/nginx-1.16.0/nginx.exe b/tools/nginx-1.18.0/nginx.exe similarity index 54% rename from tools/nginx-1.16.0/nginx.exe rename to tools/nginx-1.18.0/nginx.exe index a6cb46e9adce3af469ee9b13953c60b07d7580ee..b620d097b31a434511d6fc160bb8962a19754788 100644 GIT binary patch delta 1164413 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 L0TmGvL^I;P6~oCi z1#6uRyA6BQ?nLBQJss z)(*_|#z9+U#wCB69CFBqGT|B{>JFc_dWj@3Ul0o6hlG;q<;frf1pU!Tg|t;2c@GPE z2;StisQqZMc)_A3w1r*+M`*HIcoU%blC$zuSNw39pR%Zx7%>aay*DD9-)dDm6b%fr zht+4P-9$~YXdORWus<_+QmXHtLkfrAZ=RoEdEGardp9GdxN=?d50J^#hA=T#HbxQr{?Ut_VQM0d!zF7Q+#EtI!Zs|9bpRC+mM;Y z@TYivtlBOtm;CYy1dp<*li12LS9FV)o6cPMi^WSn*{c>7FZthI`LC|OkA8RMudcth zekVt&*zLeBQq2FFABs~)o6T+MOq#swrrsHzZFf-w6U5gGrrZKQDI~g_q`#681y}AOiD^ioxf_8^x zA==b$K1PM?xK0;Wv15t2G}6PXlhlz);xYbNlDf!#US=hKf&*X5tmHm%-3c6){}>TZ zx}4DXj7v0&4RF7-)dq%m#h3it<7#5-q1O`AgNY?y@(+?BH+_DL|D3FLGgk7%4r(u@ z{}+602i>shz7Fd2Nn?Tq`hG!8+o~2j44yU+5{}X4jXZ z*5%EP<~S8Gx+!2^GFa#0Os5#~*%kO8Hp#&-Ny8R?b&4^PyF02eJ*0;juCzn7-C-(c zWmgaeNyTbl*QO7P?|#N>JEY2W z_f|dWAwb_9D&9ot`!;+61~&obwhs43J>Bb1*L~w=&q1Jgd)3?K689=Sz2q~Vjhm|y z