zoukankan      html  css  js  c++  java
  • 配置PHP8与Nginx并启动nextcloud

    配置PHP8与Nginx并启动nextcloud

    PHP8初始可以直接以CLI命令行方式验证程序是否OK,真实使用场景,还是以PHP-FPM方式启动,通过FCGI与HttpServer交互。

    1. 环境

    PHP与Nginx已经交叉编译完成,运行在hi3798mv100的电视盒上,rootfs是基于ubuntu ports 20.04.3打造。

    硬件:EC6108V9(HI3798MV100)

    操作系统:kernel 4.9 + ubuntu ports 20.04.3

    软件:PHP 8.0.13 + Nginx 1.20.2 + nextcloud 22.2.3

    2. 配置并启动PHP-FPM

    2.1 配置php-fpm.service文件

    首先,需要配置好php-fpm.service文件,以系统服务方式启动PHP-FPM:

    # It's not recommended to modify this file in-place, because it
    # will be overwritten during upgrades.  If you want to customize,
    # the best way is to use the "systemctl edit" command.
    
    [Unit]
    Description=The PHP FastCGI Process Manager
    After=network.target
    
    [Service]
    Type=simple
    PIDFile=/data/app/var/run/php-fpm.pid
    ExecStart=/data/app/sbin/arm-himix200-linux-php-fpm --nodaemonize --fpm-config /data/app/etc/php/php-fpm.conf
    ExecReload=/bin/kill -USR2 $MAINPID
    
    # Set up a new file system namespace and mounts private /tmp and /var/tmp directories
    # so this service cannot access the global directories and other processes cannot
    # access this service's directories.
    PrivateTmp=true
    
    # Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.
    ProtectSystem=full
    
    # Sets up a new /dev namespace for the executed processes and only adds API pseudo devices
    # such as /dev/null, /dev/zero or /dev/random (as well as the pseudo TTY subsystem) to it,
    # but no physical devices such as /dev/sda.
    PrivateDevices=true
    
    # Explicit module loading will be denied. This allows to turn off module load and unload
    # operations on modular kernels. It is recommended to turn this on for most services that
    # do not need special file systems or extra kernel modules to work.
    ProtectKernelModules=true
    
    # Kernel variables accessible through /proc/sys, /sys, /proc/sysrq-trigger, /proc/latency_stats,
    # /proc/acpi, /proc/timer_stats, /proc/fs and /proc/irq will be made read-only to all processes
    # of the unit. Usually, tunable kernel variables should only be written at boot-time, with the
    # sysctl.d(5) mechanism. Almost no services need to write to these at runtime; it is hence
    # recommended to turn this on for most services.
    ProtectKernelTunables=true
    
    # The Linux Control Groups (cgroups(7)) hierarchies accessible through /sys/fs/cgroup will be
    # made read-only to all processes of the unit. Except for container managers no services should
    # require write access to the control groups hierarchies; it is hence recommended to turn this on
    # for most services
    ProtectControlGroups=true
    
    # Any attempts to enable realtime scheduling in a process of the unit are refused.
    RestrictRealtime=true
    
    # Restricts the set of socket address families accessible to the processes of this unit.
    # Protects against vulnerabilities such as CVE-2016-8655
    RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
    
    # Takes away the ability to create or manage any kind of namespace
    RestrictNamespaces=true
    
    [Install]
    WantedBy=multi-user.target
    

    配置了服务文件后,拷贝到/usr/lib/systemd/system/目录下。然后就可以以sudo systemctl start php-fpm.service方式启动、验证PHP-FPM服务了。

    2.2 配置php-fpm.conf文件

    直接启动PHP-FPM,可以看到需要/data/app/etc/php/php-fpm.conf配置文件,拷贝/data/app/etc/php/php-fpm.conf.default为php-fpm.conf。

    ;;;;;;;;;;;;;;;;;;;;;
    ; FPM Configuration ;
    ;;;;;;;;;;;;;;;;;;;;;
    
    ; All relative paths in this configuration file are relative to PHP's install
    ; prefix (/data/app). This prefix can be dynamically changed by using the
    ; '-p' argument from the command line.
    
    ;;;;;;;;;;;;;;;;;;
    ; Global Options ;
    ;;;;;;;;;;;;;;;;;;
    
    [global]
    ; Pid file
    ; Note: the default prefix is /data/app/var
    ; Default Value: none
    ;pid = run/php-fpm.pid
    
    ; Error log file
    ; If it's set to "syslog", log is sent to syslogd instead of being written
    ; into a local file.
    ; Note: the default prefix is /data/app/var
    ; Default Value: log/php-fpm.log
    ;error_log = log/php-fpm.log
    
    ; syslog_facility is used to specify what type of program is logging the
    ; message. This lets syslogd specify that messages from different facilities
    ; will be handled differently.
    ; See syslog(3) for possible values (ex daemon equiv LOG_DAEMON)
    ; Default Value: daemon
    ;syslog.facility = daemon
    
    ; syslog_ident is prepended to every message. If you have multiple FPM
    ; instances running on the same server, you can change the default value
    ; which must suit common needs.
    ; Default Value: php-fpm
    ;syslog.ident = php-fpm
    
    ; Log level
    ; Possible Values: alert, error, warning, notice, debug
    ; Default Value: notice
    ;log_level = notice
    
    ; Log limit on number of characters in the single line (log entry). If the
    ; line is over the limit, it is wrapped on multiple lines. The limit is for
    ; all logged characters including message prefix and suffix if present. However
    ; the new line character does not count into it as it is present only when
    ; logging to a file descriptor. It means the new line character is not present
    ; when logging to syslog.
    ; Default Value: 1024
    ;log_limit = 4096
    
    ; Log buffering specifies if the log line is buffered which means that the
    ; line is written in a single write operation. If the value is false, then the
    ; data is written directly into the file descriptor. It is an experimental
    ; option that can potentionaly improve logging performance and memory usage
    ; for some heavy logging scenarios. This option is ignored if logging to syslog
    ; as it has to be always buffered.
    ; Default value: yes
    ;log_buffering = no
    
    ; If this number of child processes exit with SIGSEGV or SIGBUS within the time
    ; interval set by emergency_restart_interval then FPM will restart. A value
    ; of '0' means 'Off'.
    ; Default Value: 0
    ;emergency_restart_threshold = 0
    
    ; Interval of time used by emergency_restart_interval to determine when
    ; a graceful restart will be initiated.  This can be useful to work around
    ; accidental corruptions in an accelerator's shared memory.
    ; Available Units: s(econds), m(inutes), h(ours), or d(ays)
    ; Default Unit: seconds
    ; Default Value: 0
    ;emergency_restart_interval = 0
    
    ; Time limit for child processes to wait for a reaction on signals from master.
    ; Available units: s(econds), m(inutes), h(ours), or d(ays)
    ; Default Unit: seconds
    ; Default Value: 0
    ;process_control_timeout = 0
    
    ; The maximum number of processes FPM will fork. This has been designed to control
    ; the global number of processes when using dynamic PM within a lot of pools.
    ; Use it with caution.
    ; Note: A value of 0 indicates no limit
    ; Default Value: 0
    ; process.max = 128
    
    ; Specify the nice(2) priority to apply to the master process (only if set)
    ; The value can vary from -19 (highest priority) to 20 (lowest priority)
    ; Note: - It will only work if the FPM master process is launched as root
    ;       - The pool process will inherit the master process priority
    ;         unless specified otherwise
    ; Default Value: no set
    ; process.priority = -19
    
    ; Send FPM to background. Set to 'no' to keep FPM in foreground for debugging.
    ; Default Value: yes
    ;daemonize = yes
    
    ; Set open file descriptor rlimit for the master process.
    ; Default Value: system defined value
    ;rlimit_files = 1024
    
    ; Set max core size rlimit for the master process.
    ; Possible Values: 'unlimited' or an integer greater or equal to 0
    ; Default Value: system defined value
    ;rlimit_core = 0
    
    ; Specify the event mechanism FPM will use. The following is available:
    ; - select     (any POSIX os)
    ; - poll       (any POSIX os)
    ; - epoll      (linux >= 2.5.44)
    ; - kqueue     (FreeBSD >= 4.1, OpenBSD >= 2.9, NetBSD >= 2.0)
    ; - /dev/poll  (Solaris >= 7)
    ; - port       (Solaris >= 10)
    ; Default Value: not set (auto detection)
    ;events.mechanism = epoll
    
    ; When FPM is built with systemd integration, specify the interval,
    ; in seconds, between health report notification to systemd.
    ; Set to 0 to disable.
    ; Available Units: s(econds), m(inutes), h(ours)
    ; Default Unit: seconds
    ; Default value: 10
    ;systemd_interval = 10
    
    ;;;;;;;;;;;;;;;;;;;;
    ; Pool Definitions ;
    ;;;;;;;;;;;;;;;;;;;;
    
    ; Multiple pools of child processes may be started with different listening
    ; ports and different management options.  The name of the pool will be
    ; used in logs and stats. There is no limitation on the number of pools which
    ; FPM can handle. Your system will tell you anyway :)
    
    ; Include one or more files. If glob(3) exists, it is used to include a bunch of
    ; files from a glob(3) pattern. This directive can be used everywhere in the
    ; file.
    ; Relative path can also be used. They will be prefixed by:
    ;  - the global prefix if it's been set (-p argument)
    ;  - /data/app otherwise
    include=/data/app/etc/php/php-fpm.d/*.conf
    

    基本上配置不做变化,主体配置在pool definitions区,通过include目录/data/app/etc/php/php-fpm.d/下的conf文件完成。

    2.3 配置nextcloud.conf

    目录/data/app/etc/php/php-fpm.d/目录下,有一个默认的www.conf.default文件,拷贝为nextcloud.conf,并做少量调整。

    ; Start a new pool named 'www'.
    ; the variable $pool can be used in any directive and will be replaced by the
    ; pool name ('www' here)
    [nextcloud]
    
    ; Per pool prefix
    ; It only applies on the following directives:
    ; - 'access.log'
    ; - 'slowlog'
    ; - 'listen' (unixsocket)
    ; - 'chroot'
    ; - 'chdir'
    ; - 'php_values'
    ; - 'php_admin_values'
    ; When not set, the global prefix (or /data/app) applies instead.
    ; Note: This directive can also be relative to the global prefix.
    ; Default Value: none
    ;prefix = /path/to/pools/$pool
    prefix = /data/web
    
    ; Unix user/group of processes
    ; Note: The user is mandatory. If the group is not set, the default user's group
    ;       will be used.
    user = http
    group = http
    
    ; The address on which to accept FastCGI requests.
    ; Valid syntaxes are:
    ;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
    ;                            a specific port;
    ;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
    ;                            a specific port;
    ;   'port'                 - to listen on a TCP socket to all addresses
    ;                            (IPv6 and IPv4-mapped) on a specific port;
    ;   '/path/to/unix/socket' - to listen on a unix socket.
    ; Note: This value is mandatory.
    ;listen = 127.0.0.1:9000
    listen = /data/app/var/php-fpm.sock
    listen.owner = http
    listen.group = http
    
    ; Set listen(2) backlog.
    ; Default Value: 511 (-1 on FreeBSD and OpenBSD)
    ;listen.backlog = 511
    
    ; Set permissions for unix socket, if one is used. In Linux, read/write
    ; permissions must be set in order to allow connections from a web server. Many
    ; BSD-derived systems allow connections regardless of permissions. The owner
    ; and group can be specified either by name or by their numeric IDs.
    ; Default Values: user and group are set as the running user
    ;                 mode is set to 0660
    ;listen.owner = http
    ;listen.group = http
    ;listen.mode = 0660
    ; When POSIX Access Control Lists are supported you can set them using
    ; these options, value is a comma separated list of user/group names.
    ; When set, listen.owner and listen.group are ignored
    ;listen.acl_users =
    ;listen.acl_groups =
    
    ; List of addresses (IPv4/IPv6) of FastCGI clients which are allowed to connect.
    ; Equivalent to the FCGI_WEB_SERVER_ADDRS environment variable in the original
    ; PHP FCGI (5.2.2+). Makes sense only with a tcp listening socket. Each address
    ; must be separated by a comma. If this value is left blank, connections will be
    ; accepted from any ip address.
    ; Default Value: any
    ;listen.allowed_clients = 127.0.0.1
    
    ; Specify the nice(2) priority to apply to the pool processes (only if set)
    ; The value can vary from -19 (highest priority) to 20 (lower priority)
    ; Note: - It will only work if the FPM master process is launched as root
    ;       - The pool processes will inherit the master process priority
    ;         unless it specified otherwise
    ; Default Value: no set
    ; process.priority = -19
    
    ; Set the process dumpable flag (PR_SET_DUMPABLE prctl) even if the process user
    ; or group is different than the master process user. It allows to create process
    ; core dump and ptrace the process for the pool user.
    ; Default Value: no
    ; process.dumpable = yes
    
    ; Choose how the process manager will control the number of child processes.
    ; Possible Values:
    ;   static  - a fixed number (pm.max_children) of child processes;
    ;   dynamic - the number of child processes are set dynamically based on the
    ;             following directives. With this process management, there will be
    ;             always at least 1 children.
    ;             pm.max_children      - the maximum number of children that can
    ;                                    be alive at the same time.
    ;             pm.start_servers     - the number of children created on startup.
    ;             pm.min_spare_servers - the minimum number of children in 'idle'
    ;                                    state (waiting to process). If the number
    ;                                    of 'idle' processes is less than this
    ;                                    number then some children will be created.
    ;             pm.max_spare_servers - the maximum number of children in 'idle'
    ;                                    state (waiting to process). If the number
    ;                                    of 'idle' processes is greater than this
    ;                                    number then some children will be killed.
    ;  ondemand - no children are created at startup. Children will be forked when
    ;             new requests will connect. The following parameter are used:
    ;             pm.max_children           - the maximum number of children that
    ;                                         can be alive at the same time.
    ;             pm.process_idle_timeout   - The number of seconds after which
    ;                                         an idle process will be killed.
    ; Note: This value is mandatory.
    pm = dynamic
    
    ; The number of child processes to be created when pm is set to 'static' and the
    ; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'.
    ; This value sets the limit on the number of simultaneous requests that will be
    ; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
    ; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
    ; CGI. The below defaults are based on a server without much resources. Don't
    ; forget to tweak pm.* to fit your needs.
    ; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand'
    ; Note: This value is mandatory.
    pm.max_children = 5
    
    ; The number of child processes created on startup.
    ; Note: Used only when pm is set to 'dynamic'
    ; Default Value: (min_spare_servers + max_spare_servers) / 2
    pm.start_servers = 2
    
    ; The desired minimum number of idle server processes.
    ; Note: Used only when pm is set to 'dynamic'
    ; Note: Mandatory when pm is set to 'dynamic'
    pm.min_spare_servers = 1
    
    ; The desired maximum number of idle server processes.
    ; Note: Used only when pm is set to 'dynamic'
    ; Note: Mandatory when pm is set to 'dynamic'
    pm.max_spare_servers = 3
    
    ; The number of seconds after which an idle process will be killed.
    ; Note: Used only when pm is set to 'ondemand'
    ; Default Value: 10s
    ;pm.process_idle_timeout = 10s;
    
    ; The number of requests each child process should execute before respawning.
    ; This can be useful to work around memory leaks in 3rd party libraries. For
    ; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
    ; Default Value: 0
    ;pm.max_requests = 500
    
    ; The URI to view the FPM status page. If this value is not set, no URI will be
    ; recognized as a status page. It shows the following information:
    ;   pool                 - the name of the pool;
    ;   process manager      - static, dynamic or ondemand;
    ;   start time           - the date and time FPM has started;
    ;   start since          - number of seconds since FPM has started;
    ;   accepted conn        - the number of request accepted by the pool;
    ;   listen queue         - the number of request in the queue of pending
    ;                          connections (see backlog in listen(2));
    ;   max listen queue     - the maximum number of requests in the queue
    ;                          of pending connections since FPM has started;
    ;   listen queue len     - the size of the socket queue of pending connections;
    ;   idle processes       - the number of idle processes;
    ;   active processes     - the number of active processes;
    ;   total processes      - the number of idle + active processes;
    ;   max active processes - the maximum number of active processes since FPM
    ;                          has started;
    ;   max children reached - number of times, the process limit has been reached,
    ;                          when pm tries to start more children (works only for
    ;                          pm 'dynamic' and 'ondemand');
    ; Value are updated in real time.
    ; Example output:
    ;   pool:                 www
    ;   process manager:      static
    ;   start time:           01/Jul/2011:17:53:49 +0200
    ;   start since:          62636
    ;   accepted conn:        190460
    ;   listen queue:         0
    ;   max listen queue:     1
    ;   listen queue len:     42
    ;   idle processes:       4
    ;   active processes:     11
    ;   total processes:      15
    ;   max active processes: 12
    ;   max children reached: 0
    ;
    ; By default the status page output is formatted as text/plain. Passing either
    ; 'html', 'xml' or 'json' in the query string will return the corresponding
    ; output syntax. Example:
    ;   http://www.foo.bar/status
    ;   http://www.foo.bar/status?json
    ;   http://www.foo.bar/status?html
    ;   http://www.foo.bar/status?xml
    ;
    ; By default the status page only outputs short status. Passing 'full' in the
    ; query string will also return status for each pool process.
    ; Example:
    ;   http://www.foo.bar/status?full
    ;   http://www.foo.bar/status?json&full
    ;   http://www.foo.bar/status?html&full
    ;   http://www.foo.bar/status?xml&full
    ; The Full status returns for each process:
    ;   pid                  - the PID of the process;
    ;   state                - the state of the process (Idle, Running, ...);
    ;   start time           - the date and time the process has started;
    ;   start since          - the number of seconds since the process has started;
    ;   requests             - the number of requests the process has served;
    ;   request duration     - the duration in µs of the requests;
    ;   request method       - the request method (GET, POST, ...);
    ;   request URI          - the request URI with the query string;
    ;   content length       - the content length of the request (only with POST);
    ;   user                 - the user (PHP_AUTH_USER) (or '-' if not set);
    ;   script               - the main script called (or '-' if not set);
    ;   last request cpu     - the %cpu the last request consumed
    ;                          it's always 0 if the process is not in Idle state
    ;                          because CPU calculation is done when the request
    ;                          processing has terminated;
    ;   last request memory  - the max amount of memory the last request consumed
    ;                          it's always 0 if the process is not in Idle state
    ;                          because memory calculation is done when the request
    ;                          processing has terminated;
    ; If the process is in Idle state, then informations are related to the
    ; last request the process has served. Otherwise informations are related to
    ; the current request being served.
    ; Example output:
    ;   ************************
    ;   pid:                  31330
    ;   state:                Running
    ;   start time:           01/Jul/2011:17:53:49 +0200
    ;   start since:          63087
    ;   requests:             12808
    ;   request duration:     1250261
    ;   request method:       GET
    ;   request URI:          /test_mem.php?N=10000
    ;   content length:       0
    ;   user:                 -
    ;   script:               /home/fat/web/docs/php/test_mem.php
    ;   last request cpu:     0.00
    ;   last request memory:  0
    ;
    ; Note: There is a real-time FPM status monitoring sample web page available
    ;       It's available in: /data/app/share/php/fpm/status.html
    ;
    ; Note: The value must start with a leading slash (/). The value can be
    ;       anything, but it may not be a good idea to use the .php extension or it
    ;       may conflict with a real PHP file.
    ; Default Value: not set
    ;pm.status_path = /status
    
    ; The address on which to accept FastCGI status request. This creates a new
    ; invisible pool that can handle requests independently. This is useful
    ; if the main pool is busy with long running requests because it is still possible
    ; to get the status before finishing the long running requests.
    ;
    ; Valid syntaxes are:
    ;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
    ;                            a specific port;
    ;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
    ;                            a specific port;
    ;   'port'                 - to listen on a TCP socket to all addresses
    ;                            (IPv6 and IPv4-mapped) on a specific port;
    ;   '/path/to/unix/socket' - to listen on a unix socket.
    ; Default Value: value of the listen option
    ;pm.status_listen = 127.0.0.1:9001
    
    ; The ping URI to call the monitoring page of FPM. If this value is not set, no
    ; URI will be recognized as a ping page. This could be used to test from outside
    ; that FPM is alive and responding, or to
    ; - create a graph of FPM availability (rrd or such);
    ; - remove a server from a group if it is not responding (load balancing);
    ; - trigger alerts for the operating team (24/7).
    ; Note: The value must start with a leading slash (/). The value can be
    ;       anything, but it may not be a good idea to use the .php extension or it
    ;       may conflict with a real PHP file.
    ; Default Value: not set
    ;ping.path = /ping
    
    ; This directive may be used to customize the response of a ping request. The
    ; response is formatted as text/plain with a 200 response code.
    ; Default Value: pong
    ;ping.response = pong
    
    ; The access log file
    ; Default: not set
    ;access.log = log/$pool.access.log
    
    ; The access log format.
    ; The following syntax is allowed
    ;  %%: the '%' character
    ;  %C: %CPU used by the request
    ;      it can accept the following format:
    ;      - %{user}C for user CPU only
    ;      - %{system}C for system CPU only
    ;      - %{total}C  for user + system CPU (default)
    ;  %d: time taken to serve the request
    ;      it can accept the following format:
    ;      - %{seconds}d (default)
    ;      - %{milliseconds}d
    ;      - %{mili}d
    ;      - %{microseconds}d
    ;      - %{micro}d
    ;  %e: an environment variable (same as $_ENV or $_SERVER)
    ;      it must be associated with embraces to specify the name of the env
    ;      variable. Some examples:
    ;      - server specifics like: %{REQUEST_METHOD}e or %{SERVER_PROTOCOL}e
    ;      - HTTP headers like: %{HTTP_HOST}e or %{HTTP_USER_AGENT}e
    ;  %f: script filename
    ;  %l: content-length of the request (for POST request only)
    ;  %m: request method
    ;  %M: peak of memory allocated by PHP
    ;      it can accept the following format:
    ;      - %{bytes}M (default)
    ;      - %{kilobytes}M
    ;      - %{kilo}M
    ;      - %{megabytes}M
    ;      - %{mega}M
    ;  %n: pool name
    ;  %o: output header
    ;      it must be associated with embraces to specify the name of the header:
    ;      - %{Content-Type}o
    ;      - %{X-Powered-By}o
    ;      - %{Transfert-Encoding}o
    ;      - ....
    ;  %p: PID of the child that serviced the request
    ;  %P: PID of the parent of the child that serviced the request
    ;  %q: the query string
    ;  %Q: the '?' character if query string exists
    ;  %r: the request URI (without the query string, see %q and %Q)
    ;  %R: remote IP address
    ;  %s: status (response code)
    ;  %t: server time the request was received
    ;      it can accept a strftime(3) format:
    ;      %d/%b/%Y:%H:%M:%S %z (default)
    ;      The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
    ;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
    ;  %T: time the log has been written (the request has finished)
    ;      it can accept a strftime(3) format:
    ;      %d/%b/%Y:%H:%M:%S %z (default)
    ;      The strftime(3) format must be encapsuled in a %{<strftime_format>}t tag
    ;      e.g. for a ISO8601 formatted timestring, use: %{%Y-%m-%dT%H:%M:%S%z}t
    ;  %u: remote user
    ;
    ; Default: "%R - %u %t \"%m %r\" %s"
    ;access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
    
    ; The log file for slow requests
    ; Default Value: not set
    ; Note: slowlog is mandatory if request_slowlog_timeout is set
    ;slowlog = log/$pool.log.slow
    
    ; The timeout for serving a single request after which a PHP backtrace will be
    ; dumped to the 'slowlog' file. A value of '0s' means 'off'.
    ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
    ; Default Value: 0
    ;request_slowlog_timeout = 0
    
    ; Depth of slow log stack trace.
    ; Default Value: 20
    ;request_slowlog_trace_depth = 20
    
    ; The timeout for serving a single request after which the worker process will
    ; be killed. This option should be used when the 'max_execution_time' ini option
    ; does not stop script execution for some reason. A value of '0' means 'off'.
    ; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
    ; Default Value: 0
    ;request_terminate_timeout = 0
    
    ; The timeout set by 'request_terminate_timeout' ini option is not engaged after
    ; application calls 'fastcgi_finish_request' or when application has finished and
    ; shutdown functions are being called (registered via register_shutdown_function).
    ; This option will enable timeout limit to be applied unconditionally
    ; even in such cases.
    ; Default Value: no
    ;request_terminate_timeout_track_finished = no
    
    ; Set open file descriptor rlimit.
    ; Default Value: system defined value
    ;rlimit_files = 1024
    
    ; Set max core size rlimit.
    ; Possible Values: 'unlimited' or an integer greater or equal to 0
    ; Default Value: system defined value
    ;rlimit_core = 0
    
    ; Chroot to this directory at the start. This value must be defined as an
    ; absolute path. When this value is not set, chroot is not used.
    ; Note: you can prefix with '$prefix' to chroot to the pool prefix or one
    ; of its subdirectories. If the pool prefix is not set, the global prefix
    ; will be used instead.
    ; Note: chrooting is a great security feature and should be used whenever
    ;       possible. However, all PHP paths will be relative to the chroot
    ;       (error_log, sessions.save_path, ...).
    ; Default Value: not set
    ;chroot =
    
    ; Chdir to this directory at the start.
    ; Note: relative path can be used.
    ; Default Value: current directory or / when chroot
    ;chdir = /var/www
    
    ; Redirect worker stdout and stderr into main error log. If not set, stdout and
    ; stderr will be redirected to /dev/null according to FastCGI specs.
    ; Note: on highloaded environment, this can cause some delay in the page
    ; process time (several ms).
    ; Default Value: no
    ;catch_workers_output = yes
    
    ; Decorate worker output with prefix and suffix containing information about
    ; the child that writes to the log and if stdout or stderr is used as well as
    ; log level and time. This options is used only if catch_workers_output is yes.
    ; Settings to "no" will output data as written to the stdout or stderr.
    ; Default value: yes
    ;decorate_workers_output = no
    
    ; Clear environment in FPM workers
    ; Prevents arbitrary environment variables from reaching FPM worker processes
    ; by clearing the environment in workers before env vars specified in this
    ; pool configuration are added.
    ; Setting to "no" will make all environment variables available to PHP code
    ; via getenv(), $_ENV and $_SERVER.
    ; Default Value: yes
    ;clear_env = no
    
    ; Limits the extensions of the main script FPM will allow to parse. This can
    ; prevent configuration mistakes on the web server side. You should only limit
    ; FPM to .php extensions to prevent malicious users to use other extensions to
    ; execute php code.
    ; Note: set an empty value to allow all extensions.
    ; Default Value: .php
    ;security.limit_extensions = .php .php3 .php4 .php5 .php7
    
    ; Pass environment variables like LD_LIBRARY_PATH. All $VARIABLEs are taken from
    ; the current environment.
    ; Default Value: clean env
    ;env[HOSTNAME] = $HOSTNAME
    ;env[PATH] = /usr/local/bin:/usr/bin:/bin
    ;env[TMP] = /tmp
    ;env[TMPDIR] = /tmp
    ;env[TEMP] = /tmp
    
    ; Additional php.ini defines, specific to this pool of workers. These settings
    ; overwrite the values previously defined in the php.ini. The directives are the
    ; same as the PHP SAPI:
    ;   php_value/php_flag             - you can set classic ini defines which can
    ;                                    be overwritten from PHP call 'ini_set'.
    ;   php_admin_value/php_admin_flag - these directives won't be overwritten by
    ;                                     PHP call 'ini_set'
    ; For php_*flag, valid values are on, off, 1, 0, true, false, yes or no.
    
    ; Defining 'extension' will load the corresponding shared extension from
    ; extension_dir. Defining 'disable_functions' or 'disable_classes' will not
    ; overwrite previously defined php.ini values, but will append the new value
    ; instead.
    
    ; Note: path INI options can be relative and will be expanded with the prefix
    ; (pool, global or /data/app)
    
    ; Default Value: nothing is defined by default except the values in php.ini and
    ;                specified at startup with the -d argument
    ;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
    ;php_flag[display_errors] = off
    ;php_admin_value[error_log] = /var/log/fpm-php.www.log
    ;php_admin_flag[log_errors] = on
    ;php_admin_value[memory_limit] = 32M
    

    主要配置了prefix与listen两个字段,据说unix的socket比127.0.0.1方式更快一些,所以这儿用unix的socket。

    此时,再启动php-fpm.service时,就会提示:[pool nextcloud] cannot get uid for user 'http'错误,表示系统中无http用户。

    2.4 添加http用户及组

    使用useradd命令,同时添加http用户名及组名。

    sudo useradd -U http
    

    添加完成后,php-fpm.service即可启动正常。

    3. 配置并启动Nginx

    首先先做一个Nginx的最小配置,启动Nginx服务,以验证两Nginx与PHP-FPM的基本功能及互通。

    3.1 配置nginx.service文件

    配置nginx.service文件,并拷贝到/usr/lib/systemd/system/目录下,然后即可以系统服务方式启动Nginx

    [Unit]
    Description=A high performance web server and a reverse proxy server
    After=network.target network-online.target nss-lookup.target
    
    [Service]
    Type=forking
    PIDFile=/run/nginx.pid
    PrivateDevices=yes
    SyslogLevel=err
    
    ExecStart=/data/app/bin/nginx -g 'pid /run/nginx.pid; error_log stderr;'
    ExecReload=/data/app/bin/nginx -s reload
    KillMode=mixed
    
    [Install]
    WantedBy=multi-user.target
    

    此时启动nginx.service服务,会报类似如下错误:

    mkdir() "/var/lib/nginx/client-body" failed (2: No such file or directory)
    
    open() "/var/log/nginx/access.log" failed
    

    手工创建/var/lib/nginx与/var/log/nginx目录即可,创建完成后,再启动服务,则可以成功启动了。

    服务启动成功后,直接访问http://ip,即可看到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;
    
        #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;
        #    }
        #}
    
    }
    

    3.2 配置Nginx以集成PHP

    Nginx的配置官方文档链接:https://www.nginx.com/resources/wiki/start/

    配置方法参考archlinux的Nginx的配置说明:https://wiki.archlinux.org/title/Nginx,

    参考这儿的文档,修改Nginx.conf为如下:

    # 定义Nginx运行的用户和用户组,无用户组时默认组名与用户名相同
    user http;
    # nginx进程数,建议设置为等于CPU总核心数。
    worker_processes 2; # auto = 4;
    worker_cpu_affinity auto;
    
    events {
        multi_accept on;
        # 单个进程允许的客户端最大连接数(最大连接数=连接数*进程数)
        worker_connections 1024;
        # 使用epoll模型,linux建议epoll,如果跑在FreeBSD上面,就用kqueue模型
        use epoll;
    }
    
    http {
        # 文件扩展名与文件类型映射表
        include mime.types;
        # 默认文件类型
        default_type application/octet-stream;
        
        # 默认编码
        charset utf-8;
        # 开启高效文件传输模式
        sendfile on;
        # 减少网络报文段数量
        tcp_nopush on;
        # 提高I/O性能
        tcp_nodelay on;
        # 隐藏版本号
        server_tokens on;
        log_not_found off;
        types_hash_max_size 4096;
        # 上传文件的大小限制  默认1m
        client_max_body_size 256M;
        
        #连接超时 时间定义 默认秒 默认65秒
        #keepalive_timeout 60;
        #读取客户端请求头数据的超时时间 默认秒 默认60秒
        #client_header_timeout 15;
        #读取客户端请求主体的超时时间 默认秒 默认60秒
        #client_body_timeout 15;
        #响应客户端的超时时间 默认秒 默认60秒
        #send_timeout 25;
    
        # logging
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log warn;
    
        # load configs
        include /data/app/etc/nginx/conf.d/*.conf;
        # 在这儿虚拟主机
        include /data/app/etc/nginx/sites-enabled/*.server;
    }
    

    这儿就在/data/app/etc/nginx/conf.d/灵活增删.conf文件方式来调整整体配置,同时也支持/data/app/etc/nginx/sites-enabled/目录下面配置不同的站点(即vhosts)。与此同时,应该先创建三个目录:

    mkdir /data/app/etc/nginx/conf.d/
    mkdir /data/app/etc/nginx/sites-available/
    mkdir /data/app/etc/nginx/sites-enabled/
    

    在/data/app/etc/nginx/sites-available/创建一个php_baseserver文件,内容如下:

    #/data/app/etc/nginx/sites-available/php_baseserver
    server {
      listen 8000;
      server_name 192.168.1.30;
      root /data/nextcloud;
      location ~ \.php$ {
        root /data/nextcloud;
        fastcgi_pass  unix:/data/app/var/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
      }
    }
    

    在/data/app/etc/nginx/sites-enabled/创建一个链接指向/data/app/etc/nginx/sites-available/php_baseserver

    ln -s ../sites-available/php_baseserver php_base.server
    

    在/data/nextcloud目录下创建一个test.php文件,浏览器访问http://ip:8000/test.php以验证集成结果

    <?php phpinfo(); ?>
    

    正常情况下,即可以显示php-fpm的内部配置信息了。

    4. 配置nginx以支持nextcloud

    配置参考nextcloud的说明文档:https://docs.nextcloud.com/server/19/admin_manual/installation/nginx.html

    此文档中的两个例子均为https的,前期,我们仅需要支持http即可。

    注意,如果是解压方式安装的nextcloud,需要修改nextcloud的所有者、所有者群为http(web专有用户)。

    4.1以nextcloud为根方式的配置

    首先,根据网上的https配置方式,修改出了nextcloud_root.server的http配置。

    安装:将nextcloud解压到/data目录下,改nextcloud目录名为web,同时需要修改web目录下的lib/private/legacy/OC_Util.php中,注释掉libxml行。

    upstream php-handler {
        #server 127.0.0.1:9000;
        server unix:/data/app/var/php-fpm.sock;
    }
    
    server {
        listen 80;
        listen [::]:80;
        server_name 192.168.1.30;
    
        # Use Mozilla's guidelines for SSL/TLS settings
        # https://mozilla.github.io/server-side-tls/ssl-config-generator/
        # NOTE: some settings below might be redundant
        #ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
        #ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
    
        # Add headers to serve security related headers
        # Before enabling Strict-Transport-Security headers please read into this
        # topic first.
        #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;
    
        # Remove X-Powered-By, which is an information leak
        fastcgi_hide_header X-Powered-By;
    
        # Path to the root of your installation
        root /data/web;
    
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    
        # The following 2 rules are only needed for the user_webfinger app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
        #rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
    
        # The following rule is only needed for the Social app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/webfinger /public.php?service=webfinger last;
    
        location = /.well-known/carddav {
          return 301 $scheme://$host:$server_port/remote.php/dav;
        }
        location = /.well-known/caldav {
          return 301 $scheme://$host:$server_port/remote.php/dav;
        }
    
        # set max upload size
        client_max_body_size 512M;
        fastcgi_buffers 64 4K;
    
        # Enable gzip but do not remove ETag headers
        gzip on;
        gzip_vary on;
        gzip_comp_level 4;
        gzip_min_length 256;
        gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
        gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
        # Uncomment if your server is build with the ngx_pagespeed module
        # This module is currently not supported.
        #pagespeed off;
    
        location / {
            rewrite ^ /index.php;
        }
    
        location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
            deny all;
        }
        location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
            deny all;
        }
    
        location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
            fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
            set $path_info $fastcgi_path_info;
            try_files $fastcgi_script_name =404;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $path_info;
            fastcgi_param HTTPS off;
            # Avoid sending the security headers twice
            fastcgi_param modHeadersAvailable true;
            # Enable pretty urls
            fastcgi_param front_controller_active true;
            fastcgi_pass php-handler;
            fastcgi_intercept_errors on;
            fastcgi_request_buffering off;
        }
    
        location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) {
            try_files $uri/ =404;
            index index.php;
        }
    
        # Adding the cache control header for js, css and map files
        # Make sure it is BELOW the PHP block
        location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
            try_files $uri /index.php$request_uri;
            add_header Cache-Control "public, max-age=15778463";
            # Add headers to serve security related headers (It is intended to
            # have those duplicated to the ones above)
            # Before enabling Strict-Transport-Security headers please read into
            # this topic first.
            #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
            #
            # WARNING: Only add the preload option once you read about
            # the consequences in https://hstspreload.org/. This option
            # will add the domain to a hardcoded list that is shipped
            # in all major browsers and getting removed from this list
            # could take several months.
            add_header Referrer-Policy "no-referrer" always;
            add_header X-Content-Type-Options "nosniff" always;
            add_header X-Download-Options "noopen" always;
            add_header X-Frame-Options "SAMEORIGIN" always;
            add_header X-Permitted-Cross-Domain-Policies "none" always;
            add_header X-Robots-Tag "none" always;
            add_header X-XSS-Protection "1; mode=block" always;
    
            # Optional: Don't log access to assets
            access_log off;
        }
    
        location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
            try_files $uri /index.php$request_uri;
            # Optional: Don't log access to other assets
            access_log off;
        }
    }
    

    第一次启动nextcloud时,初始化配置会耗时较长,网页端会断掉,断掉后稍过一会儿,再访问根目录,即可登陆进入。

    4.2 以nextcloud为子目录方式的配置

    以nextcloud为子目录方式,配置网站的情况更为多见。因为这样,我们就可以在一个域名下支持多个子目录、子站点了。

    我们将https://docs.nextcloud.com/server/19/admin_manual/installation/nginx.html这儿的配置拆分成两个文件,一个是main.server,一个是nextcloud.location。

    main.server内容如下:

    upstream php-handler {
        #server 127.0.0.1:9000;
        server unix:/data/app/var/php-fpm.sock;
    }
    
    server {
        listen 80;
        listen [::]:80;
        server_name 192.168.1.30;
        #server_name cloud.example.com;
        # enforce https
        #return 301 https://$server_name:443$request_uri;
    
        # Use Mozilla's guidelines for SSL/TLS settings
        # https://mozilla.github.io/server-side-tls/ssl-config-generator/
        # NOTE: some settings below might be redundant
        #ssl_certificate /etc/ssl/nginx/cloud.example.com.crt;
        #ssl_certificate_key /etc/ssl/nginx/cloud.example.com.key;
    
        # Add headers to serve security related headers
        # Before enabling Strict-Transport-Security headers please read into this
        # topic first.
        #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
        #
        # WARNING: Only add the preload option once you read about
        # the consequences in https://hstspreload.org/. This option
        # will add the domain to a hardcoded list that is shipped
        # in all major browsers and getting removed from this list
        # could take several months.
        add_header Referrer-Policy "no-referrer" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header X-Download-Options "noopen" always;
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Permitted-Cross-Domain-Policies "none" always;
        add_header X-Robots-Tag "none" always;
        add_header X-XSS-Protection "1; mode=block" always;
    
        # Remove X-Powered-By, which is an information leak
        fastcgi_hide_header X-Powered-By;
    
        # Path to the root of your installation
        root /root/web;
    
        location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
        
        # 
        include /data/app/etc/nginx/sites-enabled/*.location;
    }
    

    nextcloud.location内容如下:

        # The following 2 rules are only needed for the user_webfinger app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/host-meta /nextcloud/public.php?service=host-meta last;
        #rewrite ^/.well-known/host-meta.json /netdisk/public.php?service=host-meta-json last;
    
        # The following rule is only needed for the Social app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/webfinger /netdisk/public.php?service=webfinger last;
    
        location = /.well-known/carddav {
          return 301 $scheme://$host:$server_port/netdisk/remote.php/dav;
        }
        location = /.well-known/caldav {
          return 301 $scheme://$host:$server_port/netdisk/remote.php/dav;
        }
    
        location /.well-known/acme-challenge { }
    
        location ^~ /netdisk {
    
            # set max upload size
            client_max_body_size 512M;
            fastcgi_buffers 64 4K;
    
            # Enable gzip but do not remove ETag headers
            #gzip on;
            #gzip_vary on;
            #gzip_comp_level 4;
            #gzip_min_length 256;
            #gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
            #gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
            # Uncomment if your server is build with the ngx_pagespeed module
            # This module is currently not supported.
            #pagespeed off;
    
            location /netdisk {
                rewrite ^ /netdisk/index.php;
            }
    
            location ~ ^\/netdisk\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
                deny all;
            }
            location ~ ^\/netdisk\/(?:\.|autotest|occ|issue|indie|db_|console) {
                deny all;
            }
    
            location ~ ^\/netdisk\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
                fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
                set $path_info $fastcgi_path_info;
                try_files $fastcgi_script_name =404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $path_info;
                fastcgi_param HTTPS off; # on;
                # Avoid sending the security headers twice
                fastcgi_param modHeadersAvailable true;
                # Enable pretty urls
                fastcgi_param front_controller_active true;
                fastcgi_pass php-handler;
                fastcgi_intercept_errors on;
                fastcgi_request_buffering off;
            }
    
            location ~ ^\/netdisk\/(?:updater|oc[ms]-provider)(?:$|\/) {
                try_files $uri/ =404;
                index index.php;
            }
    
            # Adding the cache control header for js, css and map files
            # Make sure it is BELOW the PHP block
            location ~ ^\/netdisk\/.+[^\/]\.(?:css|js|woff2?|svg|gif|map)$ {
                try_files $uri /netdisk/index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463";
                # Add headers to serve security related headers  (It is intended
                # to have those duplicated to the ones above)
                # Before enabling Strict-Transport-Security headers please read
                # into this topic first.
                #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
                #
                # WARNING: Only add the preload option once you read about
                # the consequences in https://hstspreload.org/. This option
                # will add the domain to a hardcoded list that is shipped
                # in all major browsers and getting removed from this list
                # could take several months.
                add_header Referrer-Policy "no-referrer" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header X-Download-Options "noopen" always;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-Permitted-Cross-Domain-Policies "none" always;
                add_header X-Robots-Tag "none" always;
                add_header X-XSS-Protection "1; mode=block" always;
    
                # Optional: Don't log access to assets
                access_log off;
            }
    
            location ~ ^\/netdisk\/.+[^\/]\.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
                try_files $uri /netdisk/index.php$request_uri;
                # Optional: Don't log access to other assets
                access_log off;
            }
        }
    

    5.nextcloud性能调优

    nextcloud很吃性能,而arm的盒子上,性能一般,因此需要对此稍做优化调效。

    5.1 关闭gzip压缩

        # The following 2 rules are only needed for the user_webfinger app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/host-meta /netdisk/public.php?service=host-meta last;
        #rewrite ^/.well-known/host-meta.json /netdisk/public.php?service=host-meta-json last;
    
        # The following rule is only needed for the Social app.
        # Uncomment it if you're planning to use this app.
        #rewrite ^/.well-known/webfinger /netdisk/public.php?service=webfinger last;
    
        location = /.well-known/carddav {
          return 301 $scheme://$host:$server_port/netdisk/remote.php/dav;
        }
        location = /.well-known/caldav {
          return 301 $scheme://$host:$server_port/netdisk/remote.php/dav;
        }
    
        location /.well-known/acme-challenge { }
    
        location ^~ /netdisk {
            # 任何以/netdisk开头的URI,都在这一个location解析(最终的解析)
        
            # 日志文件分开
            error_log     /var/log/nginx/netdisk.error.log;
            access_log    /var/log/nginx/netdisk.access.log;
    
            # set max upload size
            client_max_body_size 512M;
            fastcgi_buffers 64 4K;
    
            # Enable gzip but do not remove ETag headers
            # 服务器性能不佳,只好关闭gzip特性。
            # gzip on;
            #gzip_vary on;
            #gzip_comp_level 4;
            #gzip_min_length 256;
            #gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
            #gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
    
            # Uncomment if your server is build with the ngx_pagespeed module
            # This module is currently not supported.
            #pagespeed off;
    
            location  /netdisk {
                # 匹配任何以 /netdisk 开始的查询,但优先级最低。
                rewrite ^ /netdisk/index.php;
            }
    
            location ~ ^\/netdisk\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
                deny all;
            }
            location ~ ^\/netdisk\/(?:\.|autotest|occ|issue|indie|db_|console) {
                deny all;
            }
    
            location ~ ^\/netdisk\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+|.+\/richdocumentscode\/proxy)\.php(?:$|\/) {
                fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
                set $path_info $fastcgi_path_info;
                try_files $fastcgi_script_name =404;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $path_info;
                fastcgi_param HTTPS off; # on;
                # Avoid sending the security headers twice
                fastcgi_param modHeadersAvailable true;
                # Enable pretty urls
                fastcgi_param front_controller_active true;
                fastcgi_pass php-handler;
                fastcgi_intercept_errors on;
                fastcgi_request_buffering off;
            }
    
            location ~ ^\/netdisk\/(?:updater|oc[ms]-provider)(?:$|\/) {
                try_files $uri/ =404;
                index index.php;
            }
    
            # Adding the cache control header for js, css and map files
            # Make sure it is BELOW the PHP block
            location ~ ^\/netdisk\/.+[^\/]\.(?:css|js|woff2?|svg|gif|map)$ {
                try_files $uri /netdisk/index.php$request_uri;
                add_header Cache-Control "public, max-age=15778463";
                # Add headers to serve security related headers  (It is intended
                # to have those duplicated to the ones above)
                # Before enabling Strict-Transport-Security headers please read
                # into this topic first.
                #add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
                #
                # WARNING: Only add the preload option once you read about
                # the consequences in https://hstspreload.org/. This option
                # will add the domain to a hardcoded list that is shipped
                # in all major browsers and getting removed from this list
                # could take several months.
                add_header Referrer-Policy "no-referrer" always;
                add_header X-Content-Type-Options "nosniff" always;
                add_header X-Download-Options "noopen" always;
                add_header X-Frame-Options "SAMEORIGIN" always;
                add_header X-Permitted-Cross-Domain-Policies "none" always;
                add_header X-Robots-Tag "none" always;
                add_header X-XSS-Protection "1; mode=block" always;
    
                # Optional: Don't log access to assets
                access_log off;
            }
    
            location ~ ^\/netdisk\/.+[^\/]\.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ {
                try_files $uri /netdisk/index.php$request_uri;
                # Optional: Don't log access to other assets
                access_log off;
            }
        }
    

    5.2 启用后台cron

    nextcloud默认在每个页面结束时会调用检测一个cron定时任务,太过消耗性能,因此改为系统后台触发。注意:PHP需要有posix扩展。

    参考链接:https://www.himstudy.net/nextcloud性能优化-后台任务cron/

    编辑时,以如下命令编辑

    crontab -e -u http
    

    每15分钟,http用户执行一次cron任务。

    # m h  dom mon dow   command
    */15  *  *  *  * /data/app/bin/arm-himix200-linux-php -f /data/web/netdisk/cron.php
    

    系统通过systemctl status cron来查看crond服务的启动、使能状态。

    6. 内网穿透方式部署nextcloud

    在局域网内,nextcloud已经调试部署成功。想放到公网上,且不希望在公网的机器上重新部署一次,只能以内网穿透形式部署。

    在有公网IP的机器上,部署好frps,配置好相应参数,内网机器部署frpc,同时的公网IP的机器上开放相应端口。

    在互联网上,就可以访问nextcloud了,但是,会被报“出现Trusted domains错误”错误,搜索资料,解决办法是,将公网IP带开放的端口放入config/config.php文件中,如下:

      array (
              0 => '192.168.1.30',
              1 => '127.0.0.1',
              2 => 'xxx.yyy.zzz.225:ppp',
      ),
    
    

    这样,nextcloud的部署问题就解决了。

  • 相关阅读:
    苹果信息推送服务(Apple Push Notification Service)使用总结
    Xcode 相关路径总结
    微信红包随机算法 OC
    Xcode真机测试could not find developer disk image解决方法
    字典转模型 重写初始化方法
    Xcode 写代码没有补全提示解决:删缓存及显示隐藏文件命令
    按位与、或、异或等运算方法
    OC语言@property @synthesize和id
    iOS开发—Quartz2D简单介绍
    iOS开发—CoreLocation定位服务
  • 原文地址:https://www.cnblogs.com/eaglexmw/p/15603219.html
Copyright © 2011-2022 走看看